diff options
259 files changed, 6476 insertions, 4044 deletions
diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 570dc675a8..7145e628c1 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1199,6 +1199,10 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF_BASIC("audio/buses/default_bus_layout", "res://default_bus_layout.tres"); custom_prop_info["audio/buses/default_bus_layout"] = PropertyInfo(Variant::STRING, "audio/buses/default_bus_layout", PROPERTY_HINT_FILE, "*.tres"); + GLOBAL_DEF_RST("audio/general/2d_panning_strength", 1.0f); + custom_prop_info["audio/general/2d_panning_strength"] = PropertyInfo(Variant::FLOAT, "audio/general/2d_panning_strength", PROPERTY_HINT_RANGE, "0,4,0.01"); + GLOBAL_DEF_RST("audio/general/3d_panning_strength", 1.0f); + custom_prop_info["audio/general/3d_panning_strength"] = PropertyInfo(Variant::FLOAT, "audio/general/3d_panning_strength", PROPERTY_HINT_RANGE, "0,4,0.01"); PackedStringArray extensions = PackedStringArray(); extensions.push_back("gd"); diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 194c7fdefd..8fafc459e3 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -2076,9 +2076,9 @@ bool ClassDB::has_integer_constant(const StringName &p_class, const StringName & return success; } -int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name) const { +int64_t ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name) const { bool found; - int c = ::ClassDB::get_integer_constant(p_class, p_name, &found); + int64_t c = ::ClassDB::get_integer_constant(p_class, p_name, &found); ERR_FAIL_COND_V(!found, 0); return c; } diff --git a/core/core_bind.h b/core/core_bind.h index e4d15d5c9d..c2098b1b59 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -604,7 +604,7 @@ public: PackedStringArray get_integer_constant_list(const StringName &p_class, bool p_no_inheritance = false) const; bool has_integer_constant(const StringName &p_class, const StringName &p_name) const; - int get_integer_constant(const StringName &p_class, const StringName &p_name) const; + int64_t get_integer_constant(const StringName &p_class, const StringName &p_name) const; bool has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false) const; PackedStringArray get_enum_list(const StringName &p_class, bool p_no_inheritance = false) const; diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 3373f4f1e5..1f46223a1d 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -42,19 +42,19 @@ struct _CoreConstant { bool ignore_value_in_docs = false; #endif const char *name = nullptr; - int value = 0; + int64_t value = 0; _CoreConstant() {} #ifdef DEBUG_METHODS_ENABLED - _CoreConstant(const StringName &p_enum_name, const char *p_name, int p_value, bool p_ignore_value_in_docs = false) : + _CoreConstant(const StringName &p_enum_name, const char *p_name, int64_t p_value, bool p_ignore_value_in_docs = false) : enum_name(p_enum_name), ignore_value_in_docs(p_ignore_value_in_docs), name(p_name), value(p_value) { } #else - _CoreConstant(const char *p_name, int p_value) : + _CoreConstant(const char *p_name, int64_t p_value) : name(p_name), value(p_value) { } @@ -73,13 +73,13 @@ static Vector<_CoreConstant> _global_constants; // This just binds enum classes as if they were regular enum constants. #define BIND_CORE_ENUM_CLASS_CONSTANT(m_enum, m_prefix, m_member) \ - _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int)m_enum::m_member)); + _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int64_t)m_enum::m_member)); #define BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(m_enum, m_name, m_member) \ - _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_name), #m_name, (int)m_enum::m_member)); + _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_name), #m_name, (int64_t)m_enum::m_member)); #define BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(m_enum, m_prefix, m_member) \ - _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int)m_enum::m_member, true)); + _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int64_t)m_enum::m_member, true)); #define BIND_CORE_ENUM_CONSTANT_CUSTOM(m_custom_name, m_constant) \ _global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_constant, #m_constant), m_custom_name, m_constant)); @@ -103,13 +103,13 @@ static Vector<_CoreConstant> _global_constants; // This just binds enum classes as if they were regular enum constants. #define BIND_CORE_ENUM_CLASS_CONSTANT(m_enum, m_prefix, m_member) \ - _global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int)m_enum::m_member)); + _global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int64_t)m_enum::m_member)); #define BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(m_enum, m_name, m_member) \ - _global_constants.push_back(_CoreConstant(#m_name, (int)m_enum::m_member)); + _global_constants.push_back(_CoreConstant(#m_name, (int64_t)m_enum::m_member)); #define BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(m_enum, m_prefix, m_member) \ - _global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int)m_enum::m_member)); + _global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int64_t)m_enum::m_member)); #define BIND_CORE_ENUM_CONSTANT_CUSTOM(m_custom_name, m_constant) \ _global_constants.push_back(_CoreConstant(m_custom_name, m_constant)); @@ -213,6 +213,25 @@ void register_global_constants() { BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F14); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F15); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F16); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F17); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F18); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F19); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F20); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F21); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F22); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F23); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F24); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F25); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F26); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F27); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F28); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F29); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F30); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F31); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F32); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F33); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F34); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F35); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_MULTIPLY); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_DIVIDE); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_SUBTRACT); @@ -754,6 +773,6 @@ const char *CoreConstants::get_global_constant_name(int p_idx) { return _global_constants[p_idx].name; } -int CoreConstants::get_global_constant_value(int p_idx) { +int64_t CoreConstants::get_global_constant_value(int p_idx) { return _global_constants[p_idx].value; } diff --git a/core/core_constants.h b/core/core_constants.h index 9302c23959..d5b3b156b2 100644 --- a/core/core_constants.h +++ b/core/core_constants.h @@ -39,7 +39,7 @@ public: static StringName get_global_constant_enum(int p_idx); static bool get_ignore_value_in_docs(int p_idx); static const char *get_global_constant_name(int p_idx); - static int get_global_constant_value(int p_idx); + static int64_t get_global_constant_value(int p_idx); }; #endif // GLOBAL_CONSTANTS_H diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 9e8addf8aa..edd48cf9cd 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -334,14 +334,14 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { { // Global enums and constants. Array constants; - HashMap<String, List<Pair<String, int>>> enum_list; + HashMap<String, List<Pair<String, int64_t>>> enum_list; for (int i = 0; i < CoreConstants::get_global_constant_count(); i++) { - int value = CoreConstants::get_global_constant_value(i); + int64_t value = CoreConstants::get_global_constant_value(i); String enum_name = CoreConstants::get_global_constant_enum(i); String name = CoreConstants::get_global_constant_name(i); if (!enum_name.is_empty()) { - enum_list[enum_name].push_back(Pair<String, int>(name, value)); + enum_list[enum_name].push_back(Pair<String, int64_t>(name, value)); } else { Dictionary d; d["name"] = name; @@ -353,11 +353,11 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { api_dump["global_constants"] = constants; Array enums; - for (const KeyValue<String, List<Pair<String, int>>> &E : enum_list) { + for (const KeyValue<String, List<Pair<String, int64_t>>> &E : enum_list) { Dictionary d1; d1["name"] = E.key; Array values; - for (const Pair<String, int> &F : E.value) { + for (const Pair<String, int64_t> &F : E.value) { Dictionary d2; d2["name"] = F.first; d2["value"] = F.second; diff --git a/core/extension/native_extension.cpp b/core/extension/native_extension.cpp index ac9d2ca8a6..ebdfa20725 100644 --- a/core/extension/native_extension.cpp +++ b/core/extension/native_extension.cpp @@ -281,6 +281,7 @@ void NativeExtension::_get_library_path(const GDNativeExtensionClassLibraryPtr p Error NativeExtension::open_library(const String &p_path, const String &p_entry_symbol) { Error err = OS::get_singleton()->open_dynamic_library(p_path, library, true, &library_path); if (err != OK) { + ERR_PRINT("GDExtension dynamic library not found: " + p_path); return err; } @@ -289,6 +290,7 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_ err = OS::get_singleton()->get_dynamic_library_symbol_handle(library, p_entry_symbol, entry_funcptr, false); if (err != OK) { + ERR_PRINT("GDExtension entry point '" + p_entry_symbol + "' not found in library " + p_path); OS::get_singleton()->close_dynamic_library(library); return err; } @@ -299,6 +301,7 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_ level_initialized = -1; return OK; } else { + ERR_PRINT("GDExtension initialization function '" + p_entry_symbol + "' returned an error."); return FAILED; } } @@ -387,6 +390,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St } if (err != OK) { + ERR_PRINT("Error loading GDExtension config file: " + p_path); return Ref<Resource>(); } @@ -394,6 +398,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St if (r_error) { *r_error = ERR_INVALID_DATA; } + ERR_PRINT("GDExtension config file must contain 'configuration.entry_symbol' key: " + p_path); return Ref<Resource>(); } @@ -426,6 +431,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St if (r_error) { *r_error = ERR_FILE_NOT_FOUND; } + ERR_PRINT("No GDExtension library found for current architecture; in config file " + p_path); return Ref<Resource>(); } @@ -443,6 +449,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St } if (err != OK) { + // Errors already logged in open_library() return Ref<Resource>(); } diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index 19a0cce796..e656f6b885 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -84,8 +84,8 @@ private: return (a == p_val.a) && (b == p_val.b); } static uint32_t hash(const PathMD5 &p_val) { - uint32_t h = hash_djb2_one_32(p_val.a); - return hash_djb2_one_32(p_val.b, h); + uint32_t h = hash_murmur3_one_32(p_val.a); + return hash_fmix32(hash_murmur3_one_32(p_val.b, h)); } PathMD5() {} diff --git a/core/io/resource.cpp b/core/io/resource.cpp index ad01eb1083..ed7228d0b9 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -100,14 +100,14 @@ String Resource::generate_scene_unique_id() { // 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(); - uint32_t hash = hash_djb2_one_32(OS::get_singleton()->get_ticks_usec()); - hash = hash_djb2_one_32(date.year, hash); - hash = hash_djb2_one_32(date.month, hash); - hash = hash_djb2_one_32(date.day, hash); - hash = hash_djb2_one_32(time.hour, hash); - hash = hash_djb2_one_32(time.minute, hash); - hash = hash_djb2_one_32(time.second, hash); - hash = hash_djb2_one_32(Math::rand(), hash); + 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(Math::rand(), hash); static constexpr uint32_t characters = 5; static constexpr uint32_t char_count = ('z' - 'a'); @@ -328,7 +328,7 @@ void Resource::notify_change_to_owners() { #ifdef TOOLS_ENABLED uint32_t Resource::hash_edited_version() const { - uint32_t hash = hash_djb2_one_32(get_edited_version()); + uint32_t hash = hash_murmur3_one_32(get_edited_version()); List<PropertyInfo> plist; get_property_list(&plist); @@ -337,7 +337,7 @@ uint32_t Resource::hash_edited_version() const { if (E.usage & PROPERTY_USAGE_STORAGE && E.type == Variant::OBJECT && E.hint == PROPERTY_HINT_RESOURCE_TYPE) { Ref<Resource> res = get(E.name); if (res.is_valid()) { - hash = hash_djb2_one_32(res->hash_edited_version(), hash); + hash = hash_murmur3_one_32(res->hash_edited_version(), hash); } } } diff --git a/core/math/audio_frame.h b/core/math/audio_frame.h index 8b244e9fe4..b3d63c0094 100644 --- a/core/math/audio_frame.h +++ b/core/math/audio_frame.h @@ -52,7 +52,7 @@ static const float AUDIO_MIN_PEAK_DB = -200.0f; // linear2db(AUDIO_PEAK_OFFSET) struct AudioFrame { //left and right samples - float l, r; + float l = 0.f, r = 0.f; _ALWAYS_INLINE_ const float &operator[](int idx) const { return idx == 0 ? l : r; } _ALWAYS_INLINE_ float &operator[](int idx) { return idx == 0 ? l : r; } diff --git a/core/math/delaunay_3d.h b/core/math/delaunay_3d.h index f8a10ec87e..4ab00e1f34 100644 --- a/core/math/delaunay_3d.h +++ b/core/math/delaunay_3d.h @@ -101,7 +101,7 @@ class Delaunay3D { _FORCE_INLINE_ static uint32_t hash(const Triangle &p_triangle) { uint32_t h = hash_djb2_one_32(p_triangle.triangle[0]); h = hash_djb2_one_32(p_triangle.triangle[1], h); - return hash_djb2_one_32(p_triangle.triangle[2], h); + return hash_fmix32(hash_djb2_one_32(p_triangle.triangle[2], h)); } }; diff --git a/core/multiplayer/multiplayer_peer.cpp b/core/multiplayer/multiplayer_peer.cpp index ae3b139bcc..b262903ce8 100644 --- a/core/multiplayer/multiplayer_peer.cpp +++ b/core/multiplayer/multiplayer_peer.cpp @@ -36,17 +36,18 @@ uint32_t MultiplayerPeer::generate_unique_id() const { uint32_t hash = 0; while (hash == 0 || hash == 1) { - hash = hash_djb2_one_32( + hash = hash_murmur3_one_32( (uint32_t)OS::get_singleton()->get_ticks_usec()); - hash = hash_djb2_one_32( + hash = hash_murmur3_one_32( (uint32_t)OS::get_singleton()->get_unix_time(), hash); - hash = hash_djb2_one_32( + hash = hash_murmur3_one_32( (uint32_t)OS::get_singleton()->get_user_data_dir().hash64(), hash); - hash = hash_djb2_one_32( + hash = hash_murmur3_one_32( (uint32_t)((uint64_t)this), hash); // Rely on ASLR heap - hash = hash_djb2_one_32( + hash = hash_murmur3_one_32( (uint32_t)((uint64_t)&hash), hash); // Rely on ASLR stack + hash = hash_fmix32(hash); hash = hash & 0x7FFFFFFF; // Make it compatible with unsigned, since negative ID is used for exclusion } diff --git a/core/object/callable_method_pointer.cpp b/core/object/callable_method_pointer.cpp index 1bf926cafc..81f8ab6be2 100644 --- a/core/object/callable_method_pointer.cpp +++ b/core/object/callable_method_pointer.cpp @@ -85,9 +85,9 @@ void CallableCustomMethodPointerBase::_setup(uint32_t *p_base_ptr, uint32_t p_pt // Precompute hash. for (uint32_t i = 0; i < comp_size; i++) { if (i == 0) { - h = hash_djb2_one_32(comp_ptr[i]); + h = hash_murmur3_one_32(comp_ptr[i]); } else { - h = hash_djb2_one_32(comp_ptr[i], h); + h = hash_murmur3_one_32(comp_ptr[i], h); } } } diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp index f61bd24efd..3c9f373d12 100644 --- a/core/object/class_db.cpp +++ b/core/object/class_db.cpp @@ -164,7 +164,7 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { OBJTYPE_RLOCK; #ifdef DEBUG_METHODS_ENABLED - uint64_t hash = hash_djb2_one_64(HashMapHasherDefault::hash(VERSION_FULL_CONFIG)); + uint64_t hash = hash_murmur3_one_64(HashMapHasherDefault::hash(VERSION_FULL_CONFIG)); List<StringName> class_list; ClassDB::get_class_list(&class_list); @@ -177,8 +177,8 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { if (t->api != p_api || !t->exposed) { continue; } - hash = hash_djb2_one_64(t->name.hash(), hash); - hash = hash_djb2_one_64(t->inherits.hash(), hash); + hash = hash_murmur3_one_64(t->name.hash(), hash); + hash = hash_murmur3_one_64(t->inherits.hash(), hash); { //methods @@ -200,27 +200,27 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { for (const StringName &F : snames) { MethodBind *mb = t->method_map[F]; - hash = hash_djb2_one_64(mb->get_name().hash(), hash); - hash = hash_djb2_one_64(mb->get_argument_count(), hash); - hash = hash_djb2_one_64(mb->get_argument_type(-1), hash); //return + hash = hash_murmur3_one_64(mb->get_name().hash(), hash); + hash = hash_murmur3_one_64(mb->get_argument_count(), hash); + hash = hash_murmur3_one_64(mb->get_argument_type(-1), hash); //return for (int i = 0; i < mb->get_argument_count(); i++) { const PropertyInfo info = mb->get_argument_info(i); - hash = hash_djb2_one_64(info.type, hash); - hash = hash_djb2_one_64(info.name.hash(), hash); - hash = hash_djb2_one_64(info.hint, hash); - hash = hash_djb2_one_64(info.hint_string.hash(), hash); + hash = hash_murmur3_one_64(info.type, hash); + hash = hash_murmur3_one_64(info.name.hash(), hash); + hash = hash_murmur3_one_64(info.hint, hash); + hash = hash_murmur3_one_64(info.hint_string.hash(), hash); } - hash = hash_djb2_one_64(mb->get_default_argument_count(), hash); + hash = hash_murmur3_one_64(mb->get_default_argument_count(), hash); for (int i = 0; i < mb->get_default_argument_count(); i++) { //hash should not change, i hope for tis Variant da = mb->get_default_argument(i); - hash = hash_djb2_one_64(da.hash(), hash); + hash = hash_murmur3_one_64(da.hash(), hash); } - hash = hash_djb2_one_64(mb->get_hint_flags(), hash); + hash = hash_murmur3_one_64(mb->get_hint_flags(), hash); } } @@ -228,15 +228,15 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { List<StringName> snames; - for (const KeyValue<StringName, int> &F : t->constant_map) { + for (const KeyValue<StringName, int64_t> &F : t->constant_map) { snames.push_back(F.key); } snames.sort_custom<StringName::AlphCompare>(); for (const StringName &F : snames) { - hash = hash_djb2_one_64(F.hash(), hash); - hash = hash_djb2_one_64(t->constant_map[F], hash); + hash = hash_murmur3_one_64(F.hash(), hash); + hash = hash_murmur3_one_64(t->constant_map[F], hash); } } @@ -252,9 +252,9 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { for (const StringName &F : snames) { MethodInfo &mi = t->signal_map[F]; - hash = hash_djb2_one_64(F.hash(), hash); + hash = hash_murmur3_one_64(F.hash(), hash); for (int i = 0; i < mi.arguments.size(); i++) { - hash = hash_djb2_one_64(mi.arguments[i].type, hash); + hash = hash_murmur3_one_64(mi.arguments[i].type, hash); } } } @@ -273,23 +273,23 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { PropertySetGet *psg = t->property_setget.getptr(F); ERR_FAIL_COND_V(!psg, 0); - hash = hash_djb2_one_64(F.hash(), hash); - hash = hash_djb2_one_64(psg->setter.hash(), hash); - hash = hash_djb2_one_64(psg->getter.hash(), hash); + hash = hash_murmur3_one_64(F.hash(), hash); + hash = hash_murmur3_one_64(psg->setter.hash(), hash); + hash = hash_murmur3_one_64(psg->getter.hash(), hash); } } //property list for (const PropertyInfo &F : t->property_list) { - hash = hash_djb2_one_64(F.name.hash(), hash); - hash = hash_djb2_one_64(F.type, hash); - hash = hash_djb2_one_64(F.hint, hash); - hash = hash_djb2_one_64(F.hint_string.hash(), hash); - hash = hash_djb2_one_64(F.usage, hash); + hash = hash_murmur3_one_64(F.name.hash(), hash); + hash = hash_murmur3_one_64(F.type, hash); + hash = hash_murmur3_one_64(F.hint, hash); + hash = hash_murmur3_one_64(F.hint_string.hash(), hash); + hash = hash_murmur3_one_64(F.usage, hash); } } - return hash; + return hash_fmix32(hash); #else return 0; #endif @@ -536,7 +536,7 @@ MethodBind *ClassDB::get_method(const StringName &p_class, const StringName &p_n return nullptr; } -void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant) { +void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int64_t p_constant) { OBJTYPE_WLOCK; ClassInfo *type = classes.getptr(p_class); @@ -583,7 +583,7 @@ void ClassDB::get_integer_constant_list(const StringName &p_class, List<String> } #else - for (const KeyValue<StringName, int> &E : type->constant_map) { + for (const KeyValue<StringName, int64_t> &E : type->constant_map) { p_constants->push_back(E.key); } @@ -596,13 +596,13 @@ void ClassDB::get_integer_constant_list(const StringName &p_class, List<String> } } -int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success) { +int64_t ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success) { OBJTYPE_RLOCK; ClassInfo *type = classes.getptr(p_class); while (type) { - int *constant = type->constant_map.getptr(p_name); + int64_t *constant = type->constant_map.getptr(p_name); if (constant) { if (p_success) { *p_success = true; @@ -1066,7 +1066,7 @@ bool ClassDB::get_property(Object *p_object, const StringName &p_property, Varia return true; } - const int *c = check->constant_map.getptr(p_property); //constants count + const int64_t *c = check->constant_map.getptr(p_property); //constants count if (c) { r_value = *c; return true; diff --git a/core/object/class_db.h b/core/object/class_db.h index 2448a86e33..f2f73dc674 100644 --- a/core/object/class_db.h +++ b/core/object/class_db.h @@ -103,7 +103,7 @@ public: ObjectNativeExtension *native_extension = nullptr; HashMap<StringName, MethodBind *> method_map; - HashMap<StringName, int> constant_map; + HashMap<StringName, int64_t> constant_map; HashMap<StringName, List<StringName>> enum_map; HashMap<StringName, MethodInfo> signal_map; List<PropertyInfo> property_list; @@ -325,9 +325,9 @@ public: static void add_virtual_method(const StringName &p_class, const MethodInfo &p_method, bool p_virtual = true, const Vector<String> &p_arg_names = Vector<String>(), bool p_object_core = false); static void get_virtual_methods(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false); - static void bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant); + static void bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int64_t p_constant); static void get_integer_constant_list(const StringName &p_class, List<String> *p_constants, bool p_no_inheritance = false); - static int get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success = nullptr); + static int64_t get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success = nullptr); static bool has_integer_constant(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false); static StringName get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false); diff --git a/core/object/method_bind.cpp b/core/object/method_bind.cpp index a208c1a2b2..a4474ea53b 100644 --- a/core/object/method_bind.cpp +++ b/core/object/method_bind.cpp @@ -35,32 +35,27 @@ #include "method_bind.h" uint32_t MethodBind::get_hash() const { - uint32_t hash = hash_djb2_one_32(has_return() ? 1 : 0); - hash = hash_djb2_one_32(get_argument_count(), hash); - -#ifndef _MSC_VER -#warning This needs proper class name and argument type for hashing -#endif -#if 0 + uint32_t hash = hash_murmur3_one_32(has_return() ? 1 : 0); + hash = hash_murmur3_one_32(get_argument_count(), hash); for (int i = (has_return() ? -1 : 0); i < get_argument_count(); i++) { PropertyInfo pi = i == -1 ? get_return_info() : get_argument_info(i); - hash = hash_djb2_one_32(get_argument_type(i), hash); + hash = hash_murmur3_one_32(get_argument_type(i), hash); if (pi.class_name != StringName()) { - hash = hash_djb2_one_32(pi.class_name.operator String().hash(), hash); + hash = hash_murmur3_one_32(pi.class_name.operator String().hash(), hash); } } -#endif - hash = hash_djb2_one_32(get_default_argument_count(), hash); + + hash = hash_murmur3_one_32(get_default_argument_count(), hash); for (int i = 0; i < get_default_argument_count(); i++) { Variant v = get_default_argument(i); - hash = hash_djb2_one_32(v.hash(), hash); + hash = hash_murmur3_one_32(v.hash(), hash); } - hash = hash_djb2_one_32(is_const(), hash); - hash = hash_djb2_one_32(is_vararg(), hash); + hash = hash_murmur3_one_32(is_const(), hash); + hash = hash_murmur3_one_32(is_vararg(), hash); - return hash; + return hash_fmix32(hash); } PropertyInfo MethodBind::get_argument_info(int p_argument) const { diff --git a/core/object/object.cpp b/core/object/object.cpp index 9dec417b11..96469db8c6 100644 --- a/core/object/object.cpp +++ b/core/object/object.cpp @@ -209,6 +209,17 @@ MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const arguments.push_back(p_param5); } +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6) : + name(p_name), + flags(METHOD_FLAG_NORMAL) { + arguments.push_back(p_param1); + arguments.push_back(p_param2); + arguments.push_back(p_param3); + arguments.push_back(p_param4); + arguments.push_back(p_param5); + arguments.push_back(p_param6); +} + MethodInfo::MethodInfo(Variant::Type ret) : flags(METHOD_FLAG_NORMAL) { return_val.type = ret; @@ -265,6 +276,18 @@ MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyIn arguments.push_back(p_param5); } +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6) : + name(p_name), + flags(METHOD_FLAG_NORMAL) { + return_val.type = ret; + arguments.push_back(p_param1); + arguments.push_back(p_param2); + arguments.push_back(p_param3); + arguments.push_back(p_param4); + arguments.push_back(p_param5); + arguments.push_back(p_param6); +} + MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name) : name(p_name), return_val(p_ret), @@ -316,6 +339,18 @@ MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const Pr arguments.push_back(p_param5); } +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL) { + arguments.push_back(p_param1); + arguments.push_back(p_param2); + arguments.push_back(p_param3); + arguments.push_back(p_param4); + arguments.push_back(p_param5); + arguments.push_back(p_param6); +} + Object::Connection::operator Variant() const { Dictionary d; d["signal"] = signal; diff --git a/core/object/object.h b/core/object/object.h index d0c6c0cb01..02dd875acf 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -226,6 +226,7 @@ struct MethodInfo { MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3); MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4); MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5); + MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6); MethodInfo(Variant::Type ret); MethodInfo(Variant::Type ret, const String &p_name); MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1); @@ -233,12 +234,14 @@ struct MethodInfo { MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3); MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4); MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5); + MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6); MethodInfo(const PropertyInfo &p_ret, const String &p_name); MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1); MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2); MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3); MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4); MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5); + MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5, const PropertyInfo &p_param6); }; // API used to extend in GDNative and other C compatible compiled languages. diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp index 24907d34c8..3e690991d9 100644 --- a/core/os/keyboard.cpp +++ b/core/os/keyboard.cpp @@ -86,6 +86,25 @@ static const _KeyCodeText _keycodes[] = { {Key::F14 ,"F14"}, {Key::F15 ,"F15"}, {Key::F16 ,"F16"}, + {Key::F17 ,"F17"}, + {Key::F18 ,"F18"}, + {Key::F19 ,"F19"}, + {Key::F20 ,"F20"}, + {Key::F21 ,"F21"}, + {Key::F22 ,"F22"}, + {Key::F23 ,"F23"}, + {Key::F24 ,"F24"}, + {Key::F25 ,"F25"}, + {Key::F26 ,"F26"}, + {Key::F27 ,"F27"}, + {Key::F28 ,"F28"}, + {Key::F29 ,"F29"}, + {Key::F30 ,"F30"}, + {Key::F31 ,"F31"}, + {Key::F32 ,"F32"}, + {Key::F33 ,"F33"}, + {Key::F34 ,"F34"}, + {Key::F35 ,"F35"}, {Key::KP_MULTIPLY ,"Kp Multiply"}, {Key::KP_DIVIDE ,"Kp Divide"}, {Key::KP_SUBTRACT ,"Kp Subtract"}, @@ -333,6 +352,25 @@ bool keycode_has_unicode(Key p_keycode) { case Key::F14: case Key::F15: case Key::F16: + case Key::F17: + case Key::F18: + case Key::F19: + case Key::F20: + case Key::F21: + case Key::F22: + case Key::F23: + case Key::F24: + case Key::F25: + case Key::F26: + case Key::F27: + case Key::F28: + case Key::F29: + case Key::F30: + case Key::F31: + case Key::F32: + case Key::F33: + case Key::F34: + case Key::F35: case Key::SUPER_L: case Key::SUPER_R: case Key::MENU: diff --git a/core/os/keyboard.h b/core/os/keyboard.h index 3176a8a210..517a53e505 100644 --- a/core/os/keyboard.h +++ b/core/os/keyboard.h @@ -85,6 +85,25 @@ enum class Key { F14 = SPECIAL | 0x29, F15 = SPECIAL | 0x2A, F16 = SPECIAL | 0x2B, + F17 = SPECIAL | 0x2C, + F18 = SPECIAL | 0x2D, + F19 = SPECIAL | 0x2E, + F20 = SPECIAL | 0x2F, + F21 = SPECIAL | 0x30, + F22 = SPECIAL | 0x31, + F23 = SPECIAL | 0x32, + F24 = SPECIAL | 0x33, + F25 = SPECIAL | 0x34, + F26 = SPECIAL | 0x35, + F27 = SPECIAL | 0x36, + F28 = SPECIAL | 0x37, + F29 = SPECIAL | 0x38, + F30 = SPECIAL | 0x39, + F31 = SPECIAL | 0x3A, + F32 = SPECIAL | 0x3B, + F33 = SPECIAL | 0x3C, + F34 = SPECIAL | 0x3D, + F35 = SPECIAL | 0x3E, KP_MULTIPLY = SPECIAL | 0x81, KP_DIVIDE = SPECIAL | 0x82, KP_SUBTRACT = SPECIAL | 0x83, @@ -100,54 +119,54 @@ enum class Key { KP_7 = SPECIAL | 0x8D, KP_8 = SPECIAL | 0x8E, KP_9 = SPECIAL | 0x8F, - SUPER_L = SPECIAL | 0x2C, - SUPER_R = SPECIAL | 0x2D, - MENU = SPECIAL | 0x2E, - HYPER_L = SPECIAL | 0x2F, - HYPER_R = SPECIAL | 0x30, - HELP = SPECIAL | 0x31, - DIRECTION_L = SPECIAL | 0x32, - DIRECTION_R = SPECIAL | 0x33, - BACK = SPECIAL | 0x40, - FORWARD = SPECIAL | 0x41, - STOP = SPECIAL | 0x42, - REFRESH = SPECIAL | 0x43, - VOLUMEDOWN = SPECIAL | 0x44, - VOLUMEMUTE = SPECIAL | 0x45, - VOLUMEUP = SPECIAL | 0x46, - BASSBOOST = SPECIAL | 0x47, - BASSUP = SPECIAL | 0x48, - BASSDOWN = SPECIAL | 0x49, - TREBLEUP = SPECIAL | 0x4A, - TREBLEDOWN = SPECIAL | 0x4B, - MEDIAPLAY = SPECIAL | 0x4C, - MEDIASTOP = SPECIAL | 0x4D, - MEDIAPREVIOUS = SPECIAL | 0x4E, - MEDIANEXT = SPECIAL | 0x4F, - MEDIARECORD = SPECIAL | 0x50, - HOMEPAGE = SPECIAL | 0x51, - FAVORITES = SPECIAL | 0x52, - SEARCH = SPECIAL | 0x53, - STANDBY = SPECIAL | 0x54, - OPENURL = SPECIAL | 0x55, - LAUNCHMAIL = SPECIAL | 0x56, - LAUNCHMEDIA = SPECIAL | 0x57, - LAUNCH0 = SPECIAL | 0x58, - LAUNCH1 = SPECIAL | 0x59, - LAUNCH2 = SPECIAL | 0x5A, - LAUNCH3 = SPECIAL | 0x5B, - LAUNCH4 = SPECIAL | 0x5C, - LAUNCH5 = SPECIAL | 0x5D, - LAUNCH6 = SPECIAL | 0x5E, - LAUNCH7 = SPECIAL | 0x5F, - LAUNCH8 = SPECIAL | 0x60, - LAUNCH9 = SPECIAL | 0x61, - LAUNCHA = SPECIAL | 0x62, - LAUNCHB = SPECIAL | 0x63, - LAUNCHC = SPECIAL | 0x64, - LAUNCHD = SPECIAL | 0x65, - LAUNCHE = SPECIAL | 0x66, - LAUNCHF = SPECIAL | 0x67, + SUPER_L = SPECIAL | 0x40, + SUPER_R = SPECIAL | 0x41, + MENU = SPECIAL | 0x42, + HYPER_L = SPECIAL | 0x43, + HYPER_R = SPECIAL | 0x44, + HELP = SPECIAL | 0x45, + DIRECTION_L = SPECIAL | 0x46, + DIRECTION_R = SPECIAL | 0x47, + BACK = SPECIAL | 0x48, + FORWARD = SPECIAL | 0x49, + STOP = SPECIAL | 0x4A, + REFRESH = SPECIAL | 0x4B, + VOLUMEDOWN = SPECIAL | 0x4C, + VOLUMEMUTE = SPECIAL | 0x4D, + VOLUMEUP = SPECIAL | 0x4E, + BASSBOOST = SPECIAL | 0x4F, + BASSUP = SPECIAL | 0x50, + BASSDOWN = SPECIAL | 0x51, + TREBLEUP = SPECIAL | 0x52, + TREBLEDOWN = SPECIAL | 0x53, + MEDIAPLAY = SPECIAL | 0x54, + MEDIASTOP = SPECIAL | 0x55, + MEDIAPREVIOUS = SPECIAL | 0x56, + MEDIANEXT = SPECIAL | 0x57, + MEDIARECORD = SPECIAL | 0x58, + HOMEPAGE = SPECIAL | 0x59, + FAVORITES = SPECIAL | 0x5A, + SEARCH = SPECIAL | 0x5B, + STANDBY = SPECIAL | 0x5C, + OPENURL = SPECIAL | 0x5D, + LAUNCHMAIL = SPECIAL | 0x5E, + LAUNCHMEDIA = SPECIAL | 0x5F, + LAUNCH0 = SPECIAL | 0x60, + LAUNCH1 = SPECIAL | 0x61, + LAUNCH2 = SPECIAL | 0x62, + LAUNCH3 = SPECIAL | 0x63, + LAUNCH4 = SPECIAL | 0x64, + LAUNCH5 = SPECIAL | 0x65, + LAUNCH6 = SPECIAL | 0x66, + LAUNCH7 = SPECIAL | 0x67, + LAUNCH8 = SPECIAL | 0x68, + LAUNCH9 = SPECIAL | 0x69, + LAUNCHA = SPECIAL | 0x6A, + LAUNCHB = SPECIAL | 0x6B, + LAUNCHC = SPECIAL | 0x6C, + LAUNCHD = SPECIAL | 0x6D, + LAUNCHE = SPECIAL | 0x6E, + LAUNCHF = SPECIAL | 0x6F, UNKNOWN = SPECIAL | 0xFFFFFF, diff --git a/core/templates/hashfuncs.h b/core/templates/hashfuncs.h index 98ff7fa4ce..b0371f2ab5 100644 --- a/core/templates/hashfuncs.h +++ b/core/templates/hashfuncs.h @@ -62,7 +62,7 @@ static _FORCE_INLINE_ uint32_t hash_djb2(const char *p_cstr) { uint32_t c; while ((c = *chr++)) { - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + hash = ((hash << 5) + hash) ^ c; /* hash * 33 ^ c */ } return hash; @@ -72,14 +72,14 @@ static _FORCE_INLINE_ uint32_t hash_djb2_buffer(const uint8_t *p_buff, int p_len uint32_t hash = p_prev; for (int i = 0; i < p_len; i++) { - hash = ((hash << 5) + hash) + p_buff[i]; /* hash * 33 + c */ + hash = ((hash << 5) + hash) ^ p_buff[i]; /* hash * 33 + c */ } return hash; } static _FORCE_INLINE_ uint32_t hash_djb2_one_32(uint32_t p_in, uint32_t p_prev = 5381) { - return ((p_prev << 5) + p_prev) + p_in; + return ((p_prev << 5) + p_prev) ^ p_in; } /** @@ -100,14 +100,76 @@ static _FORCE_INLINE_ uint32_t hash_one_uint64(const uint64_t p_int) { return uint32_t(v); } +#define HASH_MURMUR3_SEED 0x7F07C65 // Murmurhash3 32-bit version. // All MurmurHash versions are public domain software, and the author disclaims all copyright to their code. -static _FORCE_INLINE_ uint32_t rotl32(uint32_t x, int8_t r) { +static _FORCE_INLINE_ uint32_t hash_murmur3_one_32(uint32_t p_in, uint32_t p_seed = HASH_MURMUR3_SEED) { + p_in *= 0xcc9e2d51; + p_in = (p_in << 15) | (p_in >> 17); + p_in *= 0x1b873593; + + p_seed ^= p_in; + p_seed = (p_seed << 13) | (p_seed >> 19); + p_seed = p_seed * 5 + 0xe6546b64; + + return p_seed; +} + +static _FORCE_INLINE_ uint32_t hash_murmur3_one_float(float p_in, uint32_t p_seed = HASH_MURMUR3_SEED) { + union { + float f; + uint32_t i; + } u; + + // Normalize +/- 0.0 and NaN values so they hash the same. + if (p_in == 0.0f) { + u.f = 0.0; + } else if (Math::is_nan(p_in)) { + u.f = NAN; + } else { + u.f = p_in; + } + + return hash_murmur3_one_32(u.i, p_seed); +} + +static _FORCE_INLINE_ uint32_t hash_murmur3_one_64(uint64_t p_in, uint32_t p_seed = HASH_MURMUR3_SEED) { + p_seed = hash_murmur3_one_32(p_in & 0xFFFFFFFF, p_seed); + return hash_murmur3_one_32(p_in >> 32, p_seed); +} + +static _FORCE_INLINE_ uint32_t hash_murmur3_one_double(double p_in, uint32_t p_seed = HASH_MURMUR3_SEED) { + union { + double d; + uint64_t i; + } u; + + // Normalize +/- 0.0 and NaN values so they hash the same. + if (p_in == 0.0f) { + u.d = 0.0; + } else if (Math::is_nan(p_in)) { + u.d = NAN; + } else { + u.d = p_in; + } + + return hash_murmur3_one_64(u.i, p_seed); +} + +static _FORCE_INLINE_ uint32_t hash_murmur3_one_real(real_t p_in, uint32_t p_seed = HASH_MURMUR3_SEED) { +#ifdef REAL_T_IS_DOUBLE + return hash_murmur3_one_double(p_in, p_seed); +#else + return hash_murmur3_one_float(p_in, p_seed); +#endif +} + +static _FORCE_INLINE_ uint32_t hash_rotl32(uint32_t x, int8_t r) { return (x << r) | (x >> (32 - r)); } -static _FORCE_INLINE_ uint32_t fmix32(uint32_t h) { +static _FORCE_INLINE_ uint32_t hash_fmix32(uint32_t h) { h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; @@ -117,7 +179,7 @@ static _FORCE_INLINE_ uint32_t fmix32(uint32_t h) { return h; } -static _FORCE_INLINE_ uint32_t hash_murmur3_32(const void *key, int length, const uint32_t seed = 0x7F07C65) { +static _FORCE_INLINE_ uint32_t hash_murmur3_buffer(const void *key, int length, const uint32_t seed = HASH_MURMUR3_SEED) { // Although not required, this is a random prime number. const uint8_t *data = (const uint8_t *)key; const int nblocks = length / 4; @@ -133,11 +195,11 @@ static _FORCE_INLINE_ uint32_t hash_murmur3_32(const void *key, int length, cons uint32_t k1 = blocks[i]; k1 *= c1; - k1 = rotl32(k1, 15); + k1 = hash_rotl32(k1, 15); k1 *= c2; h1 ^= k1; - h1 = rotl32(h1, 13); + h1 = hash_rotl32(h1, 13); h1 = h1 * 5 + 0xe6546b64; } @@ -155,14 +217,14 @@ static _FORCE_INLINE_ uint32_t hash_murmur3_32(const void *key, int length, cons case 1: k1 ^= tail[0]; k1 *= c1; - k1 = rotl32(k1, 15); + k1 = hash_rotl32(k1, 15); k1 *= c2; h1 ^= k1; }; // Finalize with additional bit mixing. h1 ^= length; - return fmix32(h1); + return hash_fmix32(h1); } static _FORCE_INLINE_ uint32_t hash_djb2_one_float(double p_in, uint32_t p_prev = 5381) { @@ -184,7 +246,7 @@ static _FORCE_INLINE_ uint32_t hash_djb2_one_float(double p_in, uint32_t p_prev } template <class T> -static _FORCE_INLINE_ uint32_t make_uint32_t(T p_in) { +static _FORCE_INLINE_ uint32_t hash_make_uint32_t(T p_in) { union { T t; uint32_t _u32; @@ -213,11 +275,11 @@ static _FORCE_INLINE_ uint64_t hash_djb2_one_float_64(double p_in, uint64_t p_pr } static _FORCE_INLINE_ uint64_t hash_djb2_one_64(uint64_t p_in, uint64_t p_prev = 5381) { - return ((p_prev << 5) + p_prev) + p_in; + return ((p_prev << 5) + p_prev) ^ p_in; } template <class T> -static _FORCE_INLINE_ uint64_t make_uint64_t(T p_in) { +static _FORCE_INLINE_ uint64_t hash_make_uint64_t(T p_in) { union { T t; uint64_t _u64; @@ -241,9 +303,9 @@ struct HashMapHasherDefault { static _FORCE_INLINE_ uint32_t hash(const String &p_string) { return p_string.hash(); } static _FORCE_INLINE_ uint32_t hash(const char *p_cstr) { return hash_djb2(p_cstr); } - static _FORCE_INLINE_ uint32_t hash(const wchar_t p_wchar) { return fmix32(p_wchar); } - static _FORCE_INLINE_ uint32_t hash(const char16_t p_uchar) { return fmix32(p_uchar); } - static _FORCE_INLINE_ uint32_t hash(const char32_t p_uchar) { return fmix32(p_uchar); } + static _FORCE_INLINE_ uint32_t hash(const wchar_t p_wchar) { return hash_fmix32(p_wchar); } + static _FORCE_INLINE_ uint32_t hash(const char16_t p_uchar) { return hash_fmix32(p_uchar); } + static _FORCE_INLINE_ uint32_t hash(const char32_t p_uchar) { return hash_fmix32(p_uchar); } static _FORCE_INLINE_ uint32_t hash(const RID &p_rid) { return hash_one_uint64(p_rid.get_id()); } static _FORCE_INLINE_ uint32_t hash(const StringName &p_string_name) { return p_string_name.hash(); } static _FORCE_INLINE_ uint32_t hash(const NodePath &p_path) { return p_path.hash(); } @@ -251,21 +313,59 @@ struct HashMapHasherDefault { static _FORCE_INLINE_ uint32_t hash(const uint64_t p_int) { return hash_one_uint64(p_int); } static _FORCE_INLINE_ uint32_t hash(const int64_t p_int) { return hash_one_uint64(p_int); } - static _FORCE_INLINE_ uint32_t hash(const float p_float) { return hash_djb2_one_float(p_float); } - static _FORCE_INLINE_ uint32_t hash(const double p_double) { return hash_djb2_one_float(p_double); } - static _FORCE_INLINE_ uint32_t hash(const uint32_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const int32_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const uint16_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const int16_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const uint8_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const int8_t p_int) { return fmix32(p_int); } - static _FORCE_INLINE_ uint32_t hash(const Vector2i &p_vec) { return hash_murmur3_32(&p_vec, sizeof(Vector2i)); } - static _FORCE_INLINE_ uint32_t hash(const Vector3i &p_vec) { return hash_murmur3_32(&p_vec, sizeof(Vector3i)); } - static _FORCE_INLINE_ uint32_t hash(const Vector2 &p_vec) { return hash_murmur3_32(&p_vec, sizeof(Vector2)); } - static _FORCE_INLINE_ uint32_t hash(const Vector3 &p_vec) { return hash_murmur3_32(&p_vec, sizeof(Vector3)); } - static _FORCE_INLINE_ uint32_t hash(const Rect2i &p_rect) { return hash_murmur3_32(&p_rect, sizeof(Rect2i)); } - static _FORCE_INLINE_ uint32_t hash(const Rect2 &p_rect) { return hash_murmur3_32(&p_rect, sizeof(Rect2)); } - static _FORCE_INLINE_ uint32_t hash(const AABB &p_aabb) { return hash_murmur3_32(&p_aabb, sizeof(AABB)); } + static _FORCE_INLINE_ uint32_t hash(const float p_float) { return hash_murmur3_one_float(p_float); } + static _FORCE_INLINE_ uint32_t hash(const double p_double) { return hash_murmur3_one_double(p_double); } + static _FORCE_INLINE_ uint32_t hash(const uint32_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const int32_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const uint16_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const int16_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const uint8_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const int8_t p_int) { return hash_fmix32(p_int); } + static _FORCE_INLINE_ uint32_t hash(const Vector2i &p_vec) { + uint32_t h = hash_murmur3_one_32(p_vec.x); + h = hash_murmur3_one_32(p_vec.y, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const Vector3i &p_vec) { + uint32_t h = hash_murmur3_one_32(p_vec.x); + h = hash_murmur3_one_32(p_vec.y, h); + h = hash_murmur3_one_32(p_vec.z, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const Vector2 &p_vec) { + uint32_t h = hash_murmur3_one_real(p_vec.x); + h = hash_murmur3_one_real(p_vec.y, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const Vector3 &p_vec) { + uint32_t h = hash_murmur3_one_real(p_vec.x); + h = hash_murmur3_one_real(p_vec.y, h); + h = hash_murmur3_one_real(p_vec.z, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const Rect2i &p_rect) { + uint32_t h = hash_murmur3_one_32(p_rect.position.x); + h = hash_murmur3_one_32(p_rect.position.y, h); + h = hash_murmur3_one_32(p_rect.size.x, h); + h = hash_murmur3_one_32(p_rect.size.y, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const Rect2 &p_rect) { + uint32_t h = hash_murmur3_one_real(p_rect.position.x); + h = hash_murmur3_one_real(p_rect.position.y, h); + h = hash_murmur3_one_real(p_rect.size.x, h); + h = hash_murmur3_one_real(p_rect.size.y, h); + return hash_fmix32(h); + } + static _FORCE_INLINE_ uint32_t hash(const AABB &p_aabb) { + uint32_t h = hash_murmur3_one_real(p_aabb.position.x); + h = hash_murmur3_one_real(p_aabb.position.y, h); + h = hash_murmur3_one_real(p_aabb.position.z, h); + h = hash_murmur3_one_real(p_aabb.size.x, h); + h = hash_murmur3_one_real(p_aabb.size.y, h); + h = hash_murmur3_one_real(p_aabb.size.z, h); + return hash_fmix32(h); + } }; template <typename T> diff --git a/core/variant/array.cpp b/core/variant/array.cpp index 599c3e1dfe..af166e09a3 100644 --- a/core/variant/array.cpp +++ b/core/variant/array.cpp @@ -190,13 +190,13 @@ uint32_t Array::recursive_hash(int recursion_count) const { return 0; } - uint32_t h = hash_djb2_one_32(Variant::ARRAY); + uint32_t h = hash_murmur3_one_32(Variant::ARRAY); recursion_count++; for (int i = 0; i < _p->array.size(); i++) { - h = hash_djb2_one_32(_p->array[i].recursive_hash(recursion_count), h); + h = hash_murmur3_one_32(_p->array[i].recursive_hash(recursion_count), h); } - return h; + return hash_fmix32(h); } bool Array::_assign(const Array &p_array) { diff --git a/core/variant/callable.cpp b/core/variant/callable.cpp index 516b8f2d51..5453f0d5c6 100644 --- a/core/variant/callable.cpp +++ b/core/variant/callable.cpp @@ -143,7 +143,8 @@ uint32_t Callable::hash() const { return custom->hash(); } else { uint32_t hash = method.hash(); - return hash_djb2_one_64(object, hash); + hash = hash_murmur3_one_64(object, hash); + return hash_fmix32(hash); } } diff --git a/core/variant/dictionary.cpp b/core/variant/dictionary.cpp index 822021f440..d9f4359ee5 100644 --- a/core/variant/dictionary.cpp +++ b/core/variant/dictionary.cpp @@ -298,15 +298,15 @@ uint32_t Dictionary::recursive_hash(int recursion_count) const { return 0; } - uint32_t h = hash_djb2_one_32(Variant::DICTIONARY); + uint32_t h = hash_murmur3_one_32(Variant::DICTIONARY); recursion_count++; for (const KeyValue<Variant, Variant> &E : _p->variant_map) { - h = hash_djb2_one_32(E.key.recursive_hash(recursion_count), h); - h = hash_djb2_one_32(E.value.recursive_hash(recursion_count), h); + h = hash_murmur3_one_32(E.key.recursive_hash(recursion_count), h); + h = hash_murmur3_one_32(E.value.recursive_hash(recursion_count), h); } - return h; + return hash_fmix32(h); } Array Dictionary::keys() const { diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index aa640924e4..6007268e21 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -2780,7 +2780,7 @@ uint32_t Variant::recursive_hash(int recursion_count) const { return hash_one_uint64((uint64_t)_data._int); } break; case FLOAT: { - return hash_djb2_one_float(_data._float); + return hash_murmur3_one_float(_data._float); } break; case STRING: { return reinterpret_cast<const String *>(_data._mem)->hash(); @@ -2788,50 +2788,102 @@ uint32_t Variant::recursive_hash(int recursion_count) const { // math types case VECTOR2: { - return hash_murmur3_32(reinterpret_cast<const Vector2 *>(_data._mem), sizeof(Vector2)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Vector2 *>(_data._mem)); } break; case VECTOR2I: { - return hash_murmur3_32(reinterpret_cast<const Vector2i *>(_data._mem), sizeof(Vector2i)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Vector2i *>(_data._mem)); } break; case RECT2: { - return hash_murmur3_32(reinterpret_cast<const Rect2 *>(_data._mem), sizeof(Rect2)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Rect2 *>(_data._mem)); } break; case RECT2I: { - return hash_murmur3_32(reinterpret_cast<const Rect2i *>(_data._mem), sizeof(Rect2i)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Rect2i *>(_data._mem)); } break; case TRANSFORM2D: { - return hash_murmur3_32(reinterpret_cast<const Transform2D *>(_data._transform2d), sizeof(Transform2D)); + uint32_t h = HASH_MURMUR3_SEED; + const Transform2D &t = *_data._transform2d; + h = hash_murmur3_one_real(t[0].x, h); + h = hash_murmur3_one_real(t[0].y, h); + h = hash_murmur3_one_real(t[1].x, h); + h = hash_murmur3_one_real(t[1].y, h); + h = hash_murmur3_one_real(t[2].x, h); + h = hash_murmur3_one_real(t[2].y, h); + + return hash_fmix32(h); } break; case VECTOR3: { - return hash_murmur3_32(reinterpret_cast<const Vector3 *>(_data._mem), sizeof(Vector3)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Vector3 *>(_data._mem)); } break; case VECTOR3I: { - return hash_murmur3_32(reinterpret_cast<const Vector3i *>(_data._mem), sizeof(Vector3i)); + return HashMapHasherDefault::hash(*reinterpret_cast<const Vector3i *>(_data._mem)); } break; case PLANE: { - return hash_murmur3_32(reinterpret_cast<const Plane *>(_data._mem), sizeof(Plane)); + uint32_t h = HASH_MURMUR3_SEED; + const Plane &p = *reinterpret_cast<const Plane *>(_data._mem); + h = hash_murmur3_one_real(p.normal.x, h); + h = hash_murmur3_one_real(p.normal.y, h); + h = hash_murmur3_one_real(p.normal.z, h); + h = hash_murmur3_one_real(p.d, h); + return hash_fmix32(h); } break; case AABB: { - return hash_murmur3_32(_data._aabb, sizeof(AABB)); + return HashMapHasherDefault::hash(*_data._aabb); } break; case QUATERNION: { - return hash_murmur3_32(reinterpret_cast<const Quaternion *>(_data._mem), sizeof(Quaternion)); + uint32_t h = HASH_MURMUR3_SEED; + const Quaternion &q = *reinterpret_cast<const Quaternion *>(_data._mem); + h = hash_murmur3_one_real(q.x, h); + h = hash_murmur3_one_real(q.y, h); + h = hash_murmur3_one_real(q.z, h); + h = hash_murmur3_one_real(q.w, h); + return hash_fmix32(h); } break; case BASIS: { - return hash_murmur3_32(_data._basis, sizeof(Basis)); + uint32_t h = HASH_MURMUR3_SEED; + const Basis &b = *_data._basis; + h = hash_murmur3_one_real(b[0].x, h); + h = hash_murmur3_one_real(b[0].y, h); + h = hash_murmur3_one_real(b[0].z, h); + h = hash_murmur3_one_real(b[1].x, h); + h = hash_murmur3_one_real(b[1].y, h); + h = hash_murmur3_one_real(b[1].z, h); + h = hash_murmur3_one_real(b[2].x, h); + h = hash_murmur3_one_real(b[2].y, h); + h = hash_murmur3_one_real(b[2].z, h); + return hash_fmix32(h); } break; case TRANSFORM3D: { - return hash_murmur3_32(_data._transform3d, sizeof(Transform3D)); + uint32_t h = HASH_MURMUR3_SEED; + const Transform3D &t = *_data._transform3d; + h = hash_murmur3_one_real(t.basis[0].x, h); + h = hash_murmur3_one_real(t.basis[0].y, h); + h = hash_murmur3_one_real(t.basis[0].z, h); + h = hash_murmur3_one_real(t.basis[1].x, h); + h = hash_murmur3_one_real(t.basis[1].y, h); + h = hash_murmur3_one_real(t.basis[1].z, h); + h = hash_murmur3_one_real(t.basis[2].x, h); + h = hash_murmur3_one_real(t.basis[2].y, h); + h = hash_murmur3_one_real(t.basis[2].z, h); + h = hash_murmur3_one_real(t.origin.x, h); + h = hash_murmur3_one_real(t.origin.y, h); + h = hash_murmur3_one_real(t.origin.z, h); + return hash_fmix32(h); } break; // misc types case COLOR: { - return hash_murmur3_32(reinterpret_cast<const Color *>(_data._mem), sizeof(Color)); + uint32_t h = HASH_MURMUR3_SEED; + const Color &c = *reinterpret_cast<const Color *>(_data._mem); + h = hash_murmur3_one_float(c.r, h); + h = hash_murmur3_one_float(c.g, h); + h = hash_murmur3_one_float(c.b, h); + h = hash_murmur3_one_float(c.a, h); + return hash_fmix32(h); } break; case RID: { return hash_one_uint64(reinterpret_cast<const ::RID *>(_data._mem)->get_id()); } break; case OBJECT: { - return hash_one_uint64(make_uint64_t(_get_obj().obj)); + return hash_one_uint64(hash_make_uint64_t(_get_obj().obj)); } break; case STRING_NAME: { return reinterpret_cast<const StringName *>(_data._mem)->hash(); @@ -2850,7 +2902,7 @@ uint32_t Variant::recursive_hash(int recursion_count) const { case SIGNAL: { const Signal &s = *reinterpret_cast<const Signal *>(_data._mem); uint32_t hash = s.get_name().hash(); - return hash_djb2_one_64(s.get_object_id(), hash); + return hash_murmur3_one_64(s.get_object_id(), hash); } break; case ARRAY: { const Array &arr = *reinterpret_cast<const Array *>(_data._mem); @@ -2862,9 +2914,9 @@ uint32_t Variant::recursive_hash(int recursion_count) const { int len = arr.size(); if (likely(len)) { const uint8_t *r = arr.ptr(); - return hash_murmur3_32((uint8_t *)&r[0], len); + return hash_murmur3_buffer((uint8_t *)&r[0], len); } else { - return hash_djb2_one_64(0); + return hash_murmur3_one_64(0); } } break; @@ -2873,9 +2925,9 @@ uint32_t Variant::recursive_hash(int recursion_count) const { int len = arr.size(); if (likely(len)) { const int32_t *r = arr.ptr(); - return hash_murmur3_32((uint8_t *)&r[0], len * sizeof(int32_t)); + return hash_murmur3_buffer((uint8_t *)&r[0], len * sizeof(int32_t)); } else { - return hash_djb2_one_64(0); + return hash_murmur3_one_64(0); } } break; @@ -2884,9 +2936,9 @@ uint32_t Variant::recursive_hash(int recursion_count) const { int len = arr.size(); if (likely(len)) { const int64_t *r = arr.ptr(); - return hash_murmur3_32((uint8_t *)&r[0], len * sizeof(int64_t)); + return hash_murmur3_buffer((uint8_t *)&r[0], len * sizeof(int64_t)); } else { - return hash_djb2_one_64(0); + return hash_murmur3_one_64(0); } } break; @@ -2896,9 +2948,13 @@ uint32_t Variant::recursive_hash(int recursion_count) const { if (likely(len)) { const float *r = arr.ptr(); - return hash_murmur3_32((uint8_t *)&r[0], len * sizeof(float)); + uint32_t h = HASH_MURMUR3_SEED; + for (int32_t i = 0; i < len; i++) { + h = hash_murmur3_one_float(r[i], h); + } + return hash_fmix32(h); } else { - return hash_djb2_one_float(0.0); + return hash_murmur3_one_float(0.0); } } break; @@ -2908,14 +2964,18 @@ uint32_t Variant::recursive_hash(int recursion_count) const { if (likely(len)) { const double *r = arr.ptr(); - return hash_murmur3_32((uint8_t *)&r[0], len * sizeof(double)); + uint32_t h = HASH_MURMUR3_SEED; + for (int32_t i = 0; i < len; i++) { + h = hash_murmur3_one_double(r[i], h); + } + return hash_fmix32(h); } else { - return hash_djb2_one_float(0.0); + return hash_murmur3_one_float(0.0); } } break; case PACKED_STRING_ARRAY: { - uint32_t hash = 5831; + uint32_t hash = HASH_MURMUR3_SEED; const Vector<String> &arr = PackedArrayRef<String>::get_array(_data.packed_array); int len = arr.size(); @@ -2923,14 +2983,15 @@ uint32_t Variant::recursive_hash(int recursion_count) const { const String *r = arr.ptr(); for (int i = 0; i < len; i++) { - hash = hash_djb2_one_32(r[i].hash(), hash); + hash = hash_murmur3_one_32(r[i].hash(), hash); } + hash = hash_fmix32(hash); } return hash; } break; case PACKED_VECTOR2_ARRAY: { - uint32_t hash = 5831; + uint32_t hash = HASH_MURMUR3_SEED; const Vector<Vector2> &arr = PackedArrayRef<Vector2>::get_array(_data.packed_array); int len = arr.size(); @@ -2938,15 +2999,16 @@ uint32_t Variant::recursive_hash(int recursion_count) const { const Vector2 *r = arr.ptr(); for (int i = 0; i < len; i++) { - hash = hash_djb2_one_float(r[i].x, hash); - hash = hash_djb2_one_float(r[i].y, hash); + hash = hash_murmur3_one_real(r[i].x, hash); + hash = hash_murmur3_one_real(r[i].y, hash); } + hash = hash_fmix32(hash); } return hash; } break; case PACKED_VECTOR3_ARRAY: { - uint32_t hash = 5831; + uint32_t hash = HASH_MURMUR3_SEED; const Vector<Vector3> &arr = PackedArrayRef<Vector3>::get_array(_data.packed_array); int len = arr.size(); @@ -2954,16 +3016,17 @@ uint32_t Variant::recursive_hash(int recursion_count) const { const Vector3 *r = arr.ptr(); for (int i = 0; i < len; i++) { - hash = hash_djb2_one_float(r[i].x, hash); - hash = hash_djb2_one_float(r[i].y, hash); - hash = hash_djb2_one_float(r[i].z, hash); + hash = hash_murmur3_one_real(r[i].x, hash); + hash = hash_murmur3_one_real(r[i].y, hash); + hash = hash_murmur3_one_real(r[i].z, hash); } + hash = hash_fmix32(hash); } return hash; } break; case PACKED_COLOR_ARRAY: { - uint32_t hash = 5831; + uint32_t hash = HASH_MURMUR3_SEED; const Vector<Color> &arr = PackedArrayRef<Color>::get_array(_data.packed_array); int len = arr.size(); @@ -2971,11 +3034,12 @@ uint32_t Variant::recursive_hash(int recursion_count) const { const Color *r = arr.ptr(); for (int i = 0; i < len; i++) { - hash = hash_djb2_one_float(r[i].r, hash); - hash = hash_djb2_one_float(r[i].g, hash); - hash = hash_djb2_one_float(r[i].b, hash); - hash = hash_djb2_one_float(r[i].a, hash); + hash = hash_murmur3_one_float(r[i].r, hash); + hash = hash_murmur3_one_float(r[i].g, hash); + hash = hash_murmur3_one_float(r[i].b, hash); + hash = hash_murmur3_one_float(r[i].a, hash); } + hash = hash_fmix32(hash); } return hash; diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index b335f2fcf4..cb9dfe478b 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -919,7 +919,7 @@ struct _VariantCall { } struct ConstantData { - HashMap<StringName, int> value; + HashMap<StringName, int64_t> value; #ifdef DEBUG_ENABLED List<StringName> value_ordered; #endif @@ -931,7 +931,7 @@ struct _VariantCall { static ConstantData *constant_data; - static void add_constant(int p_type, StringName p_constant_name, int p_constant_value) { + static void add_constant(int p_type, StringName p_constant_name, int64_t p_constant_value) { constant_data[p_type].value[p_constant_name] = p_constant_value; #ifdef DEBUG_ENABLED constant_data[p_type].value_ordered.push_back(p_constant_name); @@ -1170,19 +1170,19 @@ uint32_t Variant::get_builtin_method_hash(Variant::Type p_type, const StringName ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, 0); const VariantBuiltInMethodInfo *method = builtin_method_info[p_type].lookup_ptr(p_method); ERR_FAIL_COND_V(!method, 0); - uint32_t hash = hash_djb2_one_32(method->is_const); - hash = hash_djb2_one_32(method->is_static, hash); - hash = hash_djb2_one_32(method->is_vararg, hash); - hash = hash_djb2_one_32(method->has_return_type, hash); + uint32_t hash = hash_murmur3_one_32(method->is_const); + hash = hash_murmur3_one_32(method->is_static, hash); + hash = hash_murmur3_one_32(method->is_vararg, hash); + hash = hash_murmur3_one_32(method->has_return_type, hash); if (method->has_return_type) { - hash = hash_djb2_one_32(method->return_type, hash); + hash = hash_murmur3_one_32(method->return_type, hash); } - hash = hash_djb2_one_32(method->argument_count, hash); + hash = hash_murmur3_one_32(method->argument_count, hash); for (int i = 0; i < method->argument_count; i++) { - hash = method->get_argument_type(i); + hash = hash_murmur3_one_32(method->get_argument_type(i), hash); } - return hash; + return hash_fmix32(hash); } void Variant::get_method_list(List<MethodInfo> *p_list) const { @@ -1245,7 +1245,7 @@ void Variant::get_constants_for_type(Variant::Type p_type, List<StringName> *p_c for (const List<StringName>::Element *E = cd.value_ordered.front(); E; E = E->next()) { p_constants->push_back(E->get()); #else - for (const KeyValue<StringName, int> &E : cd.value) { + for (const KeyValue<StringName, int64_t> &E : cd.value) { p_constants->push_back(E.key); #endif } @@ -1281,7 +1281,7 @@ Variant Variant::get_constant_value(Variant::Type p_type, const StringName &p_va ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, 0); _VariantCall::ConstantData &cd = _VariantCall::constant_data[p_type]; - HashMap<StringName, int>::Iterator E = cd.value.find(p_value); + HashMap<StringName, int64_t>::Iterator E = cd.value.find(p_value); if (!E) { HashMap<StringName, Variant>::Iterator F = cd.variant_value.find(p_value); if (F) { diff --git a/core/variant/variant_utility.cpp b/core/variant/variant_utility.cpp index 66badce268..7fabdcbc82 100644 --- a/core/variant/variant_utility.cpp +++ b/core/variant/variant_utility.cpp @@ -1423,17 +1423,17 @@ uint32_t Variant::get_utility_function_hash(const StringName &p_name) { const VariantUtilityFunctionInfo *bfi = utility_function_table.lookup_ptr(p_name); ERR_FAIL_COND_V(!bfi, 0); - uint32_t hash = hash_djb2_one_32(bfi->is_vararg); - hash = hash_djb2_one_32(bfi->returns_value, hash); + uint32_t hash = hash_murmur3_one_32(bfi->is_vararg); + hash = hash_murmur3_one_32(bfi->returns_value, hash); if (bfi->returns_value) { - hash = hash_djb2_one_32(bfi->return_type, hash); + hash = hash_murmur3_one_32(bfi->return_type, hash); } - hash = hash_djb2_one_32(bfi->argcount, hash); + hash = hash_murmur3_one_32(bfi->argcount, hash); for (int i = 0; i < bfi->argcount; i++) { - hash = hash_djb2_one_32(bfi->get_arg_type(i), hash); + hash = hash_murmur3_one_32(bfi->get_arg_type(i), hash); } - return hash; + return hash_fmix32(hash); } void Variant::get_utility_function_list(List<StringName> *r_functions) { diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index fed6270247..4048b483e8 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -1414,6 +1414,63 @@ <constant name="KEY_F16" value="16777259" enum="Key"> F16 key. </constant> + <constant name="KEY_F17" value="16777260" enum="Key"> + F17 key. + </constant> + <constant name="KEY_F18" value="16777261" enum="Key"> + F18 key. + </constant> + <constant name="KEY_F19" value="16777262" enum="Key"> + F19 key. + </constant> + <constant name="KEY_F20" value="16777263" enum="Key"> + F20 key. + </constant> + <constant name="KEY_F21" value="16777264" enum="Key"> + F21 key. + </constant> + <constant name="KEY_F22" value="16777265" enum="Key"> + F22 key. + </constant> + <constant name="KEY_F23" value="16777266" enum="Key"> + F23 key. + </constant> + <constant name="KEY_F24" value="16777267" enum="Key"> + F24 key. + </constant> + <constant name="KEY_F25" value="16777268" enum="Key"> + F25 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F26" value="16777269" enum="Key"> + F26 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F27" value="16777270" enum="Key"> + F27 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F28" value="16777271" enum="Key"> + F28 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F29" value="16777272" enum="Key"> + F29 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F30" value="16777273" enum="Key"> + F30 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F31" value="16777274" enum="Key"> + F31 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F32" value="16777275" enum="Key"> + F32 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F33" value="16777276" enum="Key"> + F33 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F34" value="16777277" enum="Key"> + F34 key. Only supported on macOS and Linux due to a Windows limitation. + </constant> + <constant name="KEY_F35" value="16777278" 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"> Multiply (*) key on the numeric keypad. </constant> @@ -1459,148 +1516,148 @@ <constant name="KEY_KP_9" value="16777359" enum="Key"> Number 9 on the numeric keypad. </constant> - <constant name="KEY_SUPER_L" value="16777260" enum="Key"> + <constant name="KEY_SUPER_L" value="16777280" enum="Key"> Left Super key (Windows key). </constant> - <constant name="KEY_SUPER_R" value="16777261" enum="Key"> + <constant name="KEY_SUPER_R" value="16777281" enum="Key"> Right Super key (Windows key). </constant> - <constant name="KEY_MENU" value="16777262" enum="Key"> + <constant name="KEY_MENU" value="16777282" enum="Key"> Context menu key. </constant> - <constant name="KEY_HYPER_L" value="16777263" enum="Key"> + <constant name="KEY_HYPER_L" value="16777283" enum="Key"> Left Hyper key. </constant> - <constant name="KEY_HYPER_R" value="16777264" enum="Key"> + <constant name="KEY_HYPER_R" value="16777284" enum="Key"> Right Hyper key. </constant> - <constant name="KEY_HELP" value="16777265" enum="Key"> + <constant name="KEY_HELP" value="16777285" enum="Key"> Help key. </constant> - <constant name="KEY_DIRECTION_L" value="16777266" enum="Key"> + <constant name="KEY_DIRECTION_L" value="16777286" enum="Key"> Left Direction key. </constant> - <constant name="KEY_DIRECTION_R" value="16777267" enum="Key"> + <constant name="KEY_DIRECTION_R" value="16777287" enum="Key"> Right Direction key. </constant> - <constant name="KEY_BACK" value="16777280" enum="Key"> + <constant name="KEY_BACK" value="16777288" enum="Key"> Media back key. Not to be confused with the Back button on an Android device. </constant> - <constant name="KEY_FORWARD" value="16777281" enum="Key"> + <constant name="KEY_FORWARD" value="16777289" enum="Key"> Media forward key. </constant> - <constant name="KEY_STOP" value="16777282" enum="Key"> + <constant name="KEY_STOP" value="16777290" enum="Key"> Media stop key. </constant> - <constant name="KEY_REFRESH" value="16777283" enum="Key"> + <constant name="KEY_REFRESH" value="16777291" enum="Key"> Media refresh key. </constant> - <constant name="KEY_VOLUMEDOWN" value="16777284" enum="Key"> + <constant name="KEY_VOLUMEDOWN" value="16777292" enum="Key"> Volume down key. </constant> - <constant name="KEY_VOLUMEMUTE" value="16777285" enum="Key"> + <constant name="KEY_VOLUMEMUTE" value="16777293" enum="Key"> Mute volume key. </constant> - <constant name="KEY_VOLUMEUP" value="16777286" enum="Key"> + <constant name="KEY_VOLUMEUP" value="16777294" enum="Key"> Volume up key. </constant> - <constant name="KEY_BASSBOOST" value="16777287" enum="Key"> + <constant name="KEY_BASSBOOST" value="16777295" enum="Key"> Bass Boost key. </constant> - <constant name="KEY_BASSUP" value="16777288" enum="Key"> + <constant name="KEY_BASSUP" value="16777296" enum="Key"> Bass up key. </constant> - <constant name="KEY_BASSDOWN" value="16777289" enum="Key"> + <constant name="KEY_BASSDOWN" value="16777297" enum="Key"> Bass down key. </constant> - <constant name="KEY_TREBLEUP" value="16777290" enum="Key"> + <constant name="KEY_TREBLEUP" value="16777298" enum="Key"> Treble up key. </constant> - <constant name="KEY_TREBLEDOWN" value="16777291" enum="Key"> + <constant name="KEY_TREBLEDOWN" value="16777299" enum="Key"> Treble down key. </constant> - <constant name="KEY_MEDIAPLAY" value="16777292" enum="Key"> + <constant name="KEY_MEDIAPLAY" value="16777300" enum="Key"> Media play key. </constant> - <constant name="KEY_MEDIASTOP" value="16777293" enum="Key"> + <constant name="KEY_MEDIASTOP" value="16777301" enum="Key"> Media stop key. </constant> - <constant name="KEY_MEDIAPREVIOUS" value="16777294" enum="Key"> + <constant name="KEY_MEDIAPREVIOUS" value="16777302" enum="Key"> Previous song key. </constant> - <constant name="KEY_MEDIANEXT" value="16777295" enum="Key"> + <constant name="KEY_MEDIANEXT" value="16777303" enum="Key"> Next song key. </constant> - <constant name="KEY_MEDIARECORD" value="16777296" enum="Key"> + <constant name="KEY_MEDIARECORD" value="16777304" enum="Key"> Media record key. </constant> - <constant name="KEY_HOMEPAGE" value="16777297" enum="Key"> + <constant name="KEY_HOMEPAGE" value="16777305" enum="Key"> Home page key. </constant> - <constant name="KEY_FAVORITES" value="16777298" enum="Key"> + <constant name="KEY_FAVORITES" value="16777306" enum="Key"> Favorites key. </constant> - <constant name="KEY_SEARCH" value="16777299" enum="Key"> + <constant name="KEY_SEARCH" value="16777307" enum="Key"> Search key. </constant> - <constant name="KEY_STANDBY" value="16777300" enum="Key"> + <constant name="KEY_STANDBY" value="16777308" enum="Key"> Standby key. </constant> - <constant name="KEY_OPENURL" value="16777301" enum="Key"> + <constant name="KEY_OPENURL" value="16777309" enum="Key"> Open URL / Launch Browser key. </constant> - <constant name="KEY_LAUNCHMAIL" value="16777302" enum="Key"> + <constant name="KEY_LAUNCHMAIL" value="16777310" enum="Key"> Launch Mail key. </constant> - <constant name="KEY_LAUNCHMEDIA" value="16777303" enum="Key"> + <constant name="KEY_LAUNCHMEDIA" value="16777311" enum="Key"> Launch Media key. </constant> - <constant name="KEY_LAUNCH0" value="16777304" enum="Key"> + <constant name="KEY_LAUNCH0" value="16777312" enum="Key"> Launch Shortcut 0 key. </constant> - <constant name="KEY_LAUNCH1" value="16777305" enum="Key"> + <constant name="KEY_LAUNCH1" value="16777313" enum="Key"> Launch Shortcut 1 key. </constant> - <constant name="KEY_LAUNCH2" value="16777306" enum="Key"> + <constant name="KEY_LAUNCH2" value="16777314" enum="Key"> Launch Shortcut 2 key. </constant> - <constant name="KEY_LAUNCH3" value="16777307" enum="Key"> + <constant name="KEY_LAUNCH3" value="16777315" enum="Key"> Launch Shortcut 3 key. </constant> - <constant name="KEY_LAUNCH4" value="16777308" enum="Key"> + <constant name="KEY_LAUNCH4" value="16777316" enum="Key"> Launch Shortcut 4 key. </constant> - <constant name="KEY_LAUNCH5" value="16777309" enum="Key"> + <constant name="KEY_LAUNCH5" value="16777317" enum="Key"> Launch Shortcut 5 key. </constant> - <constant name="KEY_LAUNCH6" value="16777310" enum="Key"> + <constant name="KEY_LAUNCH6" value="16777318" enum="Key"> Launch Shortcut 6 key. </constant> - <constant name="KEY_LAUNCH7" value="16777311" enum="Key"> + <constant name="KEY_LAUNCH7" value="16777319" enum="Key"> Launch Shortcut 7 key. </constant> - <constant name="KEY_LAUNCH8" value="16777312" enum="Key"> + <constant name="KEY_LAUNCH8" value="16777320" enum="Key"> Launch Shortcut 8 key. </constant> - <constant name="KEY_LAUNCH9" value="16777313" enum="Key"> + <constant name="KEY_LAUNCH9" value="16777321" enum="Key"> Launch Shortcut 9 key. </constant> - <constant name="KEY_LAUNCHA" value="16777314" enum="Key"> + <constant name="KEY_LAUNCHA" value="16777322" enum="Key"> Launch Shortcut A key. </constant> - <constant name="KEY_LAUNCHB" value="16777315" enum="Key"> + <constant name="KEY_LAUNCHB" value="16777323" enum="Key"> Launch Shortcut B key. </constant> - <constant name="KEY_LAUNCHC" value="16777316" enum="Key"> + <constant name="KEY_LAUNCHC" value="16777324" enum="Key"> Launch Shortcut C key. </constant> - <constant name="KEY_LAUNCHD" value="16777317" enum="Key"> + <constant name="KEY_LAUNCHD" value="16777325" enum="Key"> Launch Shortcut D key. </constant> - <constant name="KEY_LAUNCHE" value="16777318" enum="Key"> + <constant name="KEY_LAUNCHE" value="16777326" enum="Key"> Launch Shortcut E key. </constant> - <constant name="KEY_LAUNCHF" value="16777319" enum="Key"> + <constant name="KEY_LAUNCHF" value="16777327" enum="Key"> Launch Shortcut F key. </constant> <constant name="KEY_UNKNOWN" value="33554431" enum="Key"> @@ -2444,7 +2501,7 @@ Hints that an integer property is a bitmask using the optionally named 3D physics layers. </constant> <constant name="PROPERTY_HINT_LAYERS_3D_NAVIGATION" value="14" enum="PropertyHint"> - Hints that an integer property is a bitmask using the optionally named 2D navigation layers. + Hints that an integer property is a bitmask using the optionally named 3D navigation layers. </constant> <constant name="PROPERTY_HINT_FILE" value="15" enum="PropertyHint"> Hints that a string property is a path to a file. Editing it will show a file dialog for picking the path. The hint string can be a set of filters with wildcards like [code]"*.png,*.jpg"[/code]. diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml index 7d0470f396..76666b1f27 100644 --- a/doc/classes/AudioStreamPlayer2D.xml +++ b/doc/classes/AudioStreamPlayer2D.xml @@ -64,6 +64,9 @@ <member name="max_polyphony" type="int" setter="set_max_polyphony" getter="get_max_polyphony" default="1"> The maximum number of sounds this node can play at the same time. Playing additional sounds after this value is reached will cut off the oldest sounds. </member> + <member name="panning_strength" type="float" setter="set_panning_strength" getter="get_panning_strength" default="1.0"> + Scales the panning strength for this node by multiplying the base [member ProjectSettings.audio/general/2d_panning_strength] with this factor. Higher values will pan audio from left to right more dramatically than lower values. + </member> <member name="pitch_scale" type="float" setter="set_pitch_scale" getter="get_pitch_scale" default="1.0"> The pitch and the tempo of the audio, as a multiplier of the audio sample's sample rate. </member> diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml index 8356596f54..a49b1e2291 100644 --- a/doc/classes/AudioStreamPlayer3D.xml +++ b/doc/classes/AudioStreamPlayer3D.xml @@ -86,6 +86,9 @@ <member name="max_polyphony" type="int" setter="set_max_polyphony" getter="get_max_polyphony" default="1"> The maximum number of sounds this node can play at the same time. Playing additional sounds after this value is reached will cut off the oldest sounds. </member> + <member name="panning_strength" type="float" setter="set_panning_strength" getter="get_panning_strength" default="1.0"> + Scales the panning strength for this node by multiplying the base [member ProjectSettings.audio/general/3d_panning_strength] with this factor. Higher values will pan audio from left to right more dramatically than lower values. + </member> <member name="pitch_scale" type="float" setter="set_pitch_scale" getter="get_pitch_scale" default="1.0"> The pitch and the tempo of the audio, as a multiplier of the audio sample's sample rate. </member> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 6f7a137ce7..d52234e9ac 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -8,6 +8,7 @@ Selectable items in the list may be selected or deselected and multiple selection may be enabled. Selection with right mouse button may also be enabled to allow use of popup context menus. Items may also be "activated" by double-clicking them or by pressing [kbd]Enter[/kbd]. Item text only supports single-line strings, newline characters (e.g. [code]\n[/code]) in the string won't produce a newline. Text wrapping is enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to fully fit its content by default. You need to set [member fixed_column_width] greater than zero to wrap the text. All [code]set_*[/code] methods allow negative item index, which makes the item accessed from the last one. + [b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing [member ProjectSettings.gui/timers/incremental_search_max_interval_msec]. </description> <tutorials> </tutorials> diff --git a/doc/classes/NavigationAgent2D.xml b/doc/classes/NavigationAgent2D.xml index 0ac9513464..757b635252 100644 --- a/doc/classes/NavigationAgent2D.xml +++ b/doc/classes/NavigationAgent2D.xml @@ -34,6 +34,13 @@ Returns which index the agent is currently on in the navigation path's [PackedVector2Array]. </description> </method> + <method name="get_navigation_layer_value" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="layer_number" type="int" /> + <description> + 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> @@ -76,6 +83,14 @@ Returns true if the target location is reached. The target location is set using [method set_target_location]. It may not always be possible to reach the target location. It should always be possible to reach the final location though. See [method get_final_location]. </description> </method> + <method name="set_navigation_layer_value"> + <return type="void" /> + <argument index="0" name="layer_number" type="int" /> + <argument index="1" name="value" type="bool" /> + <description> + 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" /> <argument index="0" name="navigation_map" type="RID" /> @@ -114,6 +129,9 @@ <member name="neighbor_dist" type="float" setter="set_neighbor_dist" getter="get_neighbor_dist" default="500.0"> The distance to search for other agents. </member> + <member name="path_desired_distance" type="float" setter="set_path_desired_distance" getter="get_path_desired_distance" default="1.0"> + The distance threshold before a path point is considered to be reached. This will allow an agent to not have to hit a path point on the path exactly, but in the area. If this value is set to high the NavigationAgent will skip points on the path which can lead to leaving the navigation mesh. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the next point on each physics frame update. + </member> <member name="path_max_distance" type="float" setter="set_path_max_distance" getter="get_path_max_distance" default="3.0"> The maximum distance the agent is allowed away from the ideal path to the final location. This can happen due to trying to avoid collisions. When the maximum distance is exceeded, it recalculates the ideal path. </member> @@ -121,7 +139,7 @@ The radius of the agent. </member> <member name="target_desired_distance" type="float" setter="set_target_desired_distance" getter="get_target_desired_distance" default="1.0"> - The distance threshold before a target is considered to be reached. This will allow an agent to not have to hit a point on the path exactly, but in the area. + The distance threshold before the final target point is considered to be reached. This will allow an agent to not have to hit the point of the final target exactly, but only the area. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. </member> <member name="time_horizon" type="float" setter="set_time_horizon" getter="get_time_horizon" default="20.0"> The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. Must be positive. diff --git a/doc/classes/NavigationAgent3D.xml b/doc/classes/NavigationAgent3D.xml index cc45a43ffc..5e1004165d 100644 --- a/doc/classes/NavigationAgent3D.xml +++ b/doc/classes/NavigationAgent3D.xml @@ -34,6 +34,13 @@ Returns which index the agent is currently on in the navigation path's [PackedVector3Array]. </description> </method> + <method name="get_navigation_layer_value" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="layer_number" type="int" /> + <description> + 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> @@ -76,6 +83,14 @@ Returns true if the target location is reached. The target location is set using [method set_target_location]. It may not always be possible to reach the target location. It should always be possible to reach the final location though. See [method get_final_location]. </description> </method> + <method name="set_navigation_layer_value"> + <return type="void" /> + <argument index="0" name="layer_number" type="int" /> + <argument index="1" name="value" type="bool" /> + <description> + 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" /> <argument index="0" name="navigation_map" type="RID" /> @@ -120,6 +135,9 @@ <member name="neighbor_dist" type="float" setter="set_neighbor_dist" getter="get_neighbor_dist" default="50.0"> The distance to search for other agents. </member> + <member name="path_desired_distance" type="float" setter="set_path_desired_distance" getter="get_path_desired_distance" default="1.0"> + The distance threshold before a path point is considered to be reached. This will allow an agent to not have to hit a path point on the path exactly, but in the area. If this value is set to high the NavigationAgent will skip points on the path which can lead to leaving the navigation mesh. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the next point on each physics frame update. + </member> <member name="path_max_distance" type="float" setter="set_path_max_distance" getter="get_path_max_distance" default="3.0"> The maximum distance the agent is allowed away from the ideal path to the final location. This can happen due to trying to avoid collisions. When the maximum distance is exceeded, it recalculates the ideal path. </member> @@ -127,7 +145,7 @@ The radius of the agent. </member> <member name="target_desired_distance" type="float" setter="set_target_desired_distance" getter="get_target_desired_distance" default="1.0"> - The distance threshold before a target is considered to be reached. This will allow an agent to not have to hit a point on the path exactly, but in the area. + The distance threshold before the final target point is considered to be reached. This will allow an agent to not have to hit the point of the final target exactly, but only the area. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. </member> <member name="time_horizon" type="float" setter="set_time_horizon" getter="get_time_horizon" default="5.0"> The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. Must be positive. diff --git a/doc/classes/NavigationRegion2D.xml b/doc/classes/NavigationRegion2D.xml index 62e64f2a3c..c48ca18e9e 100644 --- a/doc/classes/NavigationRegion2D.xml +++ b/doc/classes/NavigationRegion2D.xml @@ -14,19 +14,34 @@ <tutorials> </tutorials> <methods> + <method name="get_navigation_layer_value" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="layer_number" type="int" /> + <description> + 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_region_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this region on the [NavigationServer2D]. Combined with [method NavigationServer2D.map_get_closest_point_owner] can be used to identify the [NavigationRegion2D] closest to a point on the merged navigation map. </description> </method> + <method name="set_navigation_layer_value"> + <return type="void" /> + <argument index="0" name="layer_number" type="int" /> + <argument index="1" name="value" type="bool" /> + <description> + 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> </methods> <members> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true"> Determines if the [NavigationRegion2D] is enabled or disabled. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this regions navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this region's navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the region belongs to. These navigation layers can be checked upon when requesting a path with [method NavigationServer2D.map_get_path]. @@ -35,7 +50,7 @@ The [NavigationPolygon] resource to use. </member> <member name="travel_cost" type="float" setter="set_travel_cost" getter="get_travel_cost" default="1.0"> - When pathfinding moves inside this regions navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. + When pathfinding moves inside this region's navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. </member> </members> </class> diff --git a/doc/classes/NavigationRegion3D.xml b/doc/classes/NavigationRegion3D.xml index 3af7fe5c97..9f4feee072 100644 --- a/doc/classes/NavigationRegion3D.xml +++ b/doc/classes/NavigationRegion3D.xml @@ -21,19 +21,34 @@ Bakes the [NavigationMesh]. If [code]on_thread[/code] is set to [code]true[/code] (default), the baking is done on a separate thread. Baking on separate thread is useful because navigation baking is not a cheap operation. When it is completed, it automatically sets the new [NavigationMesh]. Please note that baking on separate thread may be very slow if geometry is parsed from meshes as async access to each mesh involves heavy synchronization. Also, please note that baking on a separate thread is automatically disabled on operating systems that cannot use threads (such as HTML5 with threads disabled). </description> </method> + <method name="get_navigation_layer_value" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="layer_number" type="int" /> + <description> + 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_region_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this region on the [NavigationServer3D]. Combined with [method NavigationServer3D.map_get_closest_point_owner] can be used to identify the [NavigationRegion3D] closest to a point on the merged navigation map. </description> </method> + <method name="set_navigation_layer_value"> + <return type="void" /> + <argument index="0" name="layer_number" type="int" /> + <argument index="1" name="value" type="bool" /> + <description> + 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> </methods> <members> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true"> Determines if the [NavigationRegion3D] is enabled or disabled. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this regions navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this region's navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the region belongs to. These navigation layers can be checked upon when requesting a path with [method NavigationServer3D.map_get_path]. @@ -42,7 +57,7 @@ The [NavigationMesh] resource to use. </member> <member name="travel_cost" type="float" setter="set_travel_cost" getter="get_travel_cost" default="1.0"> - When pathfinding moves inside this regions navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. + When pathfinding moves inside this region's navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. </member> </members> <signals> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 966e24c537..b7591ed4f4 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -778,12 +778,14 @@ <argument index="0" name="node" type="Node" /> <description> Emitted when a child node enters the scene tree, either because it entered on its own or because this node entered with it. + This signal is emitted [i]after[/i] the child node's own [constant NOTIFICATION_ENTER_TREE] and [signal tree_entered]. </description> </signal> - <signal name="child_exited_tree"> + <signal name="child_exiting_tree"> <argument index="0" name="node" type="Node" /> <description> - Emitted when a child node exits the scene tree, either because it exited on its own or because this node exited. + Emitted when a child node is about to exit the scene tree, either because it is being removed or freed directly, or because this node is exiting the tree. + When this signal is received, the child [code]node[/code] is still in the tree and valid. This signal is emitted [i]after[/i] the child node's own [signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]. </description> </signal> <signal name="ready"> @@ -799,6 +801,7 @@ <signal name="tree_entered"> <description> Emitted when the node enters the tree. + This signal is emitted [i]after[/i] the related [constant NOTIFICATION_ENTER_TREE] notification. </description> </signal> <signal name="tree_exited"> @@ -809,15 +812,18 @@ <signal name="tree_exiting"> <description> Emitted when the node is still active but about to exit the tree. This is the right place for de-initialization (or a "destructor", if you will). + This signal is emitted [i]before[/i] the related [constant NOTIFICATION_EXIT_TREE] notification. </description> </signal> </signals> <constants> <constant name="NOTIFICATION_ENTER_TREE" value="10"> Notification received when the node enters a [SceneTree]. + This notification is emitted [i]before[/i] the related [signal tree_entered]. </constant> <constant name="NOTIFICATION_EXIT_TREE" value="11"> Notification received when the node is about to exit a [SceneTree]. + This notification is emitted [i]after[/i] the related [signal tree_exiting]. </constant> <constant name="NOTIFICATION_MOVED_IN_PARENT" value="12"> Notification received when the node is moved in the parent. diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index e6d5ea61da..aaf08dec2f 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -175,6 +175,10 @@ if argument.find("=") > -1: var key_value = argument.split("=") arguments[key_value[0].lstrip("--")] = key_value[1] + else: + # Options without an argument will be present in the dictionary, + # with the value set to an empty string. + arguments[argument.lstrip("--")] = "" [/gdscript] [csharp] var arguments = new Godot.Collections.Dictionary(); @@ -185,6 +189,12 @@ string[] keyValue = argument.Split("="); arguments[keyValue[0].LStrip("--")] = keyValue[1]; } + else + { + // Options without an argument will be present in the dictionary, + // with the value set to an empty string. + arguments[keyValue[0].LStrip("--")] = ""; + } } [/csharp] [/codeblocks] diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index eb2b681071..73413b379e 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -8,6 +8,7 @@ The size of a [PopupMenu] can be limited by using [member Window.max_size]. If the height of the list of items is larger than the maximum height of the [PopupMenu], a [ScrollContainer] within the popup will allow the user to scroll the contents. If no maximum size is set, or if it is set to 0, the [PopupMenu] height will be limited by its parent rect. All [code]set_*[/code] methods allow negative item index, which makes the item accessed from the last one. + [b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing [member ProjectSettings.gui/timers/incremental_search_max_interval_msec]. </description> <tutorials> </tutorials> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 281c9adfba..3d939a6926 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -307,6 +307,12 @@ <member name="audio/driver/output_latency.web" type="int" setter="" getter="" default="50"> Safer override for [member audio/driver/output_latency] in the Web platform, to avoid audio issues especially on mobile devices. </member> + <member name="audio/general/2d_panning_strength" type="float" setter="" getter="" default="1.0"> + The base strength of the panning effect for all AudioStreamPlayer2D nodes. The panning strength can be further scaled on each Node using [member AudioStreamPlayer2D.panning_strength]. + </member> + <member name="audio/general/3d_panning_strength" type="float" setter="" getter="" default="1.0"> + The base strength of the panning effect for all AudioStreamPlayer3D nodes. The panning strength can be further scaled on each Node using [member AudioStreamPlayer3D.panning_strength]. + </member> <member name="audio/video/video_delay_compensation_ms" type="int" setter="" getter="" default="0"> Setting to hardcode audio delay when playing video. Best to leave this untouched unless you know what you are doing. </member> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 6ae85ad242..8a30364ebe 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -31,6 +31,7 @@ [/csharp] [/codeblocks] To iterate over all the [TreeItem] objects in a [Tree] object, use [method TreeItem.get_next] and [method TreeItem.get_first_child] after getting the root through [method get_root]. You can use [method Object.free] on a [TreeItem] to remove it from the [Tree]. + [b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing [member ProjectSettings.gui/timers/incremental_search_max_interval_msec]. </description> <tutorials> </tutorials> diff --git a/doc/classes/World3D.xml b/doc/classes/World3D.xml index c57029a180..56a662d062 100644 --- a/doc/classes/World3D.xml +++ b/doc/classes/World3D.xml @@ -19,7 +19,7 @@ The World3D's [Environment]. </member> <member name="fallback_environment" type="Environment" setter="set_fallback_environment" getter="get_fallback_environment"> - The World3D's fallback_environment will be used if the World3D's [Environment] fails or is missing. + The World3D's fallback environment will be used if [member environment] fails or is missing. </member> <member name="navigation_map" type="RID" setter="" getter="get_navigation_map"> The [RID] of this world's navigation map. Used by the [NavigationServer3D]. diff --git a/doc/translations/ar.po b/doc/translations/ar.po index b68cb7cd59..8354193353 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -480,7 +480,7 @@ msgstr "" #, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3561,6 +3561,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30323,8 +30329,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36715,7 +36721,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36735,7 +36741,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47559,6 +47565,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66862,11 +66880,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74904,8 +74923,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ca.po b/doc/translations/ca.po index 5553d751ee..234b5cd60c 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -460,7 +460,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3510,6 +3510,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30240,8 +30246,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36596,7 +36602,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36616,7 +36622,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47404,6 +47410,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66681,11 +66699,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74702,8 +74721,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 3e7eb08673..72d9388f80 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -340,7 +340,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3390,6 +3390,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30117,8 +30123,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36473,7 +36479,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36493,7 +36499,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47281,6 +47287,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66558,11 +66576,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74579,8 +74598,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 388d3d7d4d..4b60e4d7c4 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -489,7 +489,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3895,6 +3895,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30713,8 +30719,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37117,7 +37123,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37137,7 +37143,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47977,6 +47983,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67339,11 +67357,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75388,8 +75407,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/de.po b/doc/translations/de.po index 6907c97794..640725bd9a 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -533,9 +533,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4403,6 +4404,15 @@ msgstr "" "die optional benannten 3D-Physikebenen verwendet." #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"Weist darauf hin, dass eine Integer-Eigenschaft eine Bitmaske ist, welche " +"die optional benannten 2D-Renderebenen verwendet." + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -32499,8 +32509,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -38957,7 +38967,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -38978,7 +38988,7 @@ msgstr "Das [NavigationMeshGenerator] Singleton." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -49925,6 +49935,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -69616,12 +69638,16 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +#, fuzzy +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" +"Die Animationen werden während des Physikframes (d. h. [method Node." +"_physics_process]) fortgesetzt." #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [AnimatedSprite] nodes animations." @@ -77758,9 +77784,10 @@ msgid "The World's [Environment]." msgstr "Das [Environment] der Welt." #: doc/classes/World.xml +#, fuzzy msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" "Das fallback_environment der Welt wird genutzt, sollte das [Environment] der " "Welt nicht existieren oder nicht geladen werden können." diff --git a/doc/translations/el.po b/doc/translations/el.po index 1ec00b61aa..e19557ebb4 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -355,7 +355,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3405,6 +3405,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30168,8 +30174,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36554,7 +36560,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36574,7 +36580,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47385,6 +47391,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66688,11 +66706,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74729,8 +74748,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/es.po b/doc/translations/es.po index e5276e7f7c..4c4982ad59 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -526,7 +526,7 @@ msgstr "" #, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4459,6 +4459,15 @@ msgstr "" "opcionalmente nombrada, capas fisicas 3D." #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"Sugiere que una propiedad entera es una máscara de bits usando las, " +"opcionalmente nombradas, capas de representación 2D." + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -39964,9 +39973,10 @@ msgstr "" "code], se libera el estado del botón." #: doc/classes/InputEventJoypadButton.xml +#, fuzzy msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" "Representa la presión que el usuario ejerce sobre el botón con su dedo, si " "el controlador lo soporta. Va de [code]0[/code] a [code]1[/code]." @@ -48108,7 +48118,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -48129,7 +48139,7 @@ msgstr "El recurso [Mesh] para la instancia." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -62813,6 +62823,18 @@ msgid "" msgstr "" #: doc/classes/ProjectSettings.xml +msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml #, fuzzy msgid "" "Search path for project-specific script templates. Godot will search for " @@ -87439,11 +87461,14 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "Este habilitador detendrá los nodos [GPUParticles2D]." #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +#, fuzzy +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "Este habilitador detendrá la función _process del padre." #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +#, fuzzy +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "Este habilitador detendrá la función del _physics_process del padre." #: doc/classes/VisibilityEnabler2D.xml @@ -97788,8 +97813,8 @@ msgstr "El [Environment] del World." #: doc/classes/World.xml #, fuzzy msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" "El fallback_environment del World3D se usará si el [Environment] de World3D " "falla o falta." diff --git a/doc/translations/fa.po b/doc/translations/fa.po index 46b4d9600e..ee4b608fbd 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -492,7 +492,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3829,6 +3829,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30559,8 +30565,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36921,7 +36927,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36941,7 +36947,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47741,6 +47747,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67022,11 +67040,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75043,8 +75062,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/fi.po b/doc/translations/fi.po index 5be805e91a..108f9f7780 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -422,7 +422,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3472,6 +3472,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30251,8 +30257,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36639,7 +36645,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36659,7 +36665,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47470,6 +47476,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66781,11 +66799,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74826,8 +74845,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/fil.po b/doc/translations/fil.po index 6e76d65426..d34766797c 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -356,7 +356,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3406,6 +3406,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30136,8 +30142,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36492,7 +36498,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36512,7 +36518,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47300,6 +47306,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66577,11 +66595,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74598,8 +74617,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 60d840e7ab..98f4921109 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-06-16 18:57+0000\n" +"PO-Revision-Date: 2022-06-19 11:54+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" @@ -70,7 +70,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -548,9 +548,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4496,6 +4497,15 @@ msgstr "" "couches de physique 3D optionnellement nommées." #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"Indique qu'une propriété nombre entier est un masque de bits utilisant les " +"couches de rendu 2D optionnellement nommées." + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -4984,6 +4994,8 @@ msgid "" "Returns the center of the [AABB], which is equal to [member position] + " "([member size] / 2)." msgstr "" +"Retourne le centre du [AABB], qui est égal à [member position] + ([member " +"size] / 2)." #: doc/classes/AABB.xml msgid "Gets the position of the 8 endpoints of the [AABB] in space." @@ -5165,6 +5177,10 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne le label utilisé pour le texte intégré.\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud interne nécessaire, le retirer et " +"le libérer peut causer un plantage. Si vous voulez le cacher lui ou l'un de " +"ses enfants, utilisez plutôt [membre CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -5173,6 +5189,10 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne l'instance du [Button] \"OK\".\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud interne nécessaire, le retirer et " +"le libérer peut causer un plantage. Si vous voulez le cacher lui ou l'un de " +"ses enfants, utilisez plutôt [membre CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -7636,6 +7656,14 @@ msgid "" "animation_finished]. If you want to skip animation and emit the signal, use " "[method advance]." msgstr "" +"Avance la lecture de l'animation à la position [code]secondes[/code] dans le " +"temps (en secondes). Si [code]update[/code] est [code]true[/code], " +"l'animation se mettra à jour, sinon elle le sera au moment du traitement. " +"Les événements entre la trame actuel et la position [code]secondes[/code] " +"sont ignorés.\n" +"[b]Note :[/b] Aller à la fin de l'animation n'émet pas le signal [signal " +"animation_finished]. Si vous voulez sauter l'animation et émettre le signal, " +"utilisez plutôt [method advance]." #: doc/classes/AnimationPlayer.xml msgid "" @@ -15821,6 +15849,33 @@ msgid "" "parameters must have angles specified as [i]radians[/i]. To convert degrees " "to radians, use [method @GDScript.deg2rad]." msgstr "" +"La classe de base de tout ce qui est en 2D. Les objets du canevas sont placé " +"dans une arborescence; les enfants héritent et étendent la transformation du " +"parent. [CanvasItem] est hérité par [Control] pour tout ce qui concerne " +"l'interface utilisateur, et par [Node2D] pour tout ce qui concerne le moteur " +"2D.\n" +"Tout [CanvasItem] peut servir à dessiner. Pour cela, [méthode update] doit " +"être appelée, puis [constant NOTIFICATION_DRAW] sera reçu lors du temps " +"inoccupé pour la requête de dessin. En raison de cela, les éléments des " +"canevas n'ont pas besoin d'être redessinés à chaque trame, ce qui améliore " +"considérablement les performances. Plusieurs fonctions pour dessiner dans un " +"[CanvasItem] sont fournies (voir [code]draw_*[/code]). Cependant, elles ne " +"peuvent être utilisés qu'à l'intérieur des fonctions virtuelles [method " +"Object._notification], des signaux ou de [method _draw].\n" +"Les objets des canevas sont dessinés dans l'ordre de l'arborescence. Par " +"défaut, les enfants sont au-dessus de leurs parents afin que le [CanvasItem] " +"racine soit dessiné en arrière fond. Ce comportement peut être modifié pour " +"chaque élément.\n" +"Un [CanvasItem] peut aussi être caché, ce qui cachera aussi ses enfants. Il " +"existe de nombreuses façons de modifier des paramètres tels que la " +"modulation (pour lui-même et ses enfants) et la modulation de ce seul " +"élément, ainsi que son mode de mélange.\n" +"Enfin, une notification de transformation peut être demandée, ce qui " +"signalera au nÅ“ud que sa position globale a changé au cas où l'arborescence " +"parente a changé.\n" +"[b]Note :[/b] Sauf exception, toutes les paramètres d'angle doivent être des " +"spécifiés en [i]radians[/i]. Pour convertir des degrés en radians, utilisez " +"[méthod @GDScript.deg2rad]" #: doc/classes/CanvasItem.xml doc/classes/CanvasLayer.xml #: doc/classes/InputEvent.xml doc/classes/Viewport.xml @@ -15852,12 +15907,28 @@ msgid "" "mipmaps to perform antialiasing. 2D batching is also still supported with " "those antialiased lines." msgstr "" +"Dessine un arc non rempli entre les deux angles donnés. Plus la valeur " +"[code]point_count[/code] est grande, plus la courbe est lisse. Voir aussi " +"[method draw_circle].\n" +"[b]Note :[/b] Le dessin de ligne n'est pas accéléré par lots si " +"[code]antialiased[/code] est [code]true[/code].\n" +"[b]Note :[/b] En raison de son fonctionnement, l'anticrénelage calculé en " +"interne n'est pas correct pour les lignes semi-transparents voire peut ne " +"pas fonctionner sur certaines plateformes. Vous pouvez corriger ce problème " +"en installant le greffon [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] puis créez un nÅ“ud " +"\"AntialiasedPolygon2D\". Ce nÅ“ud utilise des texture avec des mipmaps " +"personnalisés pour afficher l'anticrénelage. L'accélération par lot est " +"toujours supporté même avec les lignes avec anticrénelage." #: doc/classes/CanvasItem.xml msgid "" "Draws a string character using a custom font. Returns the advance, depending " "on the character width and kerning with an optional next character." msgstr "" +"Dessine un caractère d'une chaîne en utilisant une police personnalisée. " +"Retourne l'avancement, en fonction de la largeur de caractère et du kerning " +"avec un caractère optionnel suivant." #: doc/classes/CanvasItem.xml msgid "" @@ -15869,6 +15940,14 @@ msgid "" "create an AntialiasedRegularPolygon2D node. That node relies on a texture " "with custom mipmaps to perform antialiasing." msgstr "" +"Dessine un cercle coloré rempli. Voir aussi [method draw_arc], [method " +"draw_polyline] et [method draw_polygon].\n" +"[b]Note :[/b] L'anticrénelage intégré n'est pas prévu pour [méthod " +"draw_circle]. Vous pouvez corriger ce problème en installant le greffon " +"[url=https://github.com/godot-extended-libraries/godot-antialiased-" +"line2d]Antialiased Line2D[/url] puis créez un nÅ“ud " +"AntialiasedRegularPolygon2D. Ce nÅ“ud utilise des texture avec des mipmaps " +"personnalisés pour afficher l'anticrénelage." #: doc/classes/CanvasItem.xml msgid "" @@ -15882,6 +15961,16 @@ msgid "" "AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " "to perform antialiasing." msgstr "" +"Dessine un polygone coloré avec un nombre donné de points, qu'il soit " +"convexe ou concave. Contrairement à [method draw_polygon], une seule couleur " +"doit être spécifiée pour tout le polygone.\n" +"[b]Note :[/b] En raison de son fonctionnement, l'anticrénelage calculé en " +"interne n'est pas correct pour les polygones semi-transparents voire peut ne " +"pas fonctionner sur certaines plateformes. Vous pouvez corriger ce problème " +"en installant le greffon [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] puis créez un nÅ“ud " +"\"AntialiasedPolygon2D\". Ce nÅ“ud utilise des texture avec des mipmaps " +"personnalisés pour afficher l'anticrénelage." #: doc/classes/CanvasItem.xml msgid "" @@ -15898,6 +15987,19 @@ msgid "" "perform antialiasing. 2D batching is also still supported with those " "antialiased lines." msgstr "" +"Dessine une ligne d'un point 2D à un autre, avec une couleur et une " +"épaisseur données. L'anticrénelage peut être activé en option. Voir aussi " +"[method draw_multiline] et [method draw_polyline].\n" +"[b]Note :[/b] Le dessin de ligne n'est pas accéléré par lots si " +"[code]antialiased[/code] est [code]true[/code].\n" +"[b]Note :[/b] En raison de son fonctionnement, l'anticrénelage calculé en " +"interne n'est pas correct pour les lignes semi-transparents voire peut ne " +"pas fonctionner sur certaines plateformes. Vous pouvez corriger ce problème " +"en installant le greffon [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] puis créez un nÅ“ud " +"\"AntialiasedPolygon2D\". Ce nÅ“ud utilise des texture avec des mipmaps " +"personnalisés pour afficher l'anticrénelage. L'accélération par lot est " +"toujours supporté même avec les lignes avec anticrénelage." #: doc/classes/CanvasItem.xml msgid "" @@ -16480,6 +16582,9 @@ msgid "" "[b]Note:[/b] This property is only used and visible in the editor if [member " "particles_animation] is [code]true[/code]." msgstr "" +"Si [code]true[/code], l'animation des particules boucle.\n" +"[b]Note :[/b] Cette propriété est uniquement utilisée et visible dans " +"l'éditeur si [member particles_animation] est [code]true[/code]." #: doc/classes/CanvasItemMaterial.xml msgid "" @@ -16488,6 +16593,10 @@ msgid "" "[b]Note:[/b] This property is only used and visible in the editor if [member " "particles_animation] is [code]true[/code]." msgstr "" +"Le nombre de lignes dans la feuille de textures assigné comme [Texture] pour " +"un [Particles2D] ou un [CPUParticles2D].\n" +"[b]Note :[/b] Cette propriété est uniquement utilisée et visible dans " +"l'éditeur si [member particles_animation] est [code]true[/code]." #: doc/classes/CanvasItemMaterial.xml msgid "" @@ -16498,6 +16607,13 @@ msgid "" "This property (and other [code]particles_anim_*[/code] properties that " "depend on it) has no effect on other types of nodes." msgstr "" +"Si [code]true[/code], cela active les fonctionnalités d'animation basées sur " +"des feuilles de textures lorsqu'elles sont affectées aux nÅ“uds [Particles2D] " +"et [CPUParticles2D]. Le [member ParticlesMaterial.anim_speed] ou [member " +"CPUParticles2D.anim_speed] doit être une valeur positive pour l'animation à " +"jouer.\n" +"Cette propriété (et les autres propriétés [code]particles_anim_*[/code] qui " +"en dépendent) n'a aucun effet sur d'autres types de nÅ“uds." #: doc/classes/CanvasItemMaterial.xml msgid "" @@ -16526,6 +16642,13 @@ msgid "" "index 1 will be drawn above. This is very useful for HUDs (in layer 1+ or " "above), or backgrounds (in layer -1 or below)." msgstr "" +"Le calque de dessin du canevas. Les nÅ“uds [CanvasItem] qui sont des enfants " +"directs ou indirects d'un [CanvasLayer] seront dessinés dans ce calque. Le " +"calque est un index numérique qui définit l'ordre d'affichage. La scène 2D " +"par défaut fait le rendu avec l'index 0, donc un [CanvasLayer] avec index -1 " +"sera dessiné en-dessous, et un avec l'index 1 sera dessiné par dessus. Ceci " +"est très utile pour les interfaces (dans la calque +1 ou au-dessus,) ou les " +"arrière-plans (dans un calque -1 ou en dessous)." #: doc/classes/CanvasLayer.xml msgid "Canvas layers" @@ -16915,6 +17038,8 @@ msgid "" "The [StyleBox] to display as a background when the [CheckBox] is hovered and " "pressed." msgstr "" +"La [StyleBox] à afficher en arrière-plan lorsque la [CheckBox] est survolée " +"et appuyée." #: doc/classes/CheckBox.xml doc/classes/CheckButton.xml msgid "The [StyleBox] to display as a background." @@ -16941,6 +17066,14 @@ msgid "" "See also [BaseButton] which contains common properties and methods " "associated with this node." msgstr "" +"CheckButton est un bouton à bascule affiché avec une coche. Il est semblable " +"à [CheckBox] dans ses fonctionnalités, mais son apparence est différente. " +"Pour suivre les modèles UX établis, il est recommandé d'utiliser CheckButton " +"pour les effet [b]immédiat[/b] d'une action. Par exemple, il devrait être " +"utilisé si le basculement active/désactive un réglage sans nécessiter que " +"l'utilisateur appuie sur un bouton de confirmation.\n" +"Voir aussi [BaseButton] qui contient des propriétés et des méthodes communes " +"associées à ce nÅ“ud." #: doc/classes/CheckButton.xml msgid "The [CheckButton] text's font color." @@ -21346,6 +21479,10 @@ msgid "" "expand size flags. Use with [member size_flags_horizontal] and [member " "size_flags_vertical]." msgstr "" +"Précise au [Container] parent de centrer le nÅ“ud en son milieu. Il centre le " +"contrôle basé sur sont rectangle englobant, donc ça ne fonctionne pas avec " +"les drapeaux de remplissage ou d'extension. Utilisez avec [membre " +"size_flags_horizontal] et [membre size_flags_vertical]." #: doc/classes/Control.xml msgid "" @@ -21354,6 +21491,10 @@ msgid "" "flags. Use with [member size_flags_horizontal] and [member " "size_flags_vertical]." msgstr "" +"Précise au [Container] parent d'aligner le nÅ“ud sur la fin, soit en bas, " +"soit sur bord droit. Il ne fonctionne pas avec les drapeaux de remplissage " +"ou d'extension. Utilisez avec [membre size_flags_horizontal] et [membre " +"size_flags_vertical]." #: doc/classes/Control.xml msgid "" @@ -21363,6 +21504,12 @@ msgid "" "automatically marked as handled, and they will not propagate further to " "other controls. This also results in blocking signals in other controls." msgstr "" +"Le contrôle recevra les événements d'entrée de la souris via [method " +"gui_input] si vous cliquez dessus. Et le contrôle recevra les signaux " +"[signal mouse_entered] et [signal mouse_exited]. Ces événements sont " +"automatiquement marqués comme traités, et ils ne se propagent pas vers les " +"autres contrôles. Cela permet également de bloquer la propagation de ces " +"signaux à partir d'autres contrôles." #: doc/classes/Control.xml msgid "" @@ -21375,6 +21522,14 @@ msgid "" "all, the event will still be handled automatically, so unhandled input will " "not be fired." msgstr "" +"La contrôle recevra les événements d'entrée de la souris via [method " +"gui_input] si vous cliquez dessus. Et le contrôle recevra les signaux " +"[signal mouse_entered] et [signal mouse_exited]. Si ce contrôle ne traite " +"pas l'événement, cet événement sera envoyé au contrôle parent (s'il existe), " +"et ainsi de suite jusqu'à ce qu'il n'y ait plus de contrôle parent pour le " +"traiter. Cela permet également aux signaux d'être émis dans d'autres " +"contrôles. Même si aucun contrôle ne l'a traité, l'événement sera toujours " +"traité automatiquement, alors les entrées non traitées ne seront pas émises." #: doc/classes/Control.xml msgid "" @@ -21384,24 +21539,35 @@ msgid "" "receiving these events or firing the signals. Ignored events will not be " "handled automatically." msgstr "" +"Le contrôle ne recevra pas d'événements d'entrée de la souris via [méthode " +"gui_input]. Le contrôle ne recevra pas non plus les signaux [signal " +"mouse_entered] et [signal mouse_exited]. Cela ne bloquera pas d'autres " +"contrôles de recevoir ces événements et n'émettra pas les signaux. Les " +"événements ignorés ne seront pas traités automatiquement." #: doc/classes/Control.xml msgid "" "The control will grow to the left or top to make up if its minimum size is " "changed to be greater than its current size on the respective axis." msgstr "" +"Le contrôle va croître à gauche ou en haut pour compenser si sa taille " +"minimale est plus grande que sa taille actuelle selon l'axe correspondant." #: doc/classes/Control.xml msgid "" "The control will grow to the right or bottom to make up if its minimum size " "is changed to be greater than its current size on the respective axis." msgstr "" +"Le contrôle va croître à droite ou en bas pour compenser si sa taille " +"minimale est plus grande que sa taille actuelle selon l'axe correspondant." #: doc/classes/Control.xml msgid "" "The control will grow in both directions equally to make up if its minimum " "size is changed to be greater than its current size." msgstr "" +"Le contrôle va croître dans les deux directions de façon égale pour " +"compenser si sa taille minimale est plus grande que sa taille actuelle." #: doc/classes/Control.xml msgid "" @@ -25250,42 +25416,59 @@ msgid "" "The 3D editor. If this feature is disabled, the 3D editor won't display but " "3D nodes will still display in the Create New Node dialog." msgstr "" +"L'éditeur 3D. Si cette fonctionnalité est désactivée, l'éditeur 3D ne sera " +"pas affiché mais les nÅ“uds 3D seront toujours affichés dans le dialogue " +"\"Créer un nouveau nÅ“ud\"." #: doc/classes/EditorFeatureProfile.xml msgid "" "The Script tab, which contains the script editor and class reference " "browser. If this feature is disabled, the Script tab won't display." msgstr "" +"L'onglet \"Script\", qui contient l'éditeur de script et le navigateur de " +"documentation des classes. Si cette fonctionnalité est désactivée, " +"l'affichage de l'onglet \"Script\" ne sera pas affiché." #: doc/classes/EditorFeatureProfile.xml msgid "" "The AssetLib tab. If this feature is disabled, the AssetLib tab won't " "display." msgstr "" +"L'onglet AssetLib. Si cette caractéristique est désactivée, l'onglet " +"AssetLib ne sera pas affiché." #: doc/classes/EditorFeatureProfile.xml msgid "" "Scene tree editing. If this feature is disabled, the Scene tree dock will " "still be visible but will be read-only." msgstr "" +"L'éditeur de l'arborescence de la scène. Si cette caractéristique est " +"désactivée, le dock de l'arborescence de la scène sera toujours visible, " +"mais ne pourra pas être modifié." #: doc/classes/EditorFeatureProfile.xml msgid "" "The Node dock. If this feature is disabled, signals and groups won't be " "visible and modifiable from the editor." msgstr "" +"Le dock des NÅ“uds. Si cette caractéristique est désactivée, les signaux et " +"les groupes ne seront pas affichés ni modifiables dans l'éditeur." #: doc/classes/EditorFeatureProfile.xml msgid "" "The FileSystem dock. If this feature is disabled, the FileSystem dock won't " "be visible." msgstr "" +"Le dock de système de fichiers. Si cette caractéristique est désactivée, le " +"dock de système de fichiers ne sera pas visible." #: doc/classes/EditorFeatureProfile.xml msgid "" "The Import dock. If this feature is disabled, the Import dock won't be " "visible." msgstr "" +"Le dock d'importation. Si cette caractéristique est désactivée, le dock " +"d'importation ne sera pas visible." #: doc/classes/EditorFeatureProfile.xml doc/classes/SpatialMaterial.xml msgid "Represents the size of the [enum Feature] enum." @@ -27196,6 +27379,17 @@ msgid "" "[code]receiver_func[/code] will still be called, but the preview will be " "null." msgstr "" +"Met la [code]resource[/code] modifiée en attente pour être prévisualisée. " +"Une fois la prévisualisation prête, la méthode [code]receiver_func[/code] du " +"[code]receiver[/code] sera appelée. Le [code]receiver_func[/code] doit " +"prendre les quatre arguments suivants : le chemin (\"path\") [String], la " +"[Texture] de l'aperçu (\"preview\"), la [Texture] de la vignette " +"(\"thumbnail_preview\") et les données personnées (\"userdata\") sous forme " +"de [Variant]. [code]userdata[/code] peut continir n'importe quel type de " +"données, et sera retourné quand [code]receiver_func[/code] sera appelé.\n" +"[b]Note :[/b] S'il n'était pas possible de créer la prévisualisation, " +"[code]receiver_func[/code] sera toujours appelé, mais la prévisualisation " +"sera \"null\"." #: doc/classes/EditorResourcePreview.xml msgid "" @@ -27209,6 +27403,18 @@ msgid "" "[code]receiver_func[/code] will still be called, but the preview will be " "null." msgstr "" +"Met le fichier de ressource situé à [code]path[/code] en attente pour être " +"prévisualisé. Une fois la prévisualisation prête, la méthode " +"[code]receiver_func[/code] du [code]receiver[/code] sera appelée. Le " +"[code]receiver_func[/code] doit prendre les quatre arguments suivants : le " +"chemin (\"path\") [String], la [Texture] de l'aperçu (\"preview\"), la " +"[Texture] de la vignette (\"thumbnail_preview\") et les données personnées " +"(\"userdata\") sous forme de [Variant]. [code]userdata[/code] peut continir " +"n'importe quel type de données, et sera retourné quand [code]receiver_func[/" +"code] sera appelé.\n" +"[b]Note :[/b] S'il n'était pas possible de créer la prévisualisation, " +"[code]receiver_func[/code] sera toujours appelé, mais la prévisualisation " +"sera \"null\"." #: doc/classes/EditorResourcePreview.xml msgid "Removes a custom preview generator." @@ -27484,10 +27690,19 @@ msgid "" "[b]Note:[/b] You must set the [member script_owner] for the custom context " "menu items to work." msgstr "" +"Similaire à [EditorResourcePicker], ce nÅ“ud [Control] est utilisé dans le " +"dock d'inspecteur de l'éditeur, mais seulement pour modifier la propriété " +"[code]script[/code] d'un [Node]. Les options par défaut pour créer de " +"nouvelles ressources de tous les sous-types possibles sont remplacées par " +"des boutons dédiés qui ouvrent le dialogue \"Attaché un Script\". Peut être " +"utilisé avec [EditorInspectorPlugin] pour recréer le même comportement.\n" +"[b]Note :[/b] Vous devez définir le [member script_owner] pour les éléments " +"de menu contextuel personnalisés fonctionnent." #: doc/classes/EditorScriptPicker.xml msgid "The owner [Node] of the script property that holds the edited resource." msgstr "" +"Le [Node] propriétaire de la propriété Script qui a la ressource modifiée." #: doc/classes/EditorSelection.xml msgid "Manages the SceneTree selection in the editor." @@ -27558,6 +27773,28 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_editor_settings]." msgstr "" +"L'objet qui détient les paramètres de l'éditeur indépendant du projet. Ces " +"paramètres sont généralement visibles dans le menu [b]Éditeur > Paramètres " +"de l'éditeur[/b].\n" +"Les noms de propriété utilisent des délimiteurs avec des barres obliques (\"/" +"\") pour distinguer les sections. Les valeurs de réglage peuvent être de " +"tout type [Variant]. Il est recommandé d'utiliser la casse [code]snake_case[/" +"code] pour que les paramètres de l'éditeur soient compatibles avec l'éditeur " +"Godot lui-même.\n" +"L'accès aux paramètres peut être fait en utilisant les méthodes suivantes :\n" +"[codeblock]\n" +"# `settings.set(\"une/propriete\", value)` fonctionne aussi puisque cette " +"classe surcharge `_set()` en interne.\n" +"settings.set_setting(\"une/propriete\",value)\n" +"\n" +"# `settings.get(\"une/propriete\", value)` fonctionne aussi puisque cette " +"classe surcharge `_get()` en interne.\n" +"settings.get_setting(\"une/propriete\")\n" +"\n" +"var list_of_settings = settings.get_property_list()\n" +"[/codeblock]\n" +"[b]Note :[/b] Cette classe ne devrait être pas instanciée. Accédez plutôt au " +"singleton [method EditorInterface.get_editor_settings]" #: doc/classes/EditorSettings.xml msgid "" @@ -27580,10 +27817,29 @@ msgid "" "editor_settings.add_property_info(property_info)\n" "[/codeblock]" msgstr "" +"Ajoute une info de propriété personnalisée à une propriété. Le dictionnaire " +"doit contenir :\n" +"- [code]name[/code]: [String] (le nom de la propriété)\n" +"- [code]type[/code]: [int] (voir [enum Variant.Type])\n" +"- en option [code]hint[/code]: [int] (voir [enum PropertyHint]) et " +"[code]hint_string[/code]: [String]\n" +"[b]Exemple :[/b]\n" +"[codeblock]\n" +"editor_settings.set(\"category/property_name\", 0)\n" +"\n" +"var property_info = {\n" +" \"name\": \"category/property_name\",\n" +" \"type\": TYPE_INT,\n" +" \"hint\": PROPERTY_HINT_ENUM,\n" +" \"hint_string\": \"un,deux,trois\"\n" +"}\n" +"\n" +"editor_settings.add_property_info(property_info)\n" +"[/codeblock]" #: doc/classes/EditorSettings.xml msgid "Erases the setting whose name is specified by [code]property[/code]." -msgstr "" +msgstr "Efface le réglage nommé [code]property[/code]." #: doc/classes/EditorSettings.xml msgid "Returns the list of favorite files and directories for this project." @@ -27602,12 +27858,17 @@ msgid "" "subdirectory inside the settings path where project-specific settings are " "saved." msgstr "" +"Retourne le chemin des paramètres spécifiques à ce projet. Les projets ont " +"tous un sous-dossier unique où les paramètres spécifiques au projet sont " +"sauvegardés." #: doc/classes/EditorSettings.xml msgid "" "Returns the list of recently visited folders in the file dialog for this " "project." msgstr "" +"Retourne la liste des dossiers récemment visités dans le dialogue des " +"fichiers de ce projet." #: doc/classes/EditorSettings.xml msgid "" @@ -27622,6 +27883,11 @@ msgid "" "[code]settings/tmp[/code] - Used for temporary storage of files\n" "[code]settings/templates[/code] - Where export templates are located" msgstr "" +"Retourne le chemin des réglages généraux du moteur. Dans ce chemin, vous " +"pouvez trouver des chemins standards tels que :\n" +"[code]settings/tmp[/code] - L'emplacement où sont stockés les fichiers " +"temporaires\n" +"[code]settings/templates[/code] - L'emplacement où sont stockés les modèles" #: doc/classes/EditorSettings.xml msgid "" @@ -27991,6 +28257,14 @@ msgid "" "plug-n-play experience. A custom VCS plugin is supposed to inherit from " "[EditorVCSInterface] and override these virtual functions." msgstr "" +"Définit l'API que l'éditeur utilise pour extraire des informations du VCS " +"utilisé. La mise en Å“uvre de cette API est incluse dans les greffons VCS, " +"qui sont des scripts qui héritent de [EditorVCSInterface] et sont liés (à la " +"demande) à au singleton de [EditorVCSInterface]. Plutôt qu'accomplir la " +"tâche elle-même, toutes les fonctions virtuelles énumérées ci-dessous " +"appellent les fonctions surchargées internes dans les greffons VCS pour " +"fournir un fonctionnement automatique. Un greffon VCS personnalisé devrait " +"hériter de [EditorVCSInterface] et surcharger ces fonctions virtuelles." #: doc/classes/EditorVCSInterface.xml #, fuzzy @@ -28165,6 +28439,16 @@ msgid "" "created. [code]offset_minutes[/code] is the timezone offset in minutes, " "recorded from the system timezone where the commit was created." msgstr "" +"Une fonction d'aide pour créer un [Dictionnaire] des données d'un commit. " +"[code]msg[/code] est le message de commit. [code]author[/code] est une " +"simple chaîne intelligible contenant tous les détails de l'auteur, par " +"exemple son e-mail et le nom comme configurés dans le VCS. [code]id[/code] " +"est le code de hachage du commit, dans lequel votre VCS peut fournir un " +"identifiant unique pour chaque commit. [code]unix_timestamp[/code] est " +"l'horodatage Unix basé sur UTC de la date de création de la commit. " +"[code]offset_minutes[/code] is le décalage horaire par rapport à UTC, in " +"minutes, enregistré depuis la zone horaire du système lors de la création du " +"commit." #: doc/classes/EditorVCSInterface.xml msgid "" @@ -28279,6 +28563,15 @@ msgid "" "[code]project_managers[/code] - Array of Strings, project manager names\n" "[code]developers[/code] - Array of Strings, developer names" msgstr "" +"Retourne les informations des auteurs du moteur dans un dictionnaire.\n" +"[code]lead_developers[/code] - Un tableau de String, avec le nom de " +"développeurs principaux\n" +"[code]fondateurs[/code] - Un tableau de String, le nom des " +"fondateurs\n" +"[code]project_managers[/code] - Un tableau de String, le nom des chefs de " +"projet\n" +"[code]developers[/code] - Un tableau de String, le nom de " +"développeurs" #: doc/classes/Engine.xml msgid "" @@ -28288,6 +28581,11 @@ msgid "" "[code]copyright[/code], [code]license[/code]} describing subsections of the " "component" msgstr "" +"Retourne un Array d'information sur le copyright dans un dictionnaire.\n" +"[code]name[/code] - String, le nom du composant\n" +"[code]parts[/code] - Un table de Dictionary {[code]files[/code], " +"[code]copyright[/code], [code]license[/code]} décrivant chaque paragraphe de " +"la licence du composant" #: doc/classes/Engine.xml msgid "" @@ -28297,6 +28595,11 @@ msgid "" "[code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/" "code], [code]bronze_donors[/code]}" msgstr "" +"Retourne un Dictionnaire des Arrays de noms des donateurs.\n" +"{[code]platinum_sponsors[/code], [code]gold_sponsors[/code], " +"[code]silver_sponsors[/code], [code]bronze_sponsors[/code], " +"[code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/" +"code], [code]bronze_donors[/code]}" #: doc/classes/Engine.xml msgid "" @@ -36508,8 +36811,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -43582,7 +43885,7 @@ msgstr "Détermine si le [NavigationMeshInstance] est actif ou non." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -43602,7 +43905,7 @@ msgstr "La ressource [NavigationMesh] à utiliser." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -55594,6 +55897,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -76819,11 +77134,14 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "Cet activateur arrêtera les nÅ“uds [Particles2D]." #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +#, fuzzy +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "Cet activateur arrêtera la fonction _process du parent." #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +#, fuzzy +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "Cet activateur arrêtera la fonction _physics_process du parent." #: doc/classes/VisibilityEnabler2D.xml @@ -85713,8 +86031,8 @@ msgstr "L'[Environment] du World." #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/gl.po b/doc/translations/gl.po index f11e8ba6d7..92ad8f3f22 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -348,7 +348,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3398,6 +3398,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30125,8 +30131,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36481,7 +36487,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36501,7 +36507,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47289,6 +47295,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66566,11 +66584,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74587,8 +74606,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/hi.po b/doc/translations/hi.po index d160c87d04..147b3b4099 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -347,7 +347,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3397,6 +3397,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30124,8 +30130,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36480,7 +36486,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36500,7 +36506,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47288,6 +47294,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66565,11 +66583,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74586,8 +74605,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/hu.po b/doc/translations/hu.po index 7388321bf7..cda670b22d 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -10,12 +10,13 @@ # balintmaci <balintmaci@gmail.com>, 2021. # Balázs Püspök-Kiss <pkblazsak@gmail.com>, 2021. # Szevin <kevingeiger25@gmail.com>, 2022. +# 6Leoo6 <leo.takacs@yahoo.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-01-26 23:53+0000\n" -"Last-Translator: Szevin <kevingeiger25@gmail.com>\n" +"PO-Revision-Date: 2022-06-19 11:54+0000\n" +"Last-Translator: 6Leoo6 <leo.takacs@yahoo.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/hu/>\n" "Language: hu\n" @@ -23,7 +24,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.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -47,7 +48,7 @@ msgstr "Téma Tulajdonságai" #: doc/tools/make_rst.py msgid "Signals" -msgstr "Jelzések" +msgstr "jelek" #: doc/tools/make_rst.py msgid "Enumerations" @@ -365,7 +366,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3415,6 +3416,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30142,8 +30149,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36498,7 +36505,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36518,7 +36525,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47306,6 +47313,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66583,11 +66602,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74604,8 +74624,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/id.po b/doc/translations/id.po index c51e610f3d..da727b40e7 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -502,7 +502,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3808,6 +3808,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30549,8 +30555,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36925,7 +36931,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36945,7 +36951,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47755,6 +47761,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67040,11 +67058,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75067,8 +75086,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/is.po b/doc/translations/is.po index 4ef90cac62..ec65de5cfb 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -347,7 +347,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3397,6 +3397,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30124,8 +30130,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36480,7 +36486,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36500,7 +36506,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47288,6 +47294,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66565,11 +66583,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74586,8 +74605,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/it.po b/doc/translations/it.po index 6b71c5afb5..f1a35b0de3 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -515,9 +515,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4390,6 +4391,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -31313,8 +31320,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37738,7 +37745,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37759,7 +37766,7 @@ msgstr "Il singleton [EditorNavigationMeshGenerator]." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -48613,6 +48620,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -68007,11 +68026,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -76077,8 +76097,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ja.po b/doc/translations/ja.po index 66474a0f66..8bb3d16322 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -486,9 +486,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4349,6 +4350,15 @@ msgstr "" "クã§ã‚ã‚‹ã“ã¨ã®ãƒ’ント。" #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"整数プãƒãƒ‘ティãŒã€ã‚ªãƒ—ションã§æŒ‡å®šã•ã‚ŒãŸ 2D レンダー レイヤーを使用ã—ãŸãƒ“ット" +"マスクã§ã‚ã‚‹ã“ã¨ã®ãƒ’ント。" + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -33372,8 +33382,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -39880,7 +39890,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -39901,7 +39911,7 @@ msgstr "[NavigationMeshGenerator] シングルトン。" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -50820,6 +50830,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -70609,12 +70631,16 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +#, fuzzy +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" +"アニメーションã¯ç‰©ç†ãƒ•ãƒ¬ãƒ¼ãƒ ä¸ã«é€²è¡Œã—ã¾ã™ (ã™ãªã‚ã¡ [method Node." +"_physics_process])。" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [AnimatedSprite] nodes animations." @@ -78744,8 +78770,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ko.po b/doc/translations/ko.po index 99843f88e0..e3dd797c36 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -488,7 +488,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3568,6 +3568,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30434,8 +30440,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36827,7 +36833,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36847,7 +36853,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47796,6 +47802,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67111,11 +67129,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75153,8 +75172,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/lt.po b/doc/translations/lt.po index ca881ec842..fc686e4bb2 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -357,7 +357,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3407,6 +3407,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30134,8 +30140,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36490,7 +36496,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36510,7 +36516,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47298,6 +47304,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66575,11 +66593,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74596,8 +74615,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 7b6380006f..27ebbed1af 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -362,7 +362,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3412,6 +3412,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30142,8 +30148,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36498,7 +36504,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36518,7 +36524,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47306,6 +47312,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66583,11 +66601,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74604,8 +74623,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/mr.po b/doc/translations/mr.po index c13c395265..caaec0b107 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -345,7 +345,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3395,6 +3395,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30122,8 +30128,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36478,7 +36484,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36498,7 +36504,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47286,6 +47292,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66563,11 +66581,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74584,8 +74603,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 6f8e94abc8..6bdd8e4b1e 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -357,7 +357,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3407,6 +3407,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30134,8 +30140,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36490,7 +36496,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36510,7 +36516,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47298,6 +47304,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66575,11 +66593,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74596,8 +74615,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ne.po b/doc/translations/ne.po index a07c777543..d7f2a9f0cb 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -345,7 +345,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3395,6 +3395,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30122,8 +30128,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36478,7 +36484,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36498,7 +36504,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47286,6 +47292,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66563,11 +66581,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74584,8 +74603,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/nl.po b/doc/translations/nl.po index 54f5a9fd07..71605513cd 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -406,7 +406,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3464,6 +3464,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30194,8 +30200,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36550,7 +36556,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36570,7 +36576,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47358,6 +47364,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66636,11 +66654,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74657,8 +74676,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/pl.po b/doc/translations/pl.po index ca0992bc0e..6e5324af99 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -500,9 +500,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3891,6 +3892,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30702,8 +30709,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37136,7 +37143,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37157,7 +37164,7 @@ msgstr "Singleton [NavigationMeshGenerator]." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -48003,6 +48010,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67346,11 +67365,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75403,8 +75423,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/pt.po b/doc/translations/pt.po index 159f5eab13..6b214ae81a 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -495,7 +495,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4188,6 +4188,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -31008,8 +31014,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37409,7 +37415,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37429,7 +37435,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -48233,6 +48239,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67560,11 +67578,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75589,8 +75608,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index 012737c532..16779b76ff 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -525,9 +525,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4381,6 +4382,15 @@ msgstr "" "3D opcionalmente nomeadas." #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"Indica que uma propriedade integer é uma bitmask usando as camadas de " +"renderização 2D nomeadas opcionalmente." + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -31342,8 +31352,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37776,7 +37786,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37797,7 +37807,7 @@ msgstr "O singleton [NavigationMeshGenerator]." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -48650,6 +48660,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -68034,11 +68056,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -76096,8 +76119,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ro.po b/doc/translations/ro.po index 7e2f0e03dc..dbc5017a08 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -373,7 +373,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3427,6 +3427,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30157,8 +30163,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36513,7 +36519,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36533,7 +36539,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47322,6 +47328,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66599,11 +66617,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74620,8 +74639,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/ru.po b/doc/translations/ru.po index b398803cf7..ec2940636f 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -533,9 +533,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4486,6 +4487,15 @@ msgstr "" "иÑпользованием (опционально) именованных 3D-Ñлоев физики." #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" +"Указывает, что целочиÑленное ÑвойÑтво ÑвлÑетÑÑ Ð±Ð¸Ñ‚Ð¾Ð²Ð¾Ð¹ маÑкой Ñ " +"иÑпользованием (опционально) именованных 2D-Ñлоев рендеринга." + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -31984,8 +31994,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -38437,7 +38447,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -38458,7 +38468,7 @@ msgstr "Синглтон [NavigationMeshGenerator]." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -49443,6 +49453,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -69042,11 +69064,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -77122,8 +77145,8 @@ msgstr "[Environment] мира." #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/sk.po b/doc/translations/sk.po index 9eae2237dd..20caeea6c2 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -348,7 +348,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3398,6 +3398,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30128,8 +30134,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36484,7 +36490,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36504,7 +36510,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47292,6 +47298,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66569,11 +66587,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74590,8 +74609,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index cd2fdbb4f6..4d48a80e07 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -359,7 +359,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3409,6 +3409,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30139,8 +30145,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36495,7 +36501,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36515,7 +36521,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47303,6 +47309,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66580,11 +66598,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74601,8 +74620,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/sv.po b/doc/translations/sv.po index 9f98544e8c..4836ca862f 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -348,7 +348,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3398,6 +3398,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30125,8 +30131,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36481,7 +36487,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36501,7 +36507,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47289,6 +47295,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66566,11 +66584,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74587,8 +74606,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/th.po b/doc/translations/th.po index c70b6a3425..0bdffafffa 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -426,7 +426,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3492,6 +3492,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30282,8 +30288,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36669,7 +36675,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36689,7 +36695,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47541,6 +47547,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66846,11 +66864,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74874,8 +74893,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/tl.po b/doc/translations/tl.po index c07118cb6b..5ced19938d 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -387,7 +387,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3474,6 +3474,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30214,8 +30220,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36594,7 +36600,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36614,7 +36620,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47405,6 +47411,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66691,11 +66709,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74712,8 +74731,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/tr.po b/doc/translations/tr.po index 51a01cdf40..d7cc5bd8df 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -498,7 +498,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4176,6 +4176,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30962,8 +30968,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37370,7 +37376,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37391,7 +37397,7 @@ msgstr "[NavigationMeshGenerator] tekil nesnesi." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -48226,6 +48232,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67546,11 +67564,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75595,8 +75614,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/uk.po b/doc/translations/uk.po index c370c6b192..22271dc2ea 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -477,7 +477,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3548,6 +3548,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30324,8 +30330,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36719,7 +36725,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36739,7 +36745,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47564,6 +47570,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66873,11 +66891,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74920,8 +74939,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/vi.po b/doc/translations/vi.po index 74ac1a139c..b813d4a4a5 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -477,7 +477,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3825,6 +3825,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30622,8 +30628,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -37021,7 +37027,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -37042,7 +37048,7 @@ msgstr "ÄÆ¡n Nhất [NavigationMeshGenerator]." #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47880,6 +47886,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -67206,11 +67224,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -75261,8 +75280,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index 48df370c61..aed2ffbe21 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -62,8 +62,8 @@ 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-13 03:39+0000\n" -"Last-Translator: Magian <magian1127@gmail.com>\n" +"PO-Revision-Date: 2022-06-19 11:54+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" "Language: zh_CN\n" @@ -71,7 +71,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.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -516,9 +516,10 @@ 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" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -4246,11 +4247,10 @@ msgid "" msgstr "æ示一个整数属性是一个掩ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„2D物ç†å±‚。" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Hints that an integer property is a bitmask using the optionally named 2D " "navigation layers." -msgstr "æ示一个整数属性是一个掩ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„2D渲染层。" +msgstr "æ示一个整数属性是一个掩ç ,使用ç€å…·å或ä¸å…·åçš„ 2D 导航层。" #: doc/classes/@GlobalScope.xml msgid "" @@ -4265,6 +4265,13 @@ msgid "" msgstr "æ示一个整数属性是一个掩ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„3D物ç†å±‚。" #: doc/classes/@GlobalScope.xml +#, fuzzy +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "æ示一个整数属性是一个掩ç ,使用ç€å…·å或ä¸å…·åçš„ 2D 导航层。" + +#: doc/classes/@GlobalScope.xml msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " @@ -10670,13 +10677,12 @@ msgstr "" "如果已ç»å˜åœ¨ä¸€ä¸ªç»™å®š [code]id[/code] 的点,它的ä½ç½®å’Œæƒé‡å°†è¢«æ›´æ–°ä¸ºç»™å®šå€¼ã€‚" #: doc/classes/AStar2D.xml -#, fuzzy msgid "" "Returns whether there is a connection/segment between the given points. If " "[code]bidirectional[/code] is [code]false[/code], returns whether movement " "from [code]id[/code] to [code]to_id[/code] is possible through this segment." msgstr "" -"返回两个给定点是å¦é€šè¿‡çº¿æ®µç›´æŽ¥è¿žæŽ¥ã€‚如果 [code]bidirectional[/code] 为 " +"返回两个给定点之间是å¦å˜åœ¨è¿žæŽ¥/线段。如果 [code]bidirectional[/code] 为 " "[code]false[/code],则返回是å¦å¯ä»¥é€šè¿‡æ¤æ®µä»Ž [code]id[/code] 到 [code]to_id[/" "code] 进行移动。" @@ -10948,7 +10954,6 @@ 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" @@ -10959,10 +10964,11 @@ msgid "" "microphone, the format of the samples will be stereo 32-bit floating point " "PCM." msgstr "" -"音频效果æ•èŽ·æ˜¯ä¸€ç§éŸ³é¢‘效果,å¯å°†æ‰€é™„音频效果总线的所有音频帧å¤åˆ¶åˆ°å…¶å†…部环缓" -"冲器ä¸ã€‚\n" -"应用程åºä»£ç 应使用 [method get_buffer]从该环缓冲器ä¸æ¶ˆè€—è¿™äº›éŸ³é¢‘å¸§ï¼Œå¹¶æ ¹æ®éœ€" -"è¦è¿›è¡Œå¤„ç†ï¼Œä¾‹å¦‚从麦克风æ•èŽ·æ•°æ®ã€å®žçŽ°åº”用程åºå®šä¹‰çš„æ•ˆæžœæˆ–é€šè¿‡ç½‘ç»œä¼ è¾“éŸ³é¢‘ã€‚" +"AudioEffectCapture æ˜¯ä¸€ç§ AudioEffect,å¯å°†æ‰€é™„音频效果总线的所有音频帧å¤åˆ¶åˆ°" +"其内部的环形缓冲器ä¸ã€‚\n" +"应用程åºä»£ç 应使用 [method get_buffer] 从该环形缓冲器ä¸æ¶ˆè€—è¿™äº›éŸ³é¢‘å¸§ï¼Œå¹¶æ ¹æ®" +"需è¦è¿›è¡Œå¤„ç†ï¼Œä¾‹å¦‚从麦克风æ•èŽ·æ•°æ®ã€å®žçŽ°åº”用程åºå®šä¹‰çš„æ•ˆæžœæˆ–é€šè¿‡ç½‘ç»œä¼ è¾“éŸ³" +"频。从麦克风æ•èŽ·éŸ³é¢‘æ•°æ®æ—¶ï¼Œæ ·æœ¬çš„æ ¼å¼ä¸ºç«‹ä½“声 32 ä½æµ®ç‚¹æ•° PCM。" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -23728,9 +23734,8 @@ msgid "" msgstr "渲染æ供给它的[Curve]。简化了绘制曲线和/或ä¿å˜ä¸ºå›¾åƒæ–‡ä»¶çš„任务。" #: doc/classes/CurveTexture.xml -#, fuzzy msgid "The [Curve] that is rendered onto the texture." -msgstr "渲染到纹ç†ä¸Šçš„[code]curve[/code]。" +msgstr "渲染到纹ç†ä¸Šçš„ [Curve]。" #: doc/classes/CurveTexture.xml msgid "" @@ -23738,6 +23743,8 @@ msgid "" "represent high-frequency data better (such as sudden direction changes), at " "the cost of increased generation time and memory usage." msgstr "" +"纹ç†å®½åº¦ï¼ˆå•ä½ä¸ºåƒç´ )。较大的值能够更好地表示高频数æ®ï¼ˆä¾‹å¦‚æ–¹å‘çš„çªå˜ï¼‰ï¼Œä½†" +"ä¼šå¢žåŠ ç”Ÿæˆæ—¶é—´å’Œå†…å˜å 用。" #: doc/classes/CylinderMesh.xml msgid "Class representing a cylindrical [PrimitiveMesh]." @@ -24161,6 +24168,8 @@ msgid "" "duplicate keys will not be copied over, unless [code]overwrite[/code] is " "[code]true[/code]." msgstr "" +"å°† [code]dictionary[/code] ä¸çš„å…ƒç´ æ·»åŠ åˆ°è¿™ä¸ª [Dictionary] ä¸ã€‚默认情况下,ä¸" +"会å¤åˆ¶é‡å¤çš„é”®ï¼Œé™¤éž [code]overwrite[/code] 为 [code]true[/code]。" #: doc/classes/Dictionary.xml msgid "Returns the number of keys in the dictionary." @@ -26779,6 +26788,20 @@ msgid "" " return state\n" "[/codeblock]" msgstr "" +"覆盖这个方法å¯ç”¨äºŽæ供想è¦ä¿å˜çš„状æ€æ•°æ®ï¼Œç±»ä¼¼è§†å›¾ä½ç½®ã€ç½‘æ ¼è®¾ç½®ã€æŠ˜å 情况" +"ç‰ã€‚会在ä¿å˜åœºæ™¯ï¼ˆå†æ¬¡æ‰“开时ä¿ç•™çŠ¶æ€ï¼‰å’Œåˆ‡æ¢æ ‡ç¾é¡µï¼ˆåˆ‡å›žæ ‡ç¾é¡µæ—¶æ¢å¤çŠ¶æ€ï¼‰æ—¶" +"用到。这些数æ®ä¼šè‡ªåŠ¨ä¿å˜åˆ°ç¼–辑器元数æ®æ–‡ä»¶å¤¹ä¸å„个场景的 [code]editstate[/" +"code] 文件ä¸ã€‚å¦‚æžœä½ æƒ³è¦ä¸ºæ’件ä¿å˜å…¨å±€ï¼ˆä¸Žåœºæ™¯æ— 关)的编辑器数æ®ï¼Œä½ å¯ä»¥æ¢æˆ " +"[method get_window_layout]。\n" +"请使用 [method set_state] æ¢å¤ä¿å˜çš„状æ€ã€‚\n" +"[b]注æ„:[/b]é‡è¦çš„设置应该和项目一起进行æŒä¹…化,ä¸åº”该用这个方法æ¥ä¿å˜ã€‚\n" +"[b]注æ„:[/b]ä½ åªæœ‰å…ˆå®žçŽ° [method get_plugin_name],状æ€æ‰èƒ½å¤Ÿè¿›è¡Œæ£ç¡®çš„ä¿å˜" +"å’Œæ¢å¤ã€‚\n" +"[codeblock]\n" +"func get_state():\n" +" var state = {\"zoom\": zoom, \"preferred_color\": my_color}\n" +" return state\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -26803,6 +26826,17 @@ msgid "" " configuration.set_value(\"MyPlugin\", \"icon_color\", $Icon.modulate)\n" "[/codeblock]" msgstr "" +"覆盖这个方法å¯ç”¨äºŽæ供该æ’件的 GUI å¸ƒå±€æˆ–è€…ä»»ä½•å…¶ä»–ä½ æƒ³è¦ä¿å˜çš„æ•°æ®ã€‚会在调" +"用 [method queue_save_layout] ä¿å˜é¡¹ç›®çš„编辑器布局或者编辑器布局å‘生改å˜ï¼ˆä¾‹" +"如修改åœé é¢æ¿çš„ä½ç½®ï¼‰æ—¶ç”¨åˆ°ã€‚æ•°æ®ä¼šä¿å˜åˆ°ç¼–辑器元数æ®ç›®å½•çš„ " +"[code]editor_layout.cfg[/code] 文件ä¸ã€‚\n" +"请使用 [method set_window_layout] æ¢å¤ä¿å˜çš„布局。\n" +"[codeblock]\n" +"func get_window_layout(configuration):\n" +" configuration.set_value(\"MyPlugin\", \"window_position\", $Window." +"position)\n" +" configuration.set_value(\"MyPlugin\", \"icon_color\", $Icon.modulate)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -26941,6 +26975,15 @@ msgid "" " preferred_color = data.get(\"my_color\", Color.white)\n" "[/codeblock]" msgstr "" +"æ¢å¤ç”¨ [method get_state] ä¿å˜çš„状æ€ã€‚这个方法会在编辑器的当å‰åœºæ™¯æ ‡ç¾é¡µå‘生" +"改å˜æ—¶è°ƒç”¨ã€‚\n" +"[b]注æ„:[/b]ä½ çš„æ’件必须实现 [method get_plugin_name],å¦åˆ™æ— 法被识别,这个" +"方法也ä¸ä¼šè¢«è°ƒç”¨ã€‚\n" +"[codeblock]\n" +"func set_state(data):\n" +" zoom = data.get(\"zoom\", 1.0)\n" +" preferred_color = data.get(\"my_color\", Color.white)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -26955,6 +26998,16 @@ msgid "" "Color.white)\n" "[/codeblock]" msgstr "" +"æ¢å¤ç”¨ [method get_window_layout] ä¿å˜çš„æ’件 GUI 布局和数æ®ã€‚编辑器å¯åŠ¨æ—¶ä¼šè°ƒ" +"用æ¯ä¸€ä¸ªæ’件的这个方法。请使用æ供的 [code]configuration[/code] 文件读å–ä½ ä¿" +"å˜çš„æ•°æ®ã€‚\n" +"[codeblock]\n" +"func set_window_layout(configuration):\n" +" $Window.position = configuration.get_value(\"MyPlugin\", " +"\"window_position\", Vector2())\n" +" $Icon.modulate = configuration.get_value(\"MyPlugin\", \"icon_color\", " +"Color.white)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -32816,7 +32869,6 @@ msgid "Gradient-filled texture." msgstr "æ¸å˜å¡«å……纹ç†ã€‚" #: doc/classes/GradientTexture.xml -#, fuzzy msgid "" "GradientTexture uses a [Gradient] to fill the texture data. The gradient " "will be filled from left to right using colors obtained from the gradient. " @@ -32825,9 +32877,10 @@ msgid "" "at fixed steps (see [member width]). See also [GradientTexture2D] and " "[CurveTexture]." msgstr "" -"GradientTexture使用[Gradient]æ¥å¡«å……纹ç†æ•°æ®ã€‚æ¸å˜å°†ä½¿ç”¨ä»Žä¸èŽ·å¾—的颜色从左到å³" -"填充。这æ„味ç€çº¹ç†ä¸ä¸€å®šä»£è¡¨æ¸å˜çš„精确副本,而是以固定的æ¥é•¿ä»Žæ¸å˜ä¸èŽ·å¾—çš„æ ·" -"本的æ’值,è§[member width]。" +"GradientTexture 使用 [Gradient] æ¥å¡«å……纹ç†æ•°æ®ã€‚æ¸å˜å°†ä½¿ç”¨ä»Žä¸èŽ·å¾—的颜色从左" +"到å³å¡«å……。这æ„味ç€çº¹ç†ä¸ä¸€å®šä»£è¡¨æ¸å˜çš„精确副本,而是以固定的æ¥é•¿ä»Žæ¸å˜ä¸èŽ·å¾—" +"çš„æ ·æœ¬çš„æ’å€¼ï¼ˆè§ [member width])。å¦è¯·å‚阅 [GradientTexture2D] å’Œ " +"[CurveTexture]。" #: doc/classes/GradientTexture.xml msgid "The [Gradient] that will be used to fill the texture." @@ -32842,7 +32895,6 @@ msgid "Gradient-filled 2D texture." msgstr "使用æ¸å˜å¡«å……çš„ 2D 纹ç†ã€‚" #: doc/classes/GradientTexture2D.xml -#, fuzzy msgid "" "The texture uses a [Gradient] to fill the texture data in 2D space. The " "gradient is filled according to the specified [member fill] and [member " @@ -32854,8 +32906,8 @@ msgid "" msgstr "" "该纹ç†ä½¿ç”¨ [Gradient] æ¸å˜æ¥å¡«å…… 2D 空间纹ç†æ•°æ®ã€‚æ¸å˜ä¼šæ ¹æ® [member fill] " "å’Œ [member repeat] 类型,使用从æ¸å˜ä¸èŽ·å–的颜色进行填充。该纹ç†æœªå¿…精确表示该" -"æ¸å˜ï¼Œå¯ä»¥æ˜¯ä»Žè¯¥æ¸å˜ä¸ŠæŒ‰ç…§å›ºå®šæ¥é•¿è¿›è¡Œé‡‡æ ·åŽå†è¿›è¡Œæ’值(请å‚阅 [member " -"width] å’Œ [member height])。" +"æ¸å˜ï¼Œå¯ä»¥æ˜¯ä»Žè¯¥æ¸å˜ä¸ŠæŒ‰ç…§å›ºå®šæ¥é•¿è¿›è¡Œé‡‡æ ·åŽå†è¿›è¡Œæ’å€¼ï¼ˆè§ [member width] å’Œ " +"[member height])。å¦è¯·å‚阅 [GradientTexture] å’Œ [CurveTexture]。" #: doc/classes/GradientTexture2D.xml msgid "" @@ -33789,11 +33841,12 @@ msgstr "" "[code]pos[/code] 应该使用 GridMap 的本地åæ ‡ç©ºé—´ã€‚" #: modules/gridmap/doc_classes/GridMap.xml -#, fuzzy msgid "" "If [code]true[/code], this GridMap uses cell navmesh resources to create " "navigation regions." -msgstr "如果[code]true[/code]ï¼Œæ ¹æ®æµç¨‹ç›¸å…³é€šçŸ¥æ›´æ–°åŠ¨ç”»ã€‚" +msgstr "" +"为 [code]true[/code] 时,这个 GridMap 会使用å•å…ƒæ ¼çš„å¯¼èˆªç½‘æ ¼èµ„æºæ¥åˆ›å»ºå¯¼èˆªåœ°" +"区。" #: modules/gridmap/doc_classes/GridMap.xml msgid "If [code]true[/code], grid items are centered on the X axis." @@ -33858,7 +33911,7 @@ msgstr "指定的 [MeshLibrary]。" #: modules/gridmap/doc_classes/GridMap.xml msgid "The navigation layers the GridMap generates its navigation regions in." -msgstr "" +msgstr "GridMap 生æˆå¯¼èˆªåœ°åŒºçš„导航层。" #: modules/gridmap/doc_classes/GridMap.xml msgid "" @@ -36982,7 +37035,6 @@ msgid "" msgstr "åœ¨æ˜ å°„æ•°æ®åº“ä¸æ·»åŠ æ–°çš„æ˜ å°„æ¡ç›®ï¼ˆSDL2 æ ¼å¼ï¼‰ã€‚å¯é€‰æ›´æ–°å·²è¿žæŽ¥çš„设备。" #: doc/classes/Input.xml -#, fuzzy msgid "" "Sends all input events which are in the current buffer to the game loop. " "These events may have been buffered as a result of accumulated input " @@ -36993,9 +37045,8 @@ msgid "" "want precise control over the timing of event handling." msgstr "" "将当å‰ç¼“冲区内的所有输入事件å‘é€ç»™æ¸¸æˆå¾ªçŽ¯ã€‚这些事件å¯èƒ½æ˜¯ç”±äºŽç´¯ç§¯è¾“å…¥" -"([method set_use_accumulated_input])或æ•æ·è¾“入刷新([member " -"ProjectSettings.input_devices/buffering/agile_event_flushing])而被缓冲的结" -"果。\n" +"([member use_accumulated_input])或æ•æ·è¾“入刷新([member ProjectSettings." +"input_devices/buffering/agile_event_flushing])而被缓冲的结果。\n" "引擎已ç»ä¼šåœ¨å…³é”®çš„执行点执行æ¤æ“作,至少æ¯å¸§ä¸€æ¬¡ã€‚ç„¶è€Œï¼Œåœ¨ä½ æƒ³è¦ç²¾ç¡®æŽ§åˆ¶äº‹ä»¶" "处ç†æ—¶é—´çš„高级情况下,这å¯èƒ½æ˜¯æœ‰ç”¨çš„。" @@ -37513,12 +37564,10 @@ msgstr "" "MOUSE_MODE_CONFINED] 时则是é™åˆ¶åœ¨æ¸¸æˆçª—å£å†…。" #: doc/classes/Input.xml -#, fuzzy msgid "Controls the mouse mode. See [enum MouseMode] for more information." -msgstr "è®¾ç½®é¼ æ ‡æ¨¡å¼ã€‚有关更多信æ¯ï¼Œè¯·å‚阅常é‡ã€‚" +msgstr "æŽ§åˆ¶é¼ æ ‡æ¨¡å¼ã€‚详情请å‚阅 [enum MouseMode]。" #: doc/classes/Input.xml -#, fuzzy msgid "" "If [code]true[/code], similar input events sent by the operating system are " "accumulated. When input accumulation is enabled, all input events generated " @@ -37531,9 +37580,9 @@ msgid "" "while the user is drawing the line to get results that closely follow the " "actual input." msgstr "" -"å¯ç”¨æˆ–ç¦ç”¨æ“作系统å‘é€çš„类似输入事件的累积。当å¯ç”¨è¾“入累积时,在一帧ä¸äº§ç”Ÿçš„" -"所有输入事件将被åˆå¹¶ï¼Œå¹¶åœ¨è¯¥å¸§å®Œæˆæ¸²æŸ“æ—¶å‘å‡ºã€‚å› æ¤ï¼Œè¿™é™åˆ¶äº†æ¯ç§’的输入方法调" -"用次数,使之与渲染FPS相一致。\n" +"如果为 [code]true[/code],会对æ“作系统å‘é€çš„类似输入事件进行累积。当å¯ç”¨è¾“å…¥" +"累积时,在一帧ä¸äº§ç”Ÿçš„所有输入事件将被åˆå¹¶ï¼Œå¹¶åœ¨è¯¥å¸§å®Œæˆæ¸²æŸ“æ—¶å‘å‡ºã€‚å› æ¤ï¼Œè¿™" +"é™åˆ¶äº†æ¯ç§’的输入方法调用次数,使之与渲染FPS相一致。\n" "è¾“å…¥ç´¯åŠ åœ¨é»˜è®¤æƒ…å†µä¸‹æ˜¯å¯ç”¨çš„。它å¯ä»¥è¢«ç¦ç”¨ï¼Œå°†ä»¥å¢žåŠ CPU使用率为代价,获得ç¨å¾®" "更精确åŠæ›´çµæ•çš„输入。在需è¦è‡ªç”±ç»˜åˆ¶çº¿æ¡çš„应用ä¸ï¼Œä¸€èˆ¬åº”用在用户绘制线æ¡æ—¶ç¦" "ç”¨è¾“å…¥ç´¯åŠ ï¼Œä»¥èŽ·å¾—ç´§è·Ÿå®žé™…è¾“å…¥çš„ç»“æžœã€‚" @@ -37925,9 +37974,10 @@ msgstr "" "被释放。" #: doc/classes/InputEventJoypadButton.xml +#, fuzzy msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" "如果控制器支æŒï¼Œåˆ™è¡¨ç¤ºç”¨æˆ·ç”¨æ‰‹æŒ‡åœ¨æŒ‰é’®ä¸Šæ–½åŠ 的压力。范围从 [code]0[/code] 到 " "[code]1[/code]。" @@ -38261,7 +38311,6 @@ msgid "Input event type for mouse motion events." msgstr "é¼ æ ‡ç§»åŠ¨äº‹ä»¶çš„è¾“å…¥äº‹ä»¶ç±»åž‹ã€‚" #: doc/classes/InputEventMouseMotion.xml -#, fuzzy msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" @@ -38276,11 +38325,11 @@ msgstr "" "包å«é¼ æ ‡å’Œç¬”çš„è¿åŠ¨ä¿¡æ¯ã€‚支æŒç›¸å¯¹ã€ç»å¯¹ä½ç½®å’Œé€Ÿåº¦ã€‚请å‚阅 [method Node." "_input]。\n" "[b]注æ„:[/b]默认情况下,这个事件最多åªèƒ½åœ¨æ¯ä¸€å¸§æ¸²æŸ“ä¸å‘å‡ºä¸€æ¬¡ã€‚å¦‚æžœä½ éœ€è¦æ›´" -"精确的输入报告,请用 [code]false[/code] 调用 [method Input." -"set_use_accumulated_input] æ¥ä½¿äº‹ä»¶å°½å¯èƒ½é¢‘ç¹åœ°å‘å°„ã€‚å¦‚æžœä½ ä½¿ç”¨ " -"InputEventMouseMotion æ¥ç”»çº¿ï¼Œè¯·è€ƒè™‘åŒæ—¶å®žçŽ° [url=https://en.wikipedia.org/" -"wiki/Bresenham%27s_line_algorithm]Bresenham 的线æ¡ç®—法[/url],以é¿å…在用户快" -"é€Ÿç§»åŠ¨é¼ æ ‡æ—¶å‡ºçŽ°å¯è§çš„线æ¡ç©ºéš™ã€‚" +"精确的输入报告,请将 [member Input.use_accumulated_input] 设为 [code]false[/" +"code],让事件尽å¯èƒ½é¢‘ç¹åœ°å‘å°„ã€‚å¦‚æžœä½ ä½¿ç”¨ InputEventMouseMotion æ¥ç”»çº¿ï¼Œè¯·è€ƒ" +"虑åŒæ—¶å®žçŽ° [url=https://en.wikipedia.org/wiki/" +"Bresenham%27s_line_algorithm]Bresenham 的线æ¡ç®—法[/url],以é¿å…在用户快速移动" +"é¼ æ ‡æ—¶å‡ºçŽ°å¯è§çš„线æ¡ç©ºéš™ã€‚" #: doc/classes/InputEventMouseMotion.xml msgid "Mouse and input coordinates" @@ -43555,16 +43604,15 @@ msgid "Node used for displaying a [Mesh] in 2D." msgstr "用于在2Dä¸æ˜¾ç¤º[Mesh]的节点。" #: doc/classes/MeshInstance2D.xml -#, fuzzy msgid "" "Node used for displaying a [Mesh] in 2D. A [MeshInstance2D] can be " "automatically created from an existing [Sprite] via a tool in the editor " "toolbar. Select the [Sprite] node, then choose [b]Sprite > Convert to " "MeshInstance2D[/b] at the top of the 2D editor viewport." msgstr "" -"用于在2Dä¸æ˜¾ç¤º[Mesh]的节点。å¯ä»¥é€šè¿‡ç¼–辑器工具æ 上的工具从现有的[Sprite]æž„" -"建。选择 \"Sprite\",然åŽé€‰æ‹© \"转æ¢ä¸ºMesh2D\",在弹出的窗å£ä¸é€‰æ‹©è®¾ç½®å¹¶æŒ‰ä¸‹ " -"\"创建Mesh2D\"。" +"用于在 2D ä¸æ˜¾ç¤º [Mesh] 的节点。å¯ä»¥é€šè¿‡ç¼–辑器工具æ 上的工具从现有的 " +"[Sprite] æž„å»ºã€‚é€‰ä¸ [Sprite] 节点,然åŽåœ¨ 2D 编辑器视区顶部选择[b]ç²¾çµ > 转æ¢" +"为 MeshInstance2D[/b]。" #: doc/classes/MeshInstance2D.xml msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." @@ -44562,9 +44610,8 @@ msgstr "" "å¯¼èˆªç½‘æ ¼ä¹‹é—´çš„äº¤ç‚¹ã€‚å¦‚æžœæ‰¾åˆ°å¤šä¸ªäº¤ç‚¹ï¼Œåˆ™è¿”å›žæœ€æŽ¥è¿‘çº¿æ®µèµ·ç‚¹çš„äº¤ç‚¹ã€‚" #: doc/classes/Navigation.xml -#, fuzzy msgid "Returns the [RID] of the navigation map on the [NavigationServer]." -msgstr "返回这个代ç†åœ¨ [NavigationServer] 上的 [RID]。" +msgstr "返回这个导航地图在 [NavigationServer] 上的 [RID]。" #: doc/classes/Navigation.xml msgid "" @@ -44595,6 +44642,8 @@ msgid "" "A bitfield determining all navigation map layers the navigation can use on a " "[method Navigation.get_simple_path] path query." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šåœ¨ä½¿ç”¨ [method Navigation.get_simple_path] 进行路径请求时,导航" +"所能用到的导航地图层。" #: doc/classes/Navigation.xml msgid "" @@ -44608,7 +44657,7 @@ msgstr "" #: doc/classes/NavigationServer.xml msgid "" "Emitted when a navigation map is updated, when a region moves or is modified." -msgstr "" +msgstr "当导航地图更新时ã€åœ°åŒºç§»åŠ¨æˆ–被修改时å‘出。" #: doc/classes/Navigation2D.xml msgid "2D navigation and pathfinding node." @@ -44656,13 +44705,14 @@ msgid "" "A bitfield determining all navigation map layers the navigation can use on a " "[method Navigation2D.get_simple_path] path query." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šåœ¨ä½¿ç”¨ [method Navigation2D.get_simple_path] 进行路径请求时,导" +"航所能用到的导航地图层。" #: doc/classes/Navigation2DServer.xml msgid "Server interface for low-level 2D navigation access." msgstr "访问底层 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" @@ -44699,8 +44749,11 @@ msgstr "" "å³ç”Ÿæ•ˆçš„。SceneTree ä¸å¯¼èˆªç›¸å…³çš„节点对地图ã€åœ°åŒºã€ä»£ç†ä½œå‡ºçš„修改也是如æ¤ï¼Œé€š" "过脚本作出的修改亦然。\n" "两个地区必须共有一æ¡ç›¸ä¼¼çš„边界(edge)æ‰èƒ½ç›¸è¿žã€‚如果一æ¡è¾¹ç•Œçš„两个顶点" -"(vertex)与å¦ä¸€æ¡è¾¹ç•Œçš„对应顶点的è·ç¦»å°äºŽ [member Navigation." -"edge_connection_margin],则认为这两æ¡è¾¹ç•Œç›¸è¿žã€‚\n" +"(vertex)与å¦ä¸€æ¡è¾¹ç•Œçš„对应顶点的è·ç¦»å°äºŽ [code]edge_connection_margin[/" +"code],则认为这两æ¡è¾¹ç•Œç›¸è¿žã€‚\n" +"ä½ å¯ä»¥é€šè¿‡ [method Navigation2DServer.region_set_navigation_layers] 为地区设" +"置导航层,使用 [method Navigation2DServer.map_get_path] 请求路径时会对导航层" +"è¿›è¡Œæ£€æŸ¥ã€‚è¿™æ ·å°±èƒ½å¤Ÿå¯¹ 2D 对象å¯ç”¨æˆ–ç¦ç”¨æŸäº›åŒºåŸŸã€‚\n" "è¦ä½¿ç”¨é˜²æ’žç³»ç»Ÿï¼Œå¯ä»¥ä½¿ç”¨ä»£ç†ã€‚ä½ å¯ä»¥è®¾ç½®ä»£ç†çš„ç›®æ ‡é€Ÿåº¦ï¼ŒæœåŠ¡å™¨å°±ä¼šä½¿ç”¨ä¿®æ£åŽ" "的速度触å‘回调。\n" "[b]注æ„:[/b]防撞系统会忽略地区。直接使用修æ£åŽçš„速度å¯èƒ½ä¼šå°†ä»£ç†æŽ¨åˆ°å¯å¯¼èˆªåŒº" @@ -44735,6 +44788,12 @@ msgid "" "agent_set_callback] again with a [code]null[/code] object as the " "[code]receiver[/code]." msgstr "" +"在 RVO 处ç†æœ«å°¾è°ƒç”¨çš„回调。如果手动创建了回调,并且代ç†ä½äºŽå¯¼èˆªåœ°å›¾ä¸Šï¼Œå°±ä¼šä¸º" +"该代ç†è®¡ç®—é¿éšœï¼Œå¹¶å°†è®¡ç®—出的安全速度 [code]safe_velocity[/code] 通过信å·å‘é€" +"ç»™ [code]receiver[/code] 对象上å为 [code]method[/code] 的方法。\n" +"[b]注æ„:[/b]åªè¦ä»£ç†è¿˜åœ¨å¯¼èˆªåœ°å›¾ä¸Šä¸”未被释放,创建的回调就始终会进行处ç†ï¼Œæ— " +"论 SceneTree 的状æ€å¦‚何。è¦ç¦ç”¨æŸä¸ªä»£ç†çš„回调分å‘,请å†æ¬¡ä½¿ç”¨ [method " +"agent_set_callback],为 [code]receiver[/code] 设置为 [code]null[/code]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Puts the agent in the map." @@ -44805,9 +44864,8 @@ msgid "" msgstr "返回所有与请求的导航地图 [code]map[/code] å…³è”的导航代ç†çš„ [RID]。" #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." -msgstr "获å–被解æžæ–‡ä»¶ä¸çš„当å‰è¡Œï¼ˆç›®å‰æœªå®žçŽ°ï¼‰ã€‚" +msgstr "返回地图å•å…ƒæ ¼é«˜åº¦ã€‚[b]注æ„:[/b]尚未实现。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the map cell size." @@ -44837,6 +44895,8 @@ msgid "" "[code]navigation_layers[/code] is a bitmask of all region layers that are " "allowed to be in the path." msgstr "" +"返回从起点到达终点的导航路径。[code]navigation_layers[/code] 是å…许在路径ä¸å‡º" +"现的所有地区层的ä½æŽ©ç 。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -44853,11 +44913,10 @@ msgid "Sets the map active." msgstr "设置地图的激活æ€ã€‚" #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "" "Set the map cell height used to weld the navigation mesh polygons. [b]Note:[/" "b] Currently not implemented." -msgstr "è®¾ç½®ç”¨äºŽç„ŠæŽ¥å¯¼èˆªç½‘æ ¼å¤šè¾¹å½¢çš„åœ°å›¾å•å…ƒæ ¼é«˜åº¦ã€‚" +msgstr "è®¾ç½®ç”¨äºŽç„ŠæŽ¥å¯¼èˆªç½‘æ ¼å¤šè¾¹å½¢çš„åœ°å›¾å•å…ƒæ ¼é«˜åº¦ã€‚[b]注æ„:[/b]尚未实现。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Set the map cell size used to weld the navigation mesh polygons." @@ -44878,6 +44937,8 @@ msgid "" "index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" +"返回连接门的终点。[code]connection[/code] 是 0 å’Œ [method " +"region_get_connections_count] 返回值之间的索引å·ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -44885,18 +44946,18 @@ msgid "" "an index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" +"返回连接门的起点。[code]connection[/code] 是 0 å’Œ [method " +"region_get_connections_count] 返回值之间的索引å·ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "" "Returns how many connections this [code]region[/code] has with other regions " "in the map." -msgstr "返回 [code]点[/code]在平é¢ä¸Šçš„æ£äº¤æŠ•å½±ã€‚" +msgstr "返回 [code]region[/code] 地区与其他地区在地图上有多少连接。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the [code]enter_cost[/code] of this [code]region[/code]." -msgstr "å¦‚æžœç»™å®šçš„ä¿¡å· [code]signal[/code] å˜åœ¨ï¼Œåˆ™è¿”回 [code]true[/code]。" +msgstr "返回 [code]region[/code] 地区的进入消耗 [code]enter_cost[/code]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -44905,19 +44966,16 @@ msgid "" msgstr "返回请求的导航地区 [code]region[/code] 所关è”的导航地图的 [RID]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the region's navigation layers." -msgstr "è¿”å›žè¯¥é¡¹çš„å¯¼èˆªç½‘æ ¼ã€‚" +msgstr "返回该地区的导航层。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." -msgstr "å¦‚æžœç»™å®šçš„ä¿¡å· [code]signal[/code] å˜åœ¨ï¼Œåˆ™è¿”回 [code]true[/code]。" +msgstr "返回 [code]region[/code] 地区的移动消耗 [code]travel_cost[/code]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." -msgstr "为具有给定[code]id[/code]的点设置[code]position[/code]。" +msgstr "设置 [code]region[/code] 地区的进入消耗 [code]enter_cost[/code]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map for the region." @@ -44928,6 +44986,8 @@ msgid "" "Set the region's navigation layers. This allows selecting regions from a " "path request (when using [method Navigation2DServer.map_get_path])." msgstr "" +"设置该地区的导航层。å¯ç”¨äºŽï¼ˆä½¿ç”¨ [method Navigation2DServer.map_get_path])请" +"求路径时对地区进行选择。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the navigation mesh for the region." @@ -44938,9 +44998,8 @@ msgid "Sets the global transformation for the region." msgstr "设置该地区的全局å˜æ¢ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the [code]travel_cost[/code] for this [code]region[/code]." -msgstr "为具有给定[code]id[/code]的点设置[code]position[/code]。" +msgstr "设置 [code]region[/code] 地区的移动消耗 [code]travel_cost[/code]。" #: doc/classes/NavigationAgent.xml msgid "3D agent used in navigation for collision avoidance." @@ -44962,6 +45021,15 @@ msgid "" "position from this function should be used as the next movement position for " "the agent's parent Node." msgstr "" +"导航ä¸ä½¿ç”¨çš„ 3D 代ç†ï¼Œå¯ä»¥åœ¨å‰å¾€æŸä¸ªä½ç½®æ—¶èº²é¿é™æ€å’ŒåŠ¨æ€éšœç¢ç‰©ã€‚躲é¿åŠ¨æ€éšœç¢" +"物使用的是 RVO(Reciprocal Velocity Obstacles,相对速度障ç¢ç‰©ï¼‰é˜²æ’žç®—法。代ç†" +"需è¦å¯¼èˆªæ•°æ®æ‰èƒ½æ£ç¡®å·¥ä½œã€‚默认情况下,这个节点会在默认的 [World] 导航地图ä¸è¿›" +"行注册。如果这个节点是 [Navigation] 节点的å项,那么就会在这个导航节点的导航" +"地图ä¸è¿›è¡Œæ³¨å†Œï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨ [method set_navigation] 函数直接设置导航节点。" +"[NavigationAgent] 是物ç†å®‰å…¨çš„。\n" +"[b]注æ„:[/b]使用 [method set_target_location] 之åŽï¼Œå¿…须在æ¯ä¸ªç‰©ç†å¸§ä½¿ç”¨ä¸€" +"次 [method get_next_location] 函数æ¥æ›´æ–° NavigationAgent 的内部路径逻辑。这个" +"函数返回的å‘é‡ä½ç½®åº”该用作该代ç†çš„父节点的下一次移动ä½ç½®ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -44992,6 +45060,11 @@ msgid "" "for the agents movement as this function also updates the internal path " "logic." msgstr "" +"返回这个代ç†ä»Žèµ·ç‚¹åˆ°ç»ˆç‚¹çš„当å‰è·¯å¾„,使用全局åæ ‡ã€‚è¯¥è·¯å¾„åªä¼šåœ¨ç›®æ ‡ä½ç½®å‘生å˜" +"化,或者代ç†è¦æ±‚é‡æ–°è®¡ç®—路径时更新。路径数组ä¸åº”直接用作移动路径,代ç†æœ‰å…¶å†…" +"部的路径逻辑,手动修改路径数组å¯èƒ½ä¼šé€ æˆç ´å。请在æ¯ä¸€ä¸ªç‰©ç†å¸§ä¸è°ƒç”¨ä¸€æ¬¡ " +"[method get_next_location] 获å–该代ç†çš„下一个路径点,这个函数会更新其内部的路" +"径逻辑。" #: doc/classes/NavigationAgent.xml msgid "" @@ -45015,9 +45088,13 @@ msgid "" "the navigation map for the NavigationAgent and also update the agent on the " "NavigationServer." msgstr "" +"返回这个 NavigationAgent 节点的导航地图的 [RID]。这个函数返回的始终是在 " +"NavigationAgent 上设置的地图,ä¸æ˜¯ NavigationServer 上的抽象代ç†æ‰€ä½¿ç”¨çš„地" +"图。如果通过 NavigationServer API 修改了代ç†çš„地图,该 NavigationAgent 节点是" +"ä¸ä¼šæ„ŸçŸ¥åˆ°åœ°å›¾çš„å˜åŒ–的。请使用 [method set_navigation_map] 修改该 " +"NavigationAgent 的导航地图,能够åŒæ—¶åœ¨ NavigationServer 上的代ç†ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "" "Returns the next location in global coordinates that can be moved to, making " "sure that there are no static objects in the way. If the agent does not have " @@ -45025,8 +45102,9 @@ msgid "" "use of this function once every physics frame is required to update the " "internal path logic of the NavigationAgent." msgstr "" -"返回å¯ä»¥ç§»åŠ¨è‡³çš„ [Vector2] 全局åæ ‡ï¼Œç¡®ä¿ä¸é€”没有é™æ€ç‰©ä½“阻挡。如果代ç†æ²¡æœ‰å¯¼" -"航路径,则会返回代ç†çˆ¶èŠ‚点的原点。" +"返回å¯ä»¥ç§»åŠ¨è‡³çš„下一个ä½ç½®ï¼Œä½¿ç”¨å…¨å±€åæ ‡ï¼Œç¡®ä¿ä¸é€”没有é™æ€ç‰©ä½“阻挡。如果代ç†" +"没有导航路径,则会返回代ç†çˆ¶èŠ‚点的ä½ç½®ã€‚必须在æ¯ä¸ªç‰©ç†å¸§éƒ½è°ƒç”¨ä¸€æ¬¡è¿™ä¸ªå‡½æ•°ï¼Œ" +"æ›´æ–° NavigationAgent 内部的路径逻辑。" #: doc/classes/NavigationAgent.xml msgid "Returns the [RID] of this agent on the [NavigationServer]." @@ -45076,6 +45154,8 @@ msgid "" "Sets the [RID] of the navigation map this NavigationAgent node should use " "and also updates the [code]agent[/code] on the NavigationServer." msgstr "" +"设置这个 NavigationAgent 节点所应使用的导航地图的 [RID],åŒæ—¶è¿˜ä¼šæ›´æ–° " +"NavigationServer ä¸Šçš„ä»£ç† [code]agent[/code]。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -45101,6 +45181,10 @@ msgid "" "that the developer baked with appropriate agent radius or height values are " "required to support different-sized agents." msgstr "" +"这个 NavigationAgent 的任何å‘é‡ä½ç½®çš„ Y åæ ‡å€¼éƒ½ä¼šå‡åŽ» NavigationAgent 的高度" +"å移é‡ã€‚NavigationAgent 的高度å移é‡ä¸ä¼šå‘生改å˜ï¼Œä¹Ÿä¸ä¼šå½±å“å¯¼èˆªç½‘æ ¼å’Œå¯»è·¯ç»“" +"æžœã€‚å¦‚æžœå…¶ä»–å¯¼èˆªåœ°å›¾ä½¿ç”¨äº†å¸¦æœ‰å¯¼èˆªç½‘æ ¼çš„åœ°åŒºï¼Œå¼€å‘者使用åˆé€‚的代ç†åŠå¾„或高度" +"对其进行了烘焙,那么就必须支æŒä¸åŒå¤§å°çš„代ç†ã€‚" #: doc/classes/NavigationAgent.xml msgid "" @@ -45137,6 +45221,8 @@ msgid "" "belongs to. On path requests the agent will ignore navmeshes without at " "least one matching layer." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šè¯¥ [NavigationAgent] 所属的导航地图层。请求路径时,代ç†ä¼šå¿½ç•¥æ²¡" +"有任何匹é…å±‚çš„å¯¼èˆªç½‘æ ¼ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The distance to search for other agents." @@ -45219,6 +45305,15 @@ msgid "" "position from this function should be used as the next movement position for " "the agent's parent Node." msgstr "" +"导航ä¸ä½¿ç”¨çš„ 2D 代ç†ï¼Œå¯ä»¥åœ¨å‰å¾€æŸä¸ªä½ç½®æ—¶èº²é¿é™æ€å’ŒåŠ¨æ€éšœç¢ç‰©ã€‚躲é¿åŠ¨æ€éšœç¢" +"物使用的是 RVO(Reciprocal Velocity Obstacles,相对速度障ç¢ç‰©ï¼‰é˜²æ’žç®—法。代ç†" +"需è¦å¯¼èˆªæ•°æ®æ‰èƒ½æ£ç¡®å·¥ä½œã€‚默认情况下,这个节点会在默认的 [World2D] 导航地图ä¸" +"进行注册。如果这个节点是 [Navigation2D] 节点的å项,那么就会在这个导航节点的" +"导航地图ä¸è¿›è¡Œæ³¨å†Œï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨ [method set_navigation] 函数直接设置导航节点。" +"[NavigationAgent2D] 是物ç†å®‰å…¨çš„。\n" +"[b]注æ„:[/b]使用 [method set_target_location] 之åŽï¼Œå¿…须在æ¯ä¸ªç‰©ç†å¸§ä½¿ç”¨ä¸€" +"次 [method get_next_location] 函数æ¥æ›´æ–° NavigationAgent 的内部路径逻辑。这个" +"函数返回的å‘é‡ä½ç½®åº”该用作该代ç†çš„父节点的下一次移动ä½ç½®ã€‚" #: doc/classes/NavigationAgent2D.xml msgid "" @@ -45265,6 +45360,8 @@ msgid "" "belongs to. On path requests the agent will ignore navmeshes without at " "least one matching layer." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šè¯¥ [NavigationAgent2D] 所属的导航地图层。请求路径时,代ç†ä¼šå¿½ç•¥" +"没有任何匹é…å±‚çš„å¯¼èˆªç½‘æ ¼ã€‚" #: doc/classes/NavigationMesh.xml msgid "A mesh to approximate the walkable areas and obstacles." @@ -45297,11 +45394,11 @@ msgid "" msgstr "é€šè¿‡æ ¹æ® [Mesh] 设置顶点和索引æ¥åˆå§‹åŒ–å¯¼èˆªç½‘æ ¼ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Returns whether the specified [code]bit[/code] of the [member " "geometry_collision_mask] is set." -msgstr "返回[member geometry/collision_mask]的指定[code]bit[/code]是å¦è¢«è®¾ç½®ã€‚" +msgstr "" +"返回 [member geometry_collision_mask] 上指定的 [code]bit[/code] 是å¦å·²è®¾ç½®ã€‚" #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -45320,17 +45417,16 @@ msgid "" msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„所有顶点的[PoolVector3Array]。" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" "code] in the [member geometry_collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" "code] in the [member geometry_collision_mask]." msgstr "" -"如果 [code]value[/code] 为 [code]true[/code],则在 [member geometry/" -"collision_mask] ä¸è®¾ç½®æŒ‡å®šçš„ [code]bit[/code]。\n" -"如果 [code]value[/code] 为 [code]false[/code],则在 [member geometry/" -"collision_mask] ä¸æ¸…除指定的 [code]bit[/code]。" +"如果 [code]value[/code] 为 [code]true[/code],则在 [member " +"geometry_collision_mask] ä¸è®¾ç½®æŒ‡å®šçš„ [code]bit[/code]。\n" +"如果 [code]value[/code] 为 [code]false[/code],则在 [member " +"geometry_collision_mask] ä¸æ¸…除指定的 [code]bit[/code]。" #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -45339,7 +45435,6 @@ msgid "" msgstr "设置顶点,然åŽä½¿ç”¨ [method add_polygon] 方法创建多边形。" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The minimum floor to ceiling height that will still allow the floor area to " "be considered walkable.\n" @@ -45347,24 +45442,22 @@ msgid "" "multiple of [member cell_height]." msgstr "" "地æ¿åˆ°å¤©èŠ±æ¿çš„最å°é«˜åº¦ï¼Œä»ç„¶å…许被认为是å¯è¡Œèµ°çš„地æ¿ã€‚\n" -"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的 [member cell/height] çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的 [member cell_height] çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The minimum ledge height that is considered to still be traversable.\n" "[b]Note:[/b] While baking, this value will be rounded down to the nearest " "multiple of [member cell_height]." msgstr "" "被认为ä»å¯ç©¿è¶Šçš„最å°å¢™å£é«˜åº¦ã€‚\n" -"[b]注æ„:[/b]烘焙时,该值将å‘下èˆå…¥åˆ°æœ€æŽ¥è¿‘çš„ [member cell/height] çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,该值将å‘下èˆå…¥åˆ°æœ€æŽ¥è¿‘çš„ [member cell_height] çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml msgid "The maximum slope that is considered walkable, in degrees." msgstr "认为å¯è¡Œèµ°çš„最大å¡åº¦ï¼Œå•ä½æ˜¯åº¦ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The distance to erode/shrink the walkable area of the heightfield away from " "obstructions.\n" @@ -45372,7 +45465,7 @@ msgid "" "multiple of [member cell_size]." msgstr "" "侵蚀/缩å°è¿œç¦»éšœç¢ç‰©çš„高度场的å¯è¡Œèµ°åŒºåŸŸè·ç¦»ã€‚\n" -"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的 [member cell/size] çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的 [member cell_size] çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml msgid "The Y axis cell size to use for fields." @@ -45396,46 +45489,42 @@ msgid "" msgstr "简化轮廓的边界边缘应å离原始原始轮廓的最大è·ç¦»ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The maximum allowed length for contour edges along the border of the mesh.\n" "[b]Note:[/b] While baking, this value will be rounded up to the nearest " "multiple of [member cell_size]." msgstr "" "æ²¿ç½‘æ ¼è¾¹ç•Œçš„è½®å»“çš„æœ€å¤§å…许长度。\n" -"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的[member cell/size]çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,这个值会å‘上å–整到最接近的[member cell_size]çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "如果为 [code]true[/code]ï¼Œåˆ™æ ‡è®°è¾¹ç¼˜é—´çš„è·¨åº¦ä¸ºä¸å¯è¡Œèµ°ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "If [code]true[/code], marks non-walkable spans as walkable if their maximum " "is within [member agent_max_climb] of a walkable neighbor." msgstr "" -"如果为 [code]true[/code],如果它们的最大值在å¯è¡Œèµ°é‚»åŸŸçš„ [member agent/" -"max_climb] 内,则将ä¸å¯è¡Œèµ°èŒƒå›´æ ‡è®°ä¸ºå¯è¡Œèµ°ã€‚" +"如果为 [code]true[/code],如果它们的最大值在å¯è¡Œèµ°é‚»åŸŸçš„ [member " +"agent_max_climb] 内,则将ä¸å¯è¡Œèµ°èŒƒå›´æ ‡è®°ä¸ºå¯è¡Œèµ°ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "If [code]true[/code], marks walkable spans as not walkable if the clearance " "above the span is less than [member agent_height]." msgstr "" -"如果为 [code]true[/code],如果跨度上方的间隙å°äºŽ [member agent/height],则将" +"如果为 [code]true[/code],如果跨度上方的间隙å°äºŽ [member agent_height],则将" "å¯è¡Œèµ°èŒƒå›´æ ‡è®°ä¸ºä¸å¯è¡Œèµ°ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The physics layers to scan for static colliders.\n" "Only used when [member geometry_parsed_geometry_type] is [constant " "PARSED_GEOMETRY_STATIC_COLLIDERS] or [constant PARSED_GEOMETRY_BOTH]." msgstr "" "用于扫æé™æ€ç¢°æ’žçš„物ç†å±‚。\n" -"仅在 [member geometry/parsed_geometry_type]是[constant " +"仅在 [member geometry_parsed_geometry_type] 是 [constant " "PARSED_GEOMETRY_STATIC_COLLIDERS] 或 [constant PARSED_GEOMETRY_BOTH] æ—¶æ‰ä½¿" "用。" @@ -45452,7 +45541,6 @@ msgid "" msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æºã€‚å‚阅 [enum SourceGeometryMode]。" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "The name of the group to scan for geometry.\n" "Only used when [member geometry_source_geometry_mode] is [constant " @@ -45460,7 +45548,7 @@ msgid "" "SOURCE_GEOMETRY_GROUPS_EXPLICIT]." msgstr "" "è¦æ‰«æçš„å‡ ä½•ä½“ç»„çš„å称。\n" -"åªæœ‰å½“ [member geometry/source_geometry_mode]是[constant " +"åªæœ‰å½“ [member geometry_source_geometry_mode] 是 [constant " "SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] 或 [constant " "SOURCE_GEOMETRY_GROUPS_EXPLICIT] æ—¶æ‰ä½¿ç”¨ã€‚" @@ -45529,13 +45617,12 @@ msgstr "" "å°†ç½‘æ ¼å®žä¾‹è§£æžä¸ºå‡ 何体。这包括 [MeshInstance]ã€[CSGShape] å’Œ [GridMap] 节点。" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Parses [StaticBody] colliders as geometry. The collider should be in any of " "the layers specified by [member geometry_collision_mask]." msgstr "" -"å°† [StaticBody] 碰撞器解æžä¸ºå‡ 何体。碰撞器应ä½äºŽ [member geometry/" -"collision_mask] 指定的任何层ä¸ã€‚" +"å°† [StaticBody] 碰撞器解æžä¸ºå‡ 何体。碰撞器应ä½äºŽ [member " +"geometry_collision_mask] 指定的任何层ä¸ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45555,21 +45642,19 @@ msgid "" msgstr "递归扫æ [NavigationMeshInstance] çš„å节点以获å–å‡ ä½•ä½“ã€‚" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Scans nodes in a group and their child nodes recursively for geometry. The " "group is specified by [member geometry_source_group_name]." msgstr "" -"以递归方å¼æ‰«æ组ä¸çš„节点åŠå…¶å节点以获å–å‡ ä½•å›¾å½¢ã€‚è¯¥ç»„ç”± [member geometry/" -"source_group_name] 指定。" +"以递归方å¼æ‰«æ组ä¸çš„节点åŠå…¶å节点以获å–å‡ ä½•å›¾å½¢ã€‚è¯¥ç»„ç”± [member " +"geometry_source_group_name] 指定。" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Uses nodes in a group for geometry. The group is specified by [member " "geometry_source_group_name]." msgstr "" -"使用一个组ä¸çš„èŠ‚ç‚¹è¿›è¡Œå‡ ä½•è¿ç®—。该组由 [member geometry/source_group_name] 指" +"使用一个组ä¸çš„èŠ‚ç‚¹è¿›è¡Œå‡ ä½•è¿ç®—。该组由 [member geometry_source_group_name] 指" "定。" #: doc/classes/NavigationMesh.xml @@ -45635,7 +45720,6 @@ msgstr "" "[NavigationMeshInstance] 使用。" #: doc/classes/NavigationMeshGenerator.xml -#, fuzzy msgid "" "Bakes navigation data to the provided [code]nav_mesh[/code] by parsing child " "nodes under the provided [code]root_node[/code] or a specific group of nodes " @@ -45646,8 +45730,8 @@ msgid "" msgstr "" "将导航数æ®çƒ˜ç„™è‡³æ供的 [code]nav_mesh[/code] ä¸ã€‚解æžçš„是æä¾›çš„æ ¹èŠ‚ç‚¹ " "[code]root_node[/code] çš„å节点,或å¯èƒ½åŒ…å«åŽŸå§‹å‡ 何体的分组。解æžè¡Œä¸ºå¯ä»¥é€š" -"过 [NavigationMesh] çš„ [member NavigationMesh.geometry/parsed_geometry_type] " -"å’Œ [member NavigationMesh.geometry/source_geometry_mode] 属性控制。" +"过 [NavigationMesh] çš„ [member NavigationMesh.geometry_parsed_geometry_type] " +"å’Œ [member NavigationMesh.geometry_source_geometry_mode] 属性控制。" #: doc/classes/NavigationMeshGenerator.xml msgid "" @@ -45678,6 +45762,18 @@ msgid "" "The cost of traveling distances inside this region can be controlled with " "the [member travel_cost] multiplier." msgstr "" +"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] 资æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"默认情况下,这个节点会在默认的 [World] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " +"[Navigation] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" +"如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " +"NavigationServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€" +"的最å°è·ç¦»ã€‚\n" +"[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å 并ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" +"边界。\n" +"从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" +"[b]注æ„:[/b]如果起点已ç»ä½äºŽè¿™ä¸ªåœ°åŒºä¹‹ä¸ï¼Œè¿™ä¸ªå€¼ä¸ä¼šåŠ 入到路径消耗之ä¸ã€‚\n" +"在这个地区ä¸ç§»åŠ¨æ‰€éœ€çš„消耗å¯ä»¥é€šè¿‡ [member travel_cost] 系数进行控制。" #: doc/classes/NavigationMeshInstance.xml msgid "" @@ -45715,11 +45811,14 @@ msgstr "决定该 [NavigationMeshInstance] å·²å¯ç”¨è¿˜æ˜¯å·²ç¦ç”¨ã€‚" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml +#, fuzzy msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" +"当从å¦ä¸€ä¸ªå¯¼èˆªåœ°åŒºçš„ç½‘æ ¼è¿›å…¥è¿™ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼è¿›è¡Œå¯»è·¯æ—¶ï¼Œä¼šå°†è¿›å…¥æ¶ˆè€— " +"[code]enter_cost[/code] åŠ å…¥è·¯å¾„é•¿åº¦ï¼Œä»Žè€Œç¡®å®šæœ€çŸè·¯å¾„。" #: doc/classes/NavigationMeshInstance.xml msgid "" @@ -45728,6 +45827,9 @@ msgid "" "navmeshes without matching layers will be ignored and the navigation map " "will only proximity merge different navmeshes with matching layers." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šè¯¥ [NavigationMesh] 所属的导航地图层。使用 [method " +"NavigationServer.map_get_path] 请求路径时会忽略没有任何匹é…å±‚çš„å¯¼èˆªç½‘æ ¼ï¼Œå¯¼èˆª" +"地图åªä¼šå°†æ‹¥æœ‰åŒ¹é…å±‚çš„å¯¼èˆªç½‘æ ¼è¿›è¡Œè¿‘ä¼¼åˆå¹¶ã€‚" #: doc/classes/NavigationMeshInstance.xml msgid "The [NavigationMesh] resource to use." @@ -45735,11 +45837,14 @@ msgstr "使用的 [NavigationMesh] 资æºã€‚" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml +#, fuzzy msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" +"å½“åœ¨è¿™ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ä¸è¿›è¡Œå¯»è·¯æ—¶ï¼Œä¼šå°†å·²ç§»åŠ¨çš„è·ç¦»ä¹˜ä¸Šç§»åŠ¨æ¶ˆè€— " +"[code]travel_cost[/code],从而确定最çŸè·¯å¾„。" #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the navigation mesh bake operation is completed." @@ -45754,7 +45859,6 @@ msgid "3D obstacle used in navigation for collision avoidance." msgstr "在导航ä¸ç”¨äºŽé˜²æ’žçš„ 3D éšœç¢ç‰©ã€‚" #: doc/classes/NavigationObstacle.xml -#, fuzzy msgid "" "3D obstacle used in navigation for collision avoidance. The obstacle needs " "navigation data to work correctly. This can be done by having the obstacle " @@ -45765,7 +45869,9 @@ msgid "" msgstr "" "导航ä¸ç”¨äºŽé˜²æ’žçš„ 3D éšœç¢ç‰©ã€‚éšœç¢ç‰©éœ€è¦å¯¼èˆªæ•°æ®æ‰èƒ½æ£ç¡®å·¥ä½œã€‚å¯ä»¥é€šè¿‡è®©éšœç¢ç‰©" "æˆä¸º [Navigation] 节点的å项实现,也å¯ä»¥ä½¿ç”¨ [method set_navigation]。" -"[NavigationObstacle] 是物ç†å®‰å…¨çš„。" +"[NavigationObstacle] 是物ç†å®‰å…¨çš„。\n" +"[b]注æ„:[/b]éšœç¢ç‰©åº”作为处ç†æŒç»ç§»åŠ¨çš„物体的最åŽæ‰‹æ®µï¼Œæ— 法进行高效的(é‡æ–°ï¼‰" +"烘焙。" #: doc/classes/NavigationObstacle.xml msgid "" @@ -45803,7 +45909,6 @@ msgid "2D obstacle used in navigation for collision avoidance." msgstr "在导航ä¸ç”¨äºŽé˜²æ’žçš„ 2D éšœç¢ç‰©ã€‚" #: doc/classes/NavigationObstacle2D.xml -#, fuzzy msgid "" "2D obstacle used in navigation for collision avoidance. The obstacle needs " "navigation data to work correctly. This can be done by having the obstacle " @@ -45814,7 +45919,9 @@ msgid "" msgstr "" "导航ä¸ç”¨äºŽé˜²æ’žçš„ 2D éšœç¢ç‰©ã€‚éšœç¢ç‰©éœ€è¦å¯¼èˆªæ•°æ®æ‰èƒ½æ£ç¡®å·¥ä½œã€‚å¯ä»¥é€šè¿‡è®©éšœç¢ç‰©" "æˆä¸º [Navigation2D] 节点的å项实现,也å¯ä»¥ä½¿ç”¨ [method set_navigation]。" -"[NavigationObstacle2D] 是物ç†å®‰å…¨çš„。" +"[NavigationObstacle2D] 是物ç†å®‰å…¨çš„。\n" +"[b]注æ„:[/b]éšœç¢ç‰©åº”作为处ç†æŒç»ç§»åŠ¨çš„物体的最åŽæ‰‹æ®µï¼Œè¿™äº›ç‰©ä½“æ— æ³•è¿›è¡Œé«˜æ•ˆçš„" +"(é‡æ–°ï¼‰çƒ˜ç„™ã€‚" #: doc/classes/NavigationObstacle2D.xml msgid "" @@ -45926,6 +46033,9 @@ msgid "" "NavigationServer.region_set_navmesh] API directly (as 2D uses the 3D server " "behind the scene)." msgstr "" +"返回这个导航多边形的 [NavigationMesh]ã€‚è¿™ä¸ªå¯¼èˆªç½‘æ ¼å¯ç”¨äºŽä½¿ç”¨ [method " +"NavigationServer.region_set_navmesh] API 直接更新æŸä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ï¼ˆ2D 在底" +"层使用的是 3D æœåŠ¡å™¨ï¼‰ã€‚" #: doc/classes/NavigationPolygon.xml msgid "" @@ -45969,9 +46079,8 @@ msgstr "" "make_polygons_from_outlines] æ¥æ›´æ–°å¤šè¾¹å½¢ã€‚" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "A region of the 2D navigation map." -msgstr "çƒ˜ç„™å¯¼èˆªç½‘æ ¼ã€‚" +msgstr "2D 导航地图上的一个地区。" #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -45992,6 +46101,18 @@ msgid "" "The pathfinding cost of traveling distances inside this region can be " "controlled with the [member travel_cost] multiplier." msgstr "" +"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] 资æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"默认情况下,这个节点会在默认的 [World2D] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " +"[Navigation2D] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" +"如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " +"Navigation2DServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€" +"需的最å°è·ç¦»ã€‚\n" +"[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å 并ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" +"边界。\n" +"从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„寻路消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" +"[b]注æ„:[/b]如果起点已ç»ä½äºŽè¿™ä¸ªåœ°åŒºä¹‹ä¸ï¼Œè¿™ä¸ªå€¼ä¸ä¼šåŠ 入到路径消耗之ä¸ã€‚\n" +"在这个地区ä¸ç§»åŠ¨æ‰€éœ€çš„寻路消耗å¯ä»¥é€šè¿‡ [member travel_cost] 系数进行控制。" #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -46005,9 +46126,8 @@ msgstr "" "ä¸ä¸ŽæŸä¸ªç‚¹æœ€æŽ¥è¿‘çš„ [NavigationPolygonInstance]。" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "Determines if the [NavigationPolygonInstance] is enabled or disabled." -msgstr "决定该 [NavigationMeshInstance] å·²å¯ç”¨è¿˜æ˜¯å·²ç¦ç”¨ã€‚" +msgstr "决定该 [NavigationPolygonInstance] å·²å¯ç”¨è¿˜æ˜¯å·²ç¦ç”¨ã€‚" #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -46016,11 +46136,13 @@ msgid "" "navmeshes without matching layers will be ignored and the navigation map " "will only proximity merge different navmeshes with matching layers." msgstr "" +"ä½åŸŸï¼Œç”¨äºŽå†³å®šè¯¥ [NavigationPolygon] 所属的导航地图层。使用 [method " +"Navigation2DServer.map_get_path] 请求路径时会忽略没有任何匹é…å±‚çš„å¯¼èˆªç½‘æ ¼ï¼Œå¯¼" +"航地图åªä¼šå°†æ‹¥æœ‰åŒ¹é…å±‚çš„å¯¼èˆªç½‘æ ¼è¿›è¡Œè¿‘ä¼¼åˆå¹¶ã€‚" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "The [NavigationPolygon] resource to use." -msgstr "使用的 [NavigationMesh] 资æºã€‚" +msgstr "使用的 [NavigationPolygon] 资æºã€‚" #: doc/classes/NavigationServer.xml msgid "Server interface for low-level 3D navigation access." @@ -46121,6 +46243,8 @@ msgid "" "Set the region's navigation layers. This allows selecting regions from a " "path request (when using [method NavigationServer.map_get_path])." msgstr "" +"设置该地区的导航层。å¯ä»¥åœ¨ï¼ˆä½¿ç”¨ [method NavigationServer.map_get_path])进行" +"路径请求时选择地区。" #: doc/classes/NavigationServer.xml msgid "Control activation of this server." @@ -48511,6 +48635,10 @@ msgid "" "changed to negative scales on the Y axis and a rotation of 180 degrees when " "decomposed." msgstr "" +"该节点的缩放。未缩放值:[code](1, 1)[/code]。\n" +"[b]注æ„:[/b]2D ä¸ï¼Œå˜æ¢çŸ©é˜µæ˜¯æ— 法分解出负数的 X 缩放的。由于 Godot ä¸ä½¿ç”¨å˜" +"æ¢çŸ©é˜µæ¥è¡¨ç¤ºç¼©æ”¾ï¼ŒX 轴上的负数缩放在分解åŽä¼šå˜ä¸º Y 轴的负数缩放和一次 180 度" +"的旋转。" #: doc/classes/Node2D.xml msgid "Local [Transform2D]." @@ -51381,6 +51509,15 @@ msgid "" "OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" "[/codeblock]" msgstr "" +"将文件或目录移动到系统的回收站。å¦è¯·å‚阅 [method Directory.remove].\n" +"该方法仅支æŒå…¨å±€è·¯å¾„ï¼Œæ‰€ä»¥ä½ å¯èƒ½éœ€è¦ä½¿ç”¨ [method ProjectSettings." +"globalize_path]。请勿将其用于 [code]res://[/code] ä¸çš„æ–‡ä»¶ï¼Œå› ä¸ºåœ¨å¯¼å‡ºåŽçš„项" +"ç›®ä¸æ˜¯æ— 法æ£å¸¸å·¥ä½œçš„。\n" +"[b]注æ„:[/b]如果用户在系统ä¸ç¦ç”¨äº†å›žæ”¶ç«™ï¼Œé‚£ä¹ˆè¯¥æ–‡ä»¶ä¼šè¢«æ°¸ä¹…åˆ é™¤ã€‚\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 "" @@ -59222,12 +59359,16 @@ msgid "" "default, this message is only used in exported projects due to the editor-" "only override applied to this setting." msgstr "" +"引擎崩溃时,在调用站回溯å‰æ˜¾ç¤ºçš„消æ¯ã€‚默认情况下,这个消æ¯åªä¼šåœ¨å¯¼å‡ºåŽçš„项目" +"ä¸ä½¿ç”¨ï¼Œå› 为编辑器会对这个设置进行覆盖。" #: doc/classes/ProjectSettings.xml msgid "" "Editor-only override for [member debug/settings/crash_handler/message]. Does " "not affect exported projects in debug or release mode." msgstr "" +"仅用于编辑器的 [member debug/settings/crash_handler/message] 覆盖项。ä¸ä¼šå½±å“" +"用调试或å‘布模å¼å¯¼å‡ºçš„项目。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59540,6 +59681,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -59838,193 +59991,193 @@ msgstr "触摸事件的默认延迟(å•ä½ä¸ºç§’ï¼‰ã€‚ä»…å½±å“ iOS 设备。" msgid "" "Optional name for the 2D navigation layer 1. If left empty, the layer will " "display as \"Layer 1\"." -msgstr "" +msgstr "2D 导航层 1 çš„å¯é€‰å称。留空则会显示为“层 1â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 10. If left empty, the layer will " "display as \"Layer 10\"." -msgstr "" +msgstr "2D 导航层 10 çš„å¯é€‰å称。留空则会显示为“层 10â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 11. If left empty, the layer will " "display as \"Layer 11\"." -msgstr "" +msgstr "2D 导航层 11 çš„å¯é€‰å称。留空则会显示为“层 11â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 12. If left empty, the layer will " "display as \"Layer 12\"." -msgstr "" +msgstr "2D 导航层 12 çš„å¯é€‰å称。留空则会显示为“层 12â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 13. If left empty, the layer will " "display as \"Layer 13\"." -msgstr "" +msgstr "2D 导航层 13 çš„å¯é€‰å称。留空则会显示为“层 13â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 14. If left empty, the layer will " "display as \"Layer 14\"." -msgstr "" +msgstr "2D 导航层 14 çš„å¯é€‰å称。留空则会显示为“层 14â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 15. If left empty, the layer will " "display as \"Layer 15\"." -msgstr "" +msgstr "2D 导航层 15 çš„å¯é€‰å称。留空则会显示为“层 15â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 16. If left empty, the layer will " "display as \"Layer 16\"." -msgstr "" +msgstr "2D 导航层 16 çš„å¯é€‰å称。留空则会显示为“层 16â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 17. If left empty, the layer will " "display as \"Layer 17\"." -msgstr "" +msgstr "2D 导航层 17 çš„å¯é€‰å称。留空则会显示为“层 17â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 18. If left empty, the layer will " "display as \"Layer 18\"." -msgstr "" +msgstr "2D 导航层 18 çš„å¯é€‰å称。留空则会显示为“层 18â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 19. If left empty, the layer will " "display as \"Layer 19\"." -msgstr "" +msgstr "2D 导航层 19 çš„å¯é€‰å称。留空则会显示为“层 19â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 2. If left empty, the layer will " "display as \"Layer 2\"." -msgstr "" +msgstr "2D 导航层 2 çš„å¯é€‰å称。留空则会显示为“层 2â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 20. If left empty, the layer will " "display as \"Layer 20\"." -msgstr "" +msgstr "2D 导航层 20 çš„å¯é€‰å称。留空则会显示为“层 20â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 21. If left empty, the layer will " "display as \"Layer 21\"." -msgstr "" +msgstr "2D 导航层 21 çš„å¯é€‰å称。留空则会显示为“层 21â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 22. If left empty, the layer will " "display as \"Layer 22\"." -msgstr "" +msgstr "2D 导航层 22 çš„å¯é€‰å称。留空则会显示为“层 22â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 23. If left empty, the layer will " "display as \"Layer 23\"." -msgstr "" +msgstr "2D 导航层 23 çš„å¯é€‰å称。留空则会显示为“层 23â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 24. If left empty, the layer will " "display as \"Layer 24\"." -msgstr "" +msgstr "2D 导航层 24 çš„å¯é€‰å称。留空则会显示为“层 24â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 25. If left empty, the layer will " "display as \"Layer 25\"." -msgstr "" +msgstr "2D 导航层 25 çš„å¯é€‰å称。留空则会显示为“层 25â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 26. If left empty, the layer will " "display as \"Layer 26\"." -msgstr "" +msgstr "2D 导航层 26 çš„å¯é€‰å称。留空则会显示为“层 26â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 27. If left empty, the layer will " "display as \"Layer 27\"." -msgstr "" +msgstr "2D 导航层 27 çš„å¯é€‰å称。留空则会显示为“层 27â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 28. If left empty, the layer will " "display as \"Layer 28\"." -msgstr "" +msgstr "2D 导航层 28 çš„å¯é€‰å称。留空则会显示为“层 28â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 29. If left empty, the layer will " "display as \"Layer 29\"." -msgstr "" +msgstr "2D 导航层 29 çš„å¯é€‰å称。留空则会显示为“层 29â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 3. If left empty, the layer will " "display as \"Layer 3\"." -msgstr "" +msgstr "2D 导航层 3 çš„å¯é€‰å称。留空则会显示为“层 3â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 30. If left empty, the layer will " "display as \"Layer 30\"." -msgstr "" +msgstr "2D 导航层 30 çš„å¯é€‰å称。留空则会显示为“层 30â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 31. If left empty, the layer will " "display as \"Layer 31\"." -msgstr "" +msgstr "2D 导航层 31 çš„å¯é€‰å称。留空则会显示为“层 31â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 32. If left empty, the layer will " "display as \"Layer 32\"." -msgstr "" +msgstr "2D 导航层 32 çš„å¯é€‰å称。留空则会显示为“层 32â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 4. If left empty, the layer will " "display as \"Layer 4\"." -msgstr "" +msgstr "2D 导航层 4 çš„å¯é€‰å称。留空则会显示为“层 4â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 5. If left empty, the layer will " "display as \"Layer 5\"." -msgstr "" +msgstr "2D 导航层 5 çš„å¯é€‰å称。留空则会显示为“层 5â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 6. If left empty, the layer will " "display as \"Layer 6\"." -msgstr "" +msgstr "2D 导航层 6 çš„å¯é€‰å称。留空则会显示为“层 6â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 7. If left empty, the layer will " "display as \"Layer 7\"." -msgstr "" +msgstr "2D 导航层 7 çš„å¯é€‰å称。留空则会显示为“层 7â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 8. If left empty, the layer will " "display as \"Layer 8\"." -msgstr "" +msgstr "2D 导航层 8 çš„å¯é€‰å称。留空则会显示为“层 8â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 9. If left empty, the layer will " "display as \"Layer 9\"." -msgstr "" +msgstr "2D 导航层 9 çš„å¯é€‰å称。留空则会显示为“层 9â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 1." @@ -60238,193 +60391,193 @@ msgstr "2D 渲染层 9 çš„å¯é€‰å称。" msgid "" "Optional name for the 3D navigation layer 1. If left empty, the layer will " "display as \"Layer 1\"." -msgstr "" +msgstr "3D 导航层 1 çš„å¯é€‰å称。留空则会显示为“层 1â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 10. If left empty, the layer will " "display as \"Layer 10\"." -msgstr "" +msgstr "3D 导航层 10 çš„å¯é€‰å称。留空则会显示为“层 10â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 11. If left empty, the layer will " "display as \"Layer 11\"." -msgstr "" +msgstr "3D 导航层 11 çš„å¯é€‰å称。留空则会显示为“层 11â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 12. If left empty, the layer will " "display as \"Layer 12\"." -msgstr "" +msgstr "3D 导航层 12 çš„å¯é€‰å称。留空则会显示为“层 12â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 13. If left empty, the layer will " "display as \"Layer 13\"." -msgstr "" +msgstr "3D 导航层 13 çš„å¯é€‰å称。留空则会显示为“层 13â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 14. If left empty, the layer will " "display as \"Layer 14\"." -msgstr "" +msgstr "3D 导航层 14 çš„å¯é€‰å称。留空则会显示为“层 14â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 15. If left empty, the layer will " "display as \"Layer 15\"." -msgstr "" +msgstr "3D 导航层 15 çš„å¯é€‰å称。留空则会显示为“层 15â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 16. If left empty, the layer will " "display as \"Layer 16\"." -msgstr "" +msgstr "3D 导航层 16 çš„å¯é€‰å称。留空则会显示为“层 16â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 17. If left empty, the layer will " "display as \"Layer 17\"." -msgstr "" +msgstr "3D 导航层 17 çš„å¯é€‰å称。留空则会显示为“层 17â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 18. If left empty, the layer will " "display as \"Layer 18\"." -msgstr "" +msgstr "3D 导航层 18 çš„å¯é€‰å称。留空则会显示为“层 18â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 19. If left empty, the layer will " "display as \"Layer 19\"." -msgstr "" +msgstr "3D 导航层 19 çš„å¯é€‰å称。留空则会显示为“层 19â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 2. If left empty, the layer will " "display as \"Layer 2\"." -msgstr "" +msgstr "3D 导航层 2 çš„å¯é€‰å称。留空则会显示为“层 2â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 20. If left empty, the layer will " "display as \"Layer 20\"." -msgstr "" +msgstr "3D 导航层 20 çš„å¯é€‰å称。留空则会显示为“层 20â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 21. If left empty, the layer will " "display as \"Layer 21\"." -msgstr "" +msgstr "3D 导航层 21 çš„å¯é€‰å称。留空则会显示为“层 21â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 22. If left empty, the layer will " "display as \"Layer 22\"." -msgstr "" +msgstr "3D 导航层 22 çš„å¯é€‰å称。留空则会显示为“层 22â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 23. If left empty, the layer will " "display as \"Layer 23\"." -msgstr "" +msgstr "3D 导航层 23 çš„å¯é€‰å称。留空则会显示为“层 23â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 24. If left empty, the layer will " "display as \"Layer 24\"." -msgstr "" +msgstr "3D 导航层 24 çš„å¯é€‰å称。留空则会显示为“层 24â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 25. If left empty, the layer will " "display as \"Layer 25\"." -msgstr "" +msgstr "3D 导航层 25 çš„å¯é€‰å称。留空则会显示为“层 25â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 26. If left empty, the layer will " "display as \"Layer 26\"." -msgstr "" +msgstr "3D 导航层 26 çš„å¯é€‰å称。留空则会显示为“层 26â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 27. If left empty, the layer will " "display as \"Layer 27\"." -msgstr "" +msgstr "3D 导航层 27 çš„å¯é€‰å称。留空则会显示为“层 27â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 28. If left empty, the layer will " "display as \"Layer 28\"." -msgstr "" +msgstr "3D 导航层 28 çš„å¯é€‰å称。留空则会显示为“层 28â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 29. If left empty, the layer will " "display as \"Layer 29\"." -msgstr "" +msgstr "3D 导航层 29 çš„å¯é€‰å称。留空则会显示为“层 29â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 3. If left empty, the layer will " "display as \"Layer 3\"." -msgstr "" +msgstr "3D 导航层 3 çš„å¯é€‰å称。留空则会显示为“层 3â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 30. If left empty, the layer will " "display as \"Layer 30\"." -msgstr "" +msgstr "3D 导航层 30 çš„å¯é€‰å称。留空则会显示为“层 30â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 31. If left empty, the layer will " "display as \"Layer 31\"." -msgstr "" +msgstr "3D 导航层 31 çš„å¯é€‰å称。留空则会显示为“层 31â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 32. If left empty, the layer will " "display as \"Layer 32\"." -msgstr "" +msgstr "3D 导航层 32 çš„å¯é€‰å称。留空则会显示为“层 32â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 4. If left empty, the layer will " "display as \"Layer 4\"." -msgstr "" +msgstr "3D 导航层 4 çš„å¯é€‰å称。留空则会显示为“层 4â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 5. If left empty, the layer will " "display as \"Layer 5\"." -msgstr "" +msgstr "3D 导航层 5 çš„å¯é€‰å称。留空则会显示为“层 5â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 6. If left empty, the layer will " "display as \"Layer 6\"." -msgstr "" +msgstr "3D 导航层 6 çš„å¯é€‰å称。留空则会显示为“层 6â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 7. If left empty, the layer will " "display as \"Layer 7\"." -msgstr "" +msgstr "3D 导航层 7 çš„å¯é€‰å称。留空则会显示为“层 7â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 8. If left empty, the layer will " "display as \"Layer 8\"." -msgstr "" +msgstr "3D 导航层 8 çš„å¯é€‰å称。留空则会显示为“层 8â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 9. If left empty, the layer will " "display as \"Layer 9\"." -msgstr "" +msgstr "3D 导航层 9 çš„å¯é€‰å称。留空则会显示为“层 9â€ã€‚" #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 1." @@ -60712,42 +60865,54 @@ msgid "" "map_set_cell_height].\n" "[b]Note:[/b] Currently not implemented." msgstr "" +"2D 导航地图的默认å•å…ƒæ ¼é«˜åº¦ã€‚è§ [method Navigation2DServer." +"map_set_cell_height]。\n" +"[b]注æ„:[/b]尚未实现。" #: doc/classes/ProjectSettings.xml msgid "" "Default cell size for 2D navigation maps. See [method Navigation2DServer." "map_set_cell_size]." msgstr "" +"2D 导航地图的默认å•å…ƒæ ¼å¤§å°ã€‚è§ [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 "" +"2D 导航地图的默认边界连接边è·ã€‚è§ [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 "" +"3D 导航地图的默认å•å…ƒæ ¼é«˜åº¦ã€‚è§ [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 "" +"3D 导航地图的默认å•å…ƒæ ¼å¤§å°ã€‚è§ [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 "" +"3D 导航地图的默认边界连接边è·ã€‚è§ [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 "" +msgstr "3D 导航地图的默认地图上å‘é‡ã€‚è§ [method NavigationServer.map_set_up]。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62742,7 +62907,6 @@ msgid "General-purpose 3D proximity detection node." msgstr "通用的 3D 邻近检测节点。" #: doc/classes/ProximityGroup.xml -#, fuzzy msgid "" "General-purpose proximity detection node. [ProximityGroup] can be used for " "[i]approximate[/i] distance checks, which are faster than exact distance " @@ -65618,24 +65782,20 @@ msgid "Makes text fill width." msgstr "使文本填充宽度。" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns top of the inline image to the top of the text." -msgstr "ç›’å的高度,从盒åçš„ä¸å¿ƒå¼€å§‹æµ‹é‡ã€‚" +msgstr "将内è”图åƒçš„顶部与文本的顶部对é½ã€‚" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns center of the inline image to the center of the text." -msgstr "å°†å项与容器的ä¸å¿ƒå¯¹é½ã€‚" +msgstr "将内è”图åƒçš„ä¸å¿ƒä¸Žæ–‡æœ¬çš„ä¸å¿ƒå¯¹é½ã€‚" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns bottom of the inline image to the baseline of the text." -msgstr "ç›’å的高度,从盒åçš„ä¸å¿ƒå¼€å§‹æµ‹é‡ã€‚" +msgstr "将内è”图åƒçš„底部与文本的基线对é½ã€‚" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns bottom of the inline image to the bottom of the text." -msgstr "å°†å控件与容器的末端对é½ï¼Œå³ä¾§æˆ–底部。" +msgstr "将内è”图åƒçš„底部与文本的底部对é½ã€‚" #: doc/classes/RichTextLabel.xml msgid "Each list item has a number marker." @@ -67928,7 +68088,6 @@ msgid "One-shot timer." msgstr "一次性定时器。" #: doc/classes/SceneTreeTimer.xml -#, fuzzy msgid "" "A one-shot timer managed by the scene tree, which emits [signal timeout] on " "completion. See also [method SceneTree.create_timer].\n" @@ -67953,8 +68112,8 @@ msgstr "" " yield(get_tree().create_timer(1.0), \"timeout\")\n" " print(\"计时器结æŸã€‚\")\n" "[/codeblock]\n" -"时间结æŸåŽï¼Œè¯¥è®¡æ—¶å™¨å°†è¢«è‡ªåŠ¨é‡Šæ”¾ï¼Œæ‰€ä»¥è¯·æ³¨æ„ï¼Œä½ æ‰€ä¿ç•™çš„任何对它的引用届时都" -"会失效。" +"时间结æŸåŽï¼Œå¯¹è¯¥è®¡æ—¶å™¨çš„引用将被自动释放。è¦ä¿ç•™è¯¥è®¡æ—¶å™¨ï¼Œä½ å¯ä»¥ä¿æŒå¯¹å®ƒçš„引" +"ç”¨ã€‚è§ [Reference]。" #: doc/classes/SceneTreeTimer.xml msgid "The time remaining (in seconds)." @@ -70204,6 +70363,9 @@ msgid "" "transformation matrices in Godot, the scale values will either be all " "positive or all negative." msgstr "" +"本地å˜æ¢ä¸çš„缩放。\n" +"[b]注æ„:[/b]3D ä¸ï¼Œå˜æ¢çŸ©é˜µæ˜¯æ— 法分解出æ£è´Ÿæ··åˆçš„缩放的。由于 Godot ä¸ä½¿ç”¨å˜" +"æ¢çŸ©é˜µæ¥è¡¨ç¤ºç¼©æ”¾ï¼Œå¾—到的缩放值è¦ä¹ˆå…¨æ£ã€è¦ä¹ˆå…¨è´Ÿã€‚" #: doc/classes/Spatial.xml msgid "Local space [Transform] of this node, with respect to the parent node." @@ -77705,9 +77867,8 @@ msgstr "" "[/codeblock]" #: doc/classes/TileMap.xml -#, fuzzy msgid "If [code]true[/code], this TileMap bakes a navigation region." -msgstr "为 [code]true[/code] æ—¶å˜åœ¨æŒ‡å®šå称的动画。" +msgstr "如果为 [code]true[/code],这个 TileMap 会烘焙导航地区。" #: doc/classes/TileMap.xml msgid "If [code]true[/code], the cell's UVs will be clipped." @@ -77843,7 +78004,7 @@ msgstr "图å—地图的方å‘模å¼ã€‚有关å¯èƒ½çš„值,å‚阅[enum Mode]。" #: doc/classes/TileMap.xml msgid "The navigation layers the TileMap generates its navigation regions in." -msgstr "" +msgstr "TileMap 生æˆå…¶å¯¼èˆªåœ°åŒºçš„导航层。" #: doc/classes/TileMap.xml msgid "" @@ -79205,6 +79366,10 @@ msgid "" "changed to negative scales on the Y axis and a rotation of 180 degrees when " "decomposed." msgstr "" +"返回该å˜æ¢åœ¨ä½¿ç”¨ç»™å®šçš„ [code]scale[/code] 缩放系统进行矩阵乘法åŽçš„副本。\n" +"[b]注æ„:[/b]2D ä¸ï¼Œå˜æ¢çŸ©é˜µæ˜¯æ— 法分解出负数的 X 缩放的。由于 Godot ä¸ä½¿ç”¨å˜" +"æ¢çŸ©é˜µæ¥è¡¨ç¤ºç¼©æ”¾ï¼ŒX 轴上的负数缩放在分解åŽä¼šå˜ä¸º Y 轴的负数缩放和一次 180 度" +"的旋转。" #: doc/classes/Transform2D.xml msgid "" @@ -83740,23 +83905,26 @@ msgstr "如果[code]true[/code],父级的[method Node._process]将被åœæ¢ã€‚ #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will freeze [RigidBody2D] nodes." -msgstr "这个å¯ç”¨ç¨‹åºå°†å†»ç»“[RigidBody2D]节点。" +msgstr "这个å¯ç”¨ç¨‹åºå°†å†»ç»“ [RigidBody2D] 节点。" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [Particles2D] nodes." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢[Particles2D]节点。" +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢ [Particles2D] 节点。" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„_process函数。" +#, fuzzy +msgid "This enabler will stop the parent's [method Node._process] function." +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ _process 函数。" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„_physics_process函数。" +#, fuzzy +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ _physics_process 函数。" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [AnimatedSprite] nodes animations." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢[AnimatedSprite]节点的动画。" +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢ [AnimatedSprite] 节点的动画。" #: doc/classes/VisibilityNotifier.xml doc/classes/VisibilityNotifier2D.xml msgid "Detects approximately when the node is visible on screen." @@ -83809,6 +83977,10 @@ msgid "" "nodes that are far away.\n" "[b]Note:[/b] This feature will be disabled if set to 0.0." msgstr "" +"除了检查节点是å¦åœ¨å±å¹•å†…或在 [Camera] 的视野内,VisibilityNotifier 还å¯ä»¥åœ¨ä½¿" +"用é€è§†æŠ•å½±çš„ [Camera] 时对节点是å¦åœ¨æŒ‡å®šçš„最大è·ç¦»å†…进行检测。å¯ç”¨äºŽé™åˆ¶è¿œè·" +"离节点的性能需求。\n" +"[b]注æ„:[/b]如果设为 0.0 则会ç¦ç”¨è¿™ä¸ªç‰¹æ€§ã€‚" #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier enters a [Camera]'s view." @@ -89285,6 +89457,11 @@ msgid "" "compilations when this value is zero for at least two frames in a row.\n" "Unimplemented in the GLES2 rendering backend, always returns 0." msgstr "" +"在该帧ä¸ï¼Œå¤„于编译状æ€çš„ç€è‰²å™¨æ•°é‡å³°å€¼ã€‚\n" +"å¯ç”¨äºŽæ£€æŸ¥å±å¹•ä¸Šå½“å‰ç€è‰²å™¨çš„异æ¥ç¼–译是å¦å®Œæˆã€‚\n" +"[b]注æ„:[/b]è¦çœŸæ£ç¡®å®šå®Œæˆï¼Œè¯·åœ¨è¿™ä¸ªå€¼è‡³å°‘è¿žç»ä¸¤å¸§éƒ½ä¸ºé›¶æ—¶æ‰è®¤ä¸ºæ²¡æœ‰å…¶ä»–东西" +"需è¦ç¼–译。\n" +"GLES2 渲染åŽç«¯ä¸å°šæœªå®žçŽ°ï¼Œå§‹ç»ˆè¿”回 0。" #: doc/classes/VisualServer.xml msgid "The amount of surface changes in the frame." @@ -93271,14 +93448,13 @@ msgid "Class that has everything pertaining to a world." msgstr "拥有与世界相关的一切的类。" #: doc/classes/World.xml -#, fuzzy msgid "" "Class that has everything pertaining to a world. A physics space, a visual " "scenario, a navigation map and a sound space. Spatial nodes register their " "resources into the current world." msgstr "" -"拥有与世界相关的一切的类。物ç†ç©ºé—´ã€è§†è§‰åœºæ™¯å’Œå£°éŸ³ç©ºé—´ã€‚空间节点将其资æºæ³¨å†Œ" -"到当å‰ä¸–ç•Œä¸ã€‚" +"拥有与世界相关的一切的类。物ç†ç©ºé—´ã€è§†è§‰åœºæ™¯ã€å¯¼èˆªåœ°å›¾å’Œå£°éŸ³ç©ºé—´ã€‚空间节点将" +"其资æºæ³¨å†Œåˆ°å½“å‰ä¸–ç•Œä¸ã€‚" #: doc/classes/World.xml msgid "" @@ -93291,18 +93467,18 @@ msgid "The World's [Environment]." msgstr "Worldçš„[Environment]环境。" #: doc/classes/World.xml +#, fuzzy msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" "如果 World çš„ [Environment] 失败或丢失,将使用 World çš„ " "fallback_environment。" #: doc/classes/World.xml -#, fuzzy msgid "" "The [RID] of this world's navigation map. Used by the [NavigationServer]." -msgstr "返回这个代ç†åœ¨ [NavigationServer] 上的 [RID]。" +msgstr "这个世界的导航地图的 [RID]。会被 [NavigationServer] 使用。" #: doc/classes/World.xml msgid "The World's visual scenario." @@ -93317,14 +93493,13 @@ msgid "Class that has everything pertaining to a 2D world." msgstr "拥有与 2D 世界有关的所有内容的类。" #: doc/classes/World2D.xml -#, fuzzy msgid "" "Class that has everything pertaining to a 2D world. A physics space, a " "visual scenario, a navigation map and a sound space. 2D nodes register their " "resources into the current 2D world." msgstr "" -"拥有与 2D 世界有关一切的类。一个物ç†ç©ºé—´ã€ä¸€ä¸ªå¯è§†åŒ–场景和一个声音空间。2D 节" -"点将其资æºæ³¨å†Œåˆ°å½“å‰çš„ 2D 世界ä¸ã€‚" +"拥有与 2D 世界有关一切的类。物ç†ç©ºé—´ã€è§†è§‰åœºæ™¯ã€å¯¼èˆªåœ°å›¾å’Œå£°éŸ³ç©ºé—´ã€‚2D 节点将" +"其资æºæ³¨å†Œåˆ°å½“å‰çš„ 2D 世界ä¸ã€‚" #: doc/classes/World2D.xml msgid "" @@ -93342,10 +93517,9 @@ msgstr "" "问仅é™äºŽä¸»çº¿ç¨‹ä¸çš„ [code]_physics_process(delta)[/code]。" #: doc/classes/World2D.xml -#, fuzzy msgid "" "The [RID] of this world's navigation map. Used by the [Navigation2DServer]." -msgstr "返回这个代ç†åœ¨ [Navigation2DServer] 上的 [RID]。" +msgstr "这个世界的导航地图的 [RID]。会被 [Navigation2DServer] 使用。" #: doc/classes/World2D.xml msgid "" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index 9422f78dba..ba40f5ee74 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -428,7 +428,7 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Compares two values by checking their actual contents, recursing into any " -"`Array` or `Dictionary` up to its deepest level.\n" +"[Array] or [Dictionary] up to its deepest level.\n" "This compares to [code]==[/code] in a number of ways:\n" "- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " @@ -3506,6 +3506,12 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" "Hints that a string property is a path to a file. Editing it will show a " "file dialog for picking the path. The hint string can be a set of filters " "with wildcards like [code]\"*.png,*.jpg\"[/code]." @@ -30282,8 +30288,8 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "" -"Represents the pressure the user puts on the button with his finger, if the " -"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." msgstr "" #: doc/classes/InputEventJoypadMotion.xml @@ -36676,7 +36682,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding enters this regions navmesh from another regions navmesh " +"When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " "determining the shortest path." msgstr "" @@ -36696,7 +36702,7 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml msgid "" -"When pathfinding moves inside this regions navmesh the traveled distances " +"When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" @@ -47519,6 +47525,18 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Search path for project-specific script templates. Godot will search for " "script templates both in the editor-specific path and in this project-" "specific path." @@ -66830,11 +66848,12 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _process function." +msgid "This enabler will stop the parent's [method Node._process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml -msgid "This enabler will stop the parent's _physics_process function." +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." msgstr "" #: doc/classes/VisibilityEnabler2D.xml @@ -74871,8 +74890,8 @@ msgstr "" #: doc/classes/World.xml msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." +"The World's fallback environment will be used if [member environment] fails " +"or is missing." msgstr "" #: doc/classes/World.xml diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 94ae8ecc8a..33c7b9bf32 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1923,11 +1923,11 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData * render_data.cam_transform = p_camera_data->main_transform; render_data.inv_cam_transform = render_data.cam_transform.affine_inverse(); render_data.cam_projection = p_camera_data->main_projection; - render_data.view_projection[0] = p_camera_data->main_projection; render_data.cam_orthogonal = p_camera_data->is_orthogonal; render_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]; } diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 308ef36fa1..4757a3f161 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -100,6 +100,7 @@ struct RenderDataGLES3 { // For stereo rendering uint32_t view_count = 1; + Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; CameraMatrix view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; float z_near = 0.0; diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 903a39b3d0..3b21ee67a1 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -457,17 +457,17 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t hash() const { int vdc = vertex_formats.size(); - uint32_t h = hash_djb2_one_32(vdc); + uint32_t h = hash_murmur3_one_32(vdc); const VertexAttribute *ptr = vertex_formats.ptr(); for (int i = 0; i < vdc; i++) { const VertexAttribute &vd = ptr[i]; - h = hash_djb2_one_32(vd.location, h); - h = hash_djb2_one_32(vd.offset, h); - h = hash_djb2_one_32(vd.format, h); - h = hash_djb2_one_32(vd.stride, h); - h = hash_djb2_one_32(vd.frequency, h); + h = hash_murmur3_one_32(vd.location, h); + h = hash_murmur3_one_32(vd.offset, h); + h = hash_murmur3_one_32(vd.format, h); + h = hash_murmur3_one_32(vd.stride, h); + h = hash_murmur3_one_32(vd.frequency, h); } - return h; + return hash_fmix32(h); } }; diff --git a/editor/debugger/debug_adapter/debug_adapter_types.h b/editor/debugger/debug_adapter/debug_adapter_types.h index 4d77b6d51c..fd66905f9b 100644 --- a/editor/debugger/debug_adapter/debug_adapter_types.h +++ b/editor/debugger/debug_adapter/debug_adapter_types.h @@ -220,7 +220,7 @@ struct StackFrame { int column; static uint32_t hash(const StackFrame &p_frame) { - return hash_djb2_one_32(p_frame.id); + return hash_murmur3_one_32(p_frame.id); } bool operator==(const StackFrame &p_other) const { return id == p_other.id; diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h index 8dc53690eb..d50cbec291 100644 --- a/editor/debugger/editor_debugger_node.h +++ b/editor/debugger/editor_debugger_node.h @@ -72,7 +72,7 @@ private: static uint32_t hash(const Breakpoint &p_val) { uint32_t h = HashMapHasherDefault::hash(p_val.source); - return hash_djb2_one_32(p_val.line, h); + return hash_murmur3_one_32(p_val.line, h); } bool operator==(const Breakpoint &p_b) const { return (line == p_b.line && source == p_b.source); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 5cff088d0c..bcfc516849 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -553,6 +553,8 @@ void EditorNode::_update_from_settings() { 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")); + + _update_title(); } void EditorNode::_select_default_main_screen_plugin() { @@ -582,10 +584,7 @@ void EditorNode::_notification(int p_what) { opening_prev = false; } - if (unsaved_cache != (saved_version != editor_data.get_undo_redo().get_version())) { - unsaved_cache = (saved_version != editor_data.get_undo_redo().get_version()); - _update_title(); - } + unsaved_cache = saved_version != editor_data.get_undo_redo().get_version(); if (last_checked_version != editor_data.get_undo_redo().get_version()) { _update_scene_tabs(); @@ -7096,7 +7095,6 @@ EditorNode::EditorNode() { add_editor_plugin(VersionControlEditorPlugin::get_singleton()); add_editor_plugin(memnew(ShaderEditorPlugin)); add_editor_plugin(memnew(ShaderFileEditorPlugin)); - add_editor_plugin(memnew(VisualShaderEditorPlugin)); add_editor_plugin(memnew(Camera3DEditorPlugin)); add_editor_plugin(memnew(ThemeEditorPlugin)); diff --git a/editor/icons/NavigationAgent2D.svg b/editor/icons/NavigationAgent2D.svg index 3f1d571a7e..05aeb95e12 100644 --- a/editor/icons/NavigationAgent2D.svg +++ b/editor/icons/NavigationAgent2D.svg @@ -1 +1 @@ -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3 0-5 2-5 5s3 6 5 9c2-3 5.007-6.03 5-9 0-3-2-5-5-5zm0 2.5c1.371 0 2.5 1.129 2.5 2.5s-1.129 2.5-2.5 2.5-2.5-1.129-2.5-2.5 1.129-2.5 2.5-2.5z" fill="#e0e0e0" fill-rule="nonzero"/></svg> +<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1v2.5c1.371 0 2.5 1.129 2.5 2.5s-1.129 2.5-2.5 2.5v6.5c2-3 5.007-6.03 5-9 0-3-2-5-5-5z" fill="#8da5f3" fill-opacity=".988235"/><path d="m8 1c-3 0-5 2-5 5s3 6 5 9v-6.5c-1.371 0-2.5-1.129-2.5-2.5s1.129-2.5 2.5-2.5z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/NavigationAgent3D.svg b/editor/icons/NavigationAgent3D.svg index 947b2129c3..5a2d8b3489 100644 --- a/editor/icons/NavigationAgent3D.svg +++ b/editor/icons/NavigationAgent3D.svg @@ -1 +1 @@ -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m9 1c-1.371 0-2.308.429-2.939 1.074-.668.663-1.34 1.324-2.01 1.985-.046 1.741.757 4.327 2.365 4.843.178.317.384.649.584.977v5.121l2-2c2-3 4-6 4-8s-1-4-4-4z" fill="#fff" fill-opacity=".39"/><path d="m7 3c-3 0-4 2-4 4s2 5 4 8c2-3 4-6 4-8s-1-4-4-4zm0 2c1.097 0 2 .903 2 2s-.903 2-2 2-2-.903-2-2 .903-2 2-2z" fill="#e0e0e0"/></g></svg> +<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m8 1.0859375c-.8454344.1560829-1.4755929.5141293-1.9394531.9882813-.668.663-1.3397656 1.323375-2.0097657 1.984375-.046 1.7409999.7572344 4.32775 2.3652344 4.84375.178.317.3839844.6485624.5839844.9765624v5.1210938l1-1z" fill="#e0e0e0" fill-opacity=".501961"/><path d="m7 3c-3 0-4 2-4 4s2 5 4 8c.3378629-.506794.671779-1.011698 1-1.513672v-4.7597655c-.2952789.1727801-.6361816.2734375-1 .2734375-1.097 0-2-.903-2-2s.903-2 2-2c.3638184 0 .7047211.1006574 1 .2734375v-2.1894531c-.3055959-.054762-.6378835-.0839844-1-.0839844z" fill="#e0e0e0"/><g fill="#fc7f7f"><path d="m9 1c-.3631515 0-.6953702.0296972-1 .0859375v12.9140625l1-1c2-3 4-6 4-8s-1-4-4-4z" fill-opacity=".501961"/><path d="m8 3.0839844v2.1894531c.5950581.3481936 1 .9933809 1 1.7265625s-.4049419 1.3783689-1 1.7265625v4.7597655c1.6147033-2.469489 3-4.8241909 3-6.486328 0-1.758589-.773848-3.5170952-3-3.9160156z"/></g></g></svg> diff --git a/editor/icons/NavigationObstacle2D.svg b/editor/icons/NavigationObstacle2D.svg index 8fcb5617dd..a5073898f4 100644 --- a/editor/icons/NavigationObstacle2D.svg +++ b/editor/icons/NavigationObstacle2D.svg @@ -1 +1 @@ -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 .875c-.625 0-1.25.375-1.5 1.125l-3 10h9l-3-10c-.25-.75-.875-1.125-1.5-1.125zm-1.5 4.125h3l1 4h-5zm-4.5 8c-1 0-1 2 0 2h12c1 0 1-2 0-2z" fill="#e0e0e0" fill-rule="nonzero"/></svg> +<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 .875c-.625 0-1.25.375-1.5 1.125l-3 10h4.5v-3h-2.5l1-4h1.5zm-6 12.125c-1 0-1 2 0 2h6v-2z" fill="#e0e0e0"/><path d="m8 .875v4.125h1.5l1 4h-2.5v3h4.5l-3-10c-.25-.75-.875-1.125-1.5-1.125zm0 12.125v2h6c1 0 1-2 0-2z" fill="#8da5f3" fill-opacity=".988235"/></svg> diff --git a/editor/icons/NavigationObstacle3D.svg b/editor/icons/NavigationObstacle3D.svg index c5e58eebf7..d8ccd3a646 100644 --- a/editor/icons/NavigationObstacle3D.svg +++ b/editor/icons/NavigationObstacle3D.svg @@ -1 +1 @@ -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m4.607 8.379c-1.798.928-3.607 2.072-3.607 2.621 0 1 6 4 7 4s7-3 7-4c0-.549-1.809-1.693-3.607-2.621l.607 1.621c2 4-10 4-8 0z" fill="#fff" fill-opacity=".39"/><path d="m8 .875c-.375 0-.75.375-1 1.125l-3 8c-2 4 10 4 8 0l-3-8c-.25-.75-.625-1.125-1-1.125zm-1.5 4.125c1 .5 2 .5 3 0l1 3.5c-1.5 1-3.5 1-5 0z" fill="#e0e0e0"/></g></svg> +<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero"><path d="m4.6074219 8.3789062c-1.798.9280001-3.6074219 2.0720938-3.6074219 2.6210938 0 1 6 4 7 4v-2c-2.5 0-5-1-4-3z" fill="#e0e0e0" fill-opacity=".501961"/><path d="m8 .875c-.375 0-.75.375-1 1.125l-3 8c-1 2 1.5 3 4 3v-3.75c-.875 0-1.75-.25-2.5-.75l1-3.5c.5.25 1 .375 1.5.375z" fill="#e0e0e0"/><g fill="#fc7f7f"><path d="m11.392578 8.3789062.607422 1.6210938c1.002342 2.004685-1.511742 3.004696-4.0175781 3v1.998047c.0053893.000157.0124503.001953.0175781.001953 1 0 7-3 7-4 0-.549-1.809422-1.6930938-3.607422-2.6210938z" fill-opacity=".501961"/><path d="m8 .875c-.00585 0-.011729.001771-.017578.001953v4.498047c.5058535.0029611 1.0117243-.1220732 1.517578-.375l1 3.5c-.7550159.5033439-1.6367318.7533663-2.5175781.75v3.75c2.5058361.004696 5.0199201-.995315 4.0175781-3l-3-8c-.25-.75-.625-1.125-1-1.125z"/></g></g></svg> diff --git a/editor/icons/SkeletonIK3D.svg b/editor/icons/SkeletonIK3D.svg index 45697a1b42..7210019749 100644 --- a/editor/icons/SkeletonIK3D.svg +++ b/editor/icons/SkeletonIK3D.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.4531v3.5469a2 2 0 0 0 1 1.7324 2 2 0 0 0 1 .26562v.001953h4v-.001953a2 2 0 0 0 1-.26562 2 2 0 0 0 1-1.7324v-3.5469a4 4 0 0 0 2-3.4531 4 4 0 0 0 -4-4zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm6 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1zm-4 2h2v1h-2zm-2 2h1v1h1v-1h1 1v1h1v-1h1v.86719 3.1328h-1v-1h-1v1h-1-1v-1h-1v1h-1v-3.1309-.86914z" fill="#e0e0e0"/></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 2a4 4 0 0 0 -4 4 4 4 0 0 0 2 3.453125v3.546875a2 2 0 0 0 1 1.732422 2 2 0 0 0 1 .265625v.001953h2v-2h-1v-1h-1v1h-1v-3.1308594-.8691406h1v1h1v-1h1v-1h-1v-1h1v-5zm-1 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/><path d="m8 2v5h1v1h-1v1h1v1h1v-1h1v.8671875 3.1328125h-1v-1h-1v1h-1v2h2v-.001953a2 2 0 0 0 1-.265625 2 2 0 0 0 1-1.732422v-3.546875a4 4 0 0 0 2-3.453125 4 4 0 0 0 -4-4zm3 3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#fc7f7f"/></svg> diff --git a/editor/icons/VideoPlayer.svg b/editor/icons/VideoStreamPlayer.svg index 092a26b955..092a26b955 100644 --- a/editor/icons/VideoPlayer.svg +++ b/editor/icons/VideoStreamPlayer.svg diff --git a/editor/plugins/animation_library_editor.cpp b/editor/plugins/animation_library_editor.cpp index ed908e413c..cae33edecb 100644 --- a/editor/plugins/animation_library_editor.cpp +++ b/editor/plugins/animation_library_editor.cpp @@ -419,12 +419,12 @@ void AnimationLibraryEditor::_item_renamed() { } } -void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int p_button) { +void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int p_id, MouseButton p_button) { if (p_item->get_parent() == tree->get_root()) { // Library StringName lib_name = p_item->get_metadata(0); Ref<AnimationLibrary> al = player->call("get_animation_library", lib_name); - switch (p_button) { + switch (p_id) { case LIB_BUTTON_ADD: { add_library_dialog->set_title(TTR("Animation Name:")); add_library_name->set_text(""); @@ -519,7 +519,7 @@ void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int Ref<AnimationLibrary> al = player->call("get_animation_library", lib_name); Ref<Animation> anim = al->get_animation(anim_name); ERR_FAIL_COND(!anim.is_valid()); - switch (p_button) { + switch (p_id) { case ANIM_BUTTON_COPY: { if (anim->get_name() == "") { anim->set_name(anim_name); // Keep the name around diff --git a/editor/plugins/animation_library_editor.h b/editor/plugins/animation_library_editor.h index 5bd4e8d9e2..bf89508321 100644 --- a/editor/plugins/animation_library_editor.h +++ b/editor/plugins/animation_library_editor.h @@ -99,7 +99,7 @@ class AnimationLibraryEditor : public AcceptDialog { void _load_file(String p_path); void _item_renamed(); - void _button_pressed(TreeItem *p_item, int p_column, int p_button); + void _button_pressed(TreeItem *p_item, int p_column, int p_id, MouseButton p_button); void _file_popup_selected(int p_id); diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index d85087b5ea..d1f858315c 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -350,8 +350,8 @@ struct MeshInstance3DEditorEdgeSort { Vector2 b; static uint32_t hash(const MeshInstance3DEditorEdgeSort &p_edge) { - uint32_t h = hash_djb2_one_32(HashMapHasherDefault::hash(p_edge.a)); - return hash_djb2_one_32(HashMapHasherDefault::hash(p_edge.b), h); + uint32_t h = hash_murmur3_one_32(HashMapHasherDefault::hash(p_edge.a)); + return hash_fmix32(hash_murmur3_one_32(HashMapHasherDefault::hash(p_edge.b), h)); } bool operator==(const MeshInstance3DEditorEdgeSort &p_b) const { diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 9f4842a5a1..815d0a2425 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -2412,6 +2412,18 @@ void Node3DEditorViewport::_project_settings_changed() { const float mesh_lod_threshold = GLOBAL_GET("rendering/mesh_lod/lod_change/threshold_pixels"); viewport->set_mesh_lod_threshold(mesh_lod_threshold); + + const Viewport::Scaling3DMode scaling_3d_mode = Viewport::Scaling3DMode(int(GLOBAL_GET("rendering/scaling_3d/mode"))); + viewport->set_scaling_3d_mode(scaling_3d_mode); + + const float scaling_3d_scale = GLOBAL_GET("rendering/scaling_3d/scale"); + viewport->set_scaling_3d_scale(scaling_3d_scale); + + const float fsr_sharpness = GLOBAL_GET("rendering/scaling_3d/fsr_sharpness"); + viewport->set_fsr_sharpness(fsr_sharpness); + + const float fsr_mipmap_bias = GLOBAL_GET("rendering/scaling_3d/fsr_mipmap_bias"); + viewport->set_fsr_mipmap_bias(fsr_mipmap_bias); } void Node3DEditorViewport::_notification(int p_what) { diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index b9d99fcc93..6ab2366a44 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -3547,7 +3547,7 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb ShaderEditorPlugin *shader_editor = Object::cast_to<ShaderEditorPlugin>(EditorNode::get_singleton()->get_editor_data().get_editor("Shader")); shader_editor->edit(res.ptr()); shader_editor->make_visible(true); - shader_editor->get_shader_editor()->goto_line_selection(line_number - 1, begin, end); + shader_editor->get_shader_editor(res)->goto_line_selection(line_number - 1, begin, end); return; } else if (fpath.get_extension() == "tscn") { EditorNode::get_singleton()->load_scene(fpath); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index c13d0dc197..04b407ce65 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -38,8 +38,12 @@ #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/filesystem_dock.h" +#include "editor/plugins/visual_shader_editor_plugin.h" #include "editor/project_settings_editor.h" #include "editor/property_editor.h" +#include "editor/shader_create_dialog.h" +#include "scene/gui/split_container.h" #include "servers/display_server.h" #include "servers/rendering/shader_types.h" @@ -836,50 +840,216 @@ ShaderEditor::ShaderEditor() { _editor_settings_changed(); } +void ShaderEditorPlugin::_update_shader_list() { + shader_list->clear(); + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + String text; + String path = edited_shaders[i].shader->get_path(); + String _class = edited_shaders[i].shader->get_class(); + + if (path.is_resource_file()) { + text = path.get_file(); + } else if (edited_shaders[i].shader->get_name() != "") { + text = edited_shaders[i].shader->get_name(); + } else { + text = _class + ":" + itos(edited_shaders[i].shader->get_instance_id()); + } + + if (!shader_list->has_theme_icon(_class, SNAME("EditorIcons"))) { + _class = "Resource"; + } + Ref<Texture2D> icon = shader_list->get_theme_icon(_class, SNAME("EditorIcons")); + + shader_list->add_item(text, icon); + shader_list->set_item_tooltip(shader_list->get_item_count() - 1, path); + } + + if (shader_tabs->get_tab_count()) { + shader_list->select(shader_tabs->get_current_tab()); + } + + for (int i = 1; i < FILE_MAX; i++) { + file_menu->get_popup()->set_item_disabled(file_menu->get_popup()->get_item_index(i), edited_shaders.size() == 0); + } +} + void ShaderEditorPlugin::edit(Object *p_object) { Shader *s = Object::cast_to<Shader>(p_object); - shader_editor->edit(s); + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader.ptr() == s) { + // Exists, select. + shader_tabs->set_current_tab(i); + shader_list->select(i); + return; + } + } + // Add. + EditedShader es; + es.shader = Ref<Shader>(s); + Ref<VisualShader> vs = es.shader; + if (vs.is_valid()) { + es.visual_shader_editor = memnew(VisualShaderEditor); + es.visual_shader_editor->edit(vs.ptr()); + shader_tabs->add_child(es.visual_shader_editor); + } else { + es.shader_editor = memnew(ShaderEditor); + es.shader_editor->edit(s); + shader_tabs->add_child(es.shader_editor); + } + shader_tabs->set_current_tab(shader_tabs->get_tab_count() - 1); + edited_shaders.push_back(es); + _update_shader_list(); } bool ShaderEditorPlugin::handles(Object *p_object) const { - Shader *shader = Object::cast_to<Shader>(p_object); - return shader != nullptr && shader->is_text_shader(); + return Object::cast_to<Shader>(p_object) != nullptr; } void ShaderEditorPlugin::make_visible(bool p_visible) { if (p_visible) { - button->show(); - EditorNode::get_singleton()->make_bottom_panel_item_visible(shader_editor); - - } else { - button->hide(); - if (shader_editor->is_visible_in_tree()) { - EditorNode::get_singleton()->hide_bottom_panel(); - } - shader_editor->apply_shaders(); + EditorNode::get_singleton()->make_bottom_panel_item_visible(main_split); } } void ShaderEditorPlugin::selected_notify() { - shader_editor->ensure_select_current(); +} + +ShaderEditor *ShaderEditorPlugin::get_shader_editor(const Ref<Shader> &p_for_shader) { + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader == p_for_shader) { + return edited_shaders[i].shader_editor; + } + } + return nullptr; } void ShaderEditorPlugin::save_external_data() { - shader_editor->save_external_data(); + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader_editor) { + edited_shaders[i].shader_editor->save_external_data(); + } + } } void ShaderEditorPlugin::apply_changes() { - shader_editor->apply_shaders(); + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader_editor) { + edited_shaders[i].shader_editor->apply_shaders(); + } + } +} + +void ShaderEditorPlugin::_shader_selected(int p_index) { + shader_tabs->set_current_tab(p_index); +} + +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); + memdelete(c); + edited_shaders.remove_at(index); + _update_shader_list(); +} + +void ShaderEditorPlugin::_resource_saved(Object *obj) { + // May have been renamed on save. + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader.ptr() == obj) { + _update_shader_list(); + return; + } + } +} + +void ShaderEditorPlugin::_menu_item_pressed(int p_index) { + switch (p_index) { + case FILE_NEW: { + String base_path = FileSystemDock::get_singleton()->get_current_path(); + shader_create_dialog->config(base_path.plus_file("new_shader"), false, false, 0); + shader_create_dialog->popup_centered(); + } break; + case FILE_OPEN: { + InspectorDock::get_singleton()->open_resource("Shader"); + } break; + case FILE_SAVE: { + int index = shader_tabs->get_current_tab(); + ERR_FAIL_INDEX(index, shader_tabs->get_tab_count()); + EditorNode::get_singleton()->save_resource(edited_shaders[index].shader); + } break; + case FILE_SAVE_AS: { + int index = shader_tabs->get_current_tab(); + ERR_FAIL_INDEX(index, shader_tabs->get_tab_count()); + String path = edited_shaders[index].shader->get_path(); + if (!path.is_resource_file()) { + path = ""; + } + EditorNode::get_singleton()->save_resource_as(edited_shaders[index].shader, path); + } break; + case FILE_INSPECT: { + int index = shader_tabs->get_current_tab(); + ERR_FAIL_INDEX(index, shader_tabs->get_tab_count()); + EditorNode::get_singleton()->push_item(edited_shaders[index].shader.ptr()); + } break; + case FILE_CLOSE: { + _close_shader(shader_tabs->get_current_tab()); + } break; + } +} + +void ShaderEditorPlugin::_shader_created(Ref<Shader> p_shader) { + EditorNode::get_singleton()->push_item(p_shader.ptr()); } ShaderEditorPlugin::ShaderEditorPlugin() { - shader_editor = memnew(ShaderEditor); + main_split = memnew(HSplitContainer); + + VBoxContainer *vb = memnew(VBoxContainer); + + HBoxContainer *file_hb = memnew(HBoxContainer); + vb->add_child(file_hb); + file_menu = memnew(MenuButton); + file_menu->set_text(TTR("File")); + file_menu->get_popup()->add_item(TTR("New Shader"), FILE_NEW); + file_menu->get_popup()->add_separator(); + file_menu->get_popup()->add_item(TTR("Load Shader"), FILE_OPEN); + file_menu->get_popup()->add_item(TTR("Save Shader"), FILE_SAVE); + file_menu->get_popup()->add_item(TTR("Save Shader As"), FILE_SAVE_AS); + file_menu->get_popup()->add_separator(); + file_menu->get_popup()->add_item(TTR("Open Shader in Inspector"), FILE_INSPECT); + file_menu->get_popup()->add_separator(); + file_menu->get_popup()->add_item(TTR("Close Shader"), FILE_CLOSE); + file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditorPlugin::_menu_item_pressed)); + file_hb->add_child(file_menu); + + for (int i = 1; i < FILE_MAX; i++) { + file_menu->get_popup()->set_item_disabled(file_menu->get_popup()->get_item_index(i), true); + } + + shader_list = memnew(ItemList); + shader_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); + vb->add_child(shader_list); + shader_list->connect("item_selected", callable_mp(this, &ShaderEditorPlugin::_shader_selected)); + + main_split->add_child(vb); + vb->set_custom_minimum_size(Size2(200, 300) * EDSCALE); + + shader_tabs = memnew(TabContainer); + shader_tabs->set_tabs_visible(false); + shader_tabs->set_h_size_flags(Control::SIZE_EXPAND_FILL); + main_split->add_child(shader_tabs); + Ref<StyleBoxEmpty> empty; + empty.instantiate(); + shader_tabs->add_theme_style_override("panel", empty); + + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Shader Editor"), main_split); - shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Shader"), shader_editor); - button->hide(); + // Defer connect because Editor class is not in the binding system yet. + EditorNode::get_singleton()->call_deferred("connect", "resource_saved", callable_mp(this, &ShaderEditorPlugin::_resource_saved), varray(), CONNECT_DEFERRED); - _2d = false; + shader_create_dialog = memnew(ShaderCreateDialog); + vb->add_child(shader_create_dialog); + shader_create_dialog->connect("shader_created", callable_mp(this, &ShaderEditorPlugin::_shader_created)); } ShaderEditorPlugin::~ShaderEditorPlugin() { diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index bd0c2db824..e1e815f939 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -42,6 +42,11 @@ #include "scene/resources/shader.h" #include "servers/rendering/shader_warnings.h" +class ItemList; +class VisualShaderEditor; +class HSplitContainer; +class ShaderCreateDialog; + class ShaderTextEditor : public CodeTextEditor { GDCLASS(ShaderTextEditor, CodeTextEditor); @@ -160,9 +165,40 @@ public: class ShaderEditorPlugin : public EditorPlugin { GDCLASS(ShaderEditorPlugin, EditorPlugin); - bool _2d; - ShaderEditor *shader_editor = nullptr; + struct EditedShader { + Ref<Shader> shader; + ShaderEditor *shader_editor = nullptr; + VisualShaderEditor *visual_shader_editor = nullptr; + }; + + LocalVector<EditedShader> edited_shaders; + + enum { + FILE_NEW, + FILE_OPEN, + FILE_SAVE, + FILE_SAVE_AS, + FILE_INSPECT, + FILE_CLOSE, + FILE_MAX + }; + + HSplitContainer *main_split = nullptr; + ItemList *shader_list = nullptr; + TabContainer *shader_tabs = nullptr; + Button *button = nullptr; + MenuButton *file_menu = nullptr; + + ShaderCreateDialog *shader_create_dialog = nullptr; + + void _update_shader_list(); + void _shader_selected(int p_index); + void _menu_item_pressed(int p_index); + void _resource_saved(Object *obj); + void _close_shader(int p_index); + + void _shader_created(Ref<Shader> p_shader); public: virtual String get_name() const override { return "Shader"; } @@ -172,7 +208,7 @@ public: virtual void make_visible(bool p_visible) override; virtual void selected_notify() override; - ShaderEditor *get_shader_editor() const { return shader_editor; } + ShaderEditor *get_shader_editor(const Ref<Shader> &p_for_shader); virtual void save_external_data() override; virtual void apply_changes() override; diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 3491f8a468..8c72a886ea 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -5645,48 +5645,6 @@ VisualShaderEditor::VisualShaderEditor() { property_editor->connect("variant_changed", callable_mp(this, &VisualShaderEditor::_port_edited)); } -///////////////// - -void VisualShaderEditorPlugin::edit(Object *p_object) { - visual_shader_editor->edit(Object::cast_to<VisualShader>(p_object)); -} - -bool VisualShaderEditorPlugin::handles(Object *p_object) const { - return p_object->is_class("VisualShader"); -} - -void VisualShaderEditorPlugin::make_visible(bool p_visible) { - if (p_visible) { - //editor->hide_animation_player_editors(); - //editor->animation_panel_make_visible(true); - button->show(); - EditorNode::get_singleton()->make_bottom_panel_item_visible(visual_shader_editor); - visual_shader_editor->update_nodes(); - visual_shader_editor->set_process_input(true); - //visual_shader_editor->set_process(true); - } else { - if (visual_shader_editor->is_visible_in_tree()) { - EditorNode::get_singleton()->hide_bottom_panel(); - } - button->hide(); - visual_shader_editor->set_process_input(false); - //visual_shader_editor->set_process(false); - } -} - -VisualShaderEditorPlugin::VisualShaderEditorPlugin() { - visual_shader_editor = memnew(VisualShaderEditor); - visual_shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - - button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("VisualShader"), visual_shader_editor); - button->hide(); -} - -VisualShaderEditorPlugin::~VisualShaderEditorPlugin() { -} - -//////////////// - class VisualShaderNodePluginInputEditor : public OptionButton { GDCLASS(VisualShaderNodePluginInputEditor, OptionButton); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 1b56892ebf..b8da266ed7 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -493,23 +493,6 @@ public: VisualShaderEditor(); }; -class VisualShaderEditorPlugin : public EditorPlugin { - GDCLASS(VisualShaderEditorPlugin, EditorPlugin); - - VisualShaderEditor *visual_shader_editor = nullptr; - Button *button = nullptr; - -public: - virtual String get_name() const override { return "VisualShader"; } - bool has_main_screen() const override { return false; } - virtual void edit(Object *p_object) override; - virtual bool handles(Object *p_object) const override; - virtual void make_visible(bool p_visible) override; - - VisualShaderEditorPlugin(); - ~VisualShaderEditorPlugin(); -}; - class VisualShaderNodePluginDefault : public VisualShaderNodePlugin { GDCLASS(VisualShaderNodePluginDefault, VisualShaderNodePlugin); diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index 515d09c3fc..dfe40f9d4f 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -32,14 +32,16 @@ #include "modules/modules_enabled.gen.h" +const int ERROR_CODE = 77; + #ifdef MODULE_REGEX_ENABLED + #include "modules/regex/regex.h" #include "core/os/time.h" #include "core/templates/hash_map.h" #include "core/templates/list.h" -const int ERROR_CODE = 77; const int CONVERSION_MAX_FILE_SIZE = 1024 * 1024 * 4; // 4 MB static const char *enum_renames[][2] = { diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 5536e09da7..86fa9222c0 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -1353,8 +1353,9 @@ void SceneTreeDialog::_cancel() { void SceneTreeDialog::_select() { if (tree->get_selected()) { - emit_signal(SNAME("selected"), tree->get_selected()->get_path()); + // The signal may cause another dialog to be displayed, so be sure to hide this one first. hide(); + emit_signal(SNAME("selected"), tree->get_selected()->get_path()); } } diff --git a/editor/translations/af.po b/editor/translations/af.po index 748147b564..ae83779422 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -669,26 +669,24 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -#, fuzzy -msgid "Plugin Name" -msgstr "Nodus Naam:" +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 @@ -2853,7 +2851,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakket Suksesvol Geïnstalleer!" #: editor/editor_export.cpp @@ -4346,14 +4344,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4478,6 +4468,10 @@ 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 #, fuzzy msgid "Username" msgstr "Nodus Naam:" @@ -4506,6 +4500,10 @@ msgstr "" 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 "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index ac2efb5cec..a3fcece225 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -63,12 +63,13 @@ # Mr.k <mineshtine28546271@gmail.com>, 2022. # ywmaa <ywmaa.personal@gmail.com>, 2022. # Awab Najim <dev.djvan@gmail.com>, 2022. +# Abderrahim <abdoudido117@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-16 18:57+0000\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" "Last-Translator: Awab Najim <dev.djvan@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -78,7 +79,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.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -266,9 +267,8 @@ msgstr "بيانات" #: 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 "مل٠تعري٠الشبكة Network Profiler" +msgstr "الشبكة" #: core/io/file_access_network.cpp msgid "Remote FS" @@ -287,23 +287,20 @@ msgid "Blocking Mode Enabled" msgstr "تمكين وضع الØظر" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "وصل" +msgstr "إتصال" #: core/io/http_client.cpp msgid "Read Chunk Size" msgstr "Øجم قطعة القراءة" #: core/io/marshalls.cpp -#, fuzzy msgid "Object ID" -msgstr "كائنات مرسومة:" +msgstr "معر٠الكائن" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "تÙعيل تقشير البصل" +msgstr "Ø§Ù„Ø³Ù…Ø§Ø Ø¨ÙÙƒ ترميز الكائن" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" @@ -315,19 +312,16 @@ msgid "Network Peer" msgstr "مل٠تعري٠الشبكة Network Profiler" #: 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" @@ -358,9 +352,8 @@ msgid "Blocking Handshake" 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 @@ -423,14 +416,12 @@ msgid "Max Size (KB)" msgstr "الØجم الأقصى (كيلو بايت)" #: 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 @@ -695,6 +686,11 @@ msgid "Main Run Args" msgstr "معاملات المشهد الرئيس" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "المسار للمشهد:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "البØØ« ÙÙŠ امتدادات الملÙ" @@ -702,18 +698,15 @@ msgstr "البØØ« ÙÙŠ امتدادات الملÙ" msgid "Script Templates Search Path" msgstr "مسار البØØ« ÙÙŠ قوالب النص البرمجي" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "إدارة الإصدارات (Version Control)" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "التØميل التلقائي عند بدء التشغيل" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "اسم الإضاÙØ©" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "إدارة الإصدارات (Version Control)" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -807,9 +800,8 @@ msgstr "إنشاء متصادم تراميش قريب" #: 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 "Ù…ÙØرك الإخراج البصري:" +msgstr "استدعاء" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -819,18 +811,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 @@ -846,9 +837,8 @@ 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 @@ -856,14 +846,12 @@ msgid "Profiler" msgstr "Ù…Ùنشئ الملÙات التعريÙية Profiler" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "عمل دالة" +msgstr "أقصى عمل" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "تØديد التعبير" +msgstr "ضغط" #: core/project_settings.cpp #, fuzzy @@ -876,15 +864,15 @@ 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" -msgstr "" +msgstr "Øجم ناÙذة سجل" #: core/project_settings.cpp msgid "Zlib" @@ -896,20 +884,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 "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "الاتصالات لدالة:" +msgstr "Ù†ÙØ° وقت الإتصال" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -924,9 +911,8 @@ msgid "SSL" msgstr "" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "القمم:" +msgstr "الشهادات" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -935,9 +921,8 @@ msgid "Resource" msgstr "مورد" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "اغلاق المشهد" +msgstr "مشهد Ù…Øلي" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -947,22 +932,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" @@ -2829,8 +2812,8 @@ msgstr "نسخ مسار العÙقدة" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." -msgstr "تم تتبيث الØزمة بنجاØ!" +msgid "Completed successfully." +msgstr "اكتمل بنجاØ." #: editor/editor_export.cpp #, fuzzy @@ -4341,15 +4324,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "مشهد" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "المسار للمشهد:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4478,6 +4452,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "إدارة الإصدارات (Version Control)" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "إعادة التسمية" @@ -4506,6 +4484,10 @@ msgstr "تمكين/إيقا٠الوضع الخالي من الإلهاء." 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 "اذهب الي المشهد المÙØªÙˆØ Ù…Ø³Ø¨Ù‚Ø§." @@ -11265,7 +11247,7 @@ msgstr "القمم:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "FPS: %d (%s جزء من الثانية)" +msgstr "عدد الإطارات ÙÙŠ الثانية: %d (%s ميلي ثانية)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -19216,15 +19198,13 @@ msgid "Code Signing" msgstr "الإشاراة" #: platform/android/export/export_plugin.cpp -#, fuzzy 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'.\n" -"تأكد من Ùضلك إن كان الأمر موجوداً ÙÙŠ دليل ملÙات أدوات-بناء الأندرويد Android " -"SDK build-tools.\n" -"لم يتم توقيع الناتج %s." +"تعذر العثور على 'apksigner'. تأكد من Ùضلك إن كان الأمر موجوداً ÙÙŠ دليل ملÙات " +"أدوات-بناء Øزمة تطوير الأندرويد Android SDK build-tools. لم يتم توقيع الناتج " +"%s." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19239,9 +19219,8 @@ msgid "Could not find keystore, unable to export." msgstr "لا يمكن العثور على Ù…ÙØªØ§Ø Ø§Ù„Ù…ØªØ¬Ø±ØŒ لا يمكن التصدير." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "لا يمكن بدء عملية جانبية!" +msgstr "تعذر بدء تشغيل apksigner ." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19274,9 +19253,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "أسم المل٠غير صالØ! يتطلب مل٠اندرويد APK أمتداد *.apk لتعمل." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "صيغة تصدير غير مدعومة!\n" +msgstr "تنسيق تصدير غير مدعوم!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19287,15 +19265,12 @@ msgstr "" "أعد التØميل من قائمة \"المشروع\"." #: 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 غير متواÙقة:\n" -"\tقوالب Ù…Ùنصبة: %s\n" -"\tإصدار غودوت: %s\n" -"من Ùضلك أعد تنصيب قالب بناء الأندرويد Android من قائمة \"المشروع\"." +"نسخ بناء Android غير متواÙقة: قوالب Ù…Ùنصبة: %s إصدار غودوت: %s. من Ùضلك أعد " +"تنصيب قالب بناء الأندرويد من قائمة 'المشروع'." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19305,9 +19280,8 @@ msgstr "" "تعذرت كتابة overwrite ملÙات res://android/build/res/*.xml مع اسم المشروع" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "لم يتمكن من تصدير ملÙات المشروع إلى مشروع gradle\n" +msgstr "لم يتمكن من تصدير ملÙات المشروع إلى مشروع gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19318,13 +19292,12 @@ msgid "Building Android Project (gradle)" msgstr "بناء مشروع الأندرويد (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"أخÙÙ‚ بناء مشروع الأندرويد، تÙقد المÙخرجات للإطلاع على الخطأ.\n" -"بصورة بديلة يمكنك زيارة docs.godotengine.org لأجل مستندات البناء للأندرويد." +"أخÙÙ‚ بناء مشروع الأندرويد، تÙقد المÙخرجات للإطلاع على الخطأ. بصورة بديلة " +"يمكنك زيارة docs.godotengine.org لأجل مستندات البناء للأندرويد." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19347,22 +19320,18 @@ msgid "Creating APK..." msgstr "إنشاء المØيط..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"لم يتم إيجاد قالب APK للتصدير:\n" -"%s" +msgstr "لم يتم إيجاد قالب APK للتصدير: \"%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 "" -"هنالك مكاتب قوالب تصدير ناقصة بالنسبة للمعمارية المختارة: %s.\n" -"ابن قالب التصدير متضمناً جميع المكتبات الضرورية، أو أزال اختيار المعماريات " -"الناقصة من خيارات التصدير المعدّة مسبقاً." +"هنالك مكاتب قوالب تصدير ناقصة بالنسبة للمعمارية المختارة: %s.ابن قالب " +"التصدير متضمناً جميع المكتبات الضرورية، أو أزال اختيار المعماريات الناقصة من " +"خيارات التصدير المعدّة مسبقاً." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -20067,9 +20036,8 @@ msgid "Could not open icon file \"%s\"." msgstr "لم نتمكن من تصدير ملÙات المشروع" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "لا يمكن بدء عملية جانبية!" +msgstr "تعذر بدء تشغيل xcrun." #: platform/osx/export/export.cpp #, fuzzy @@ -20141,9 +20109,8 @@ msgid "DMG Creation" msgstr "الاتجاهات" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "لا يمكن بدء عملية جانبية!" +msgstr "تعذر بدء المل٠التنÙيذي hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20222,9 +20189,8 @@ msgid "ZIP Creation" msgstr "مشروع" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "لم يتمكن من تصدير ملÙات المشروع إلى مشروع gradle\n" +msgstr "تعذر ÙØªØ Ø§Ù„Ù…Ù„Ù Ù„Ù„Ù‚Ø±Ø§Ø¡Ø© من المسار \"%s\"." #: platform/osx/export/export.cpp #, fuzzy diff --git a/editor/translations/az.po b/editor/translations/az.po index 59e1c30354..6e8dfbf1f3 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -650,24 +650,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2805,7 +2804,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4222,14 +4221,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4346,6 +4337,10 @@ 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 "" @@ -4373,6 +4368,10 @@ msgstr "" 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 "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index ee4ccb7044..9370a48a79 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -689,6 +689,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Път на Ñцената:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -696,19 +701,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Контрол на верÑиите" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Контрол на верÑиите" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Име на приÑтавката:" +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 @@ -2807,7 +2808,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4261,15 +4262,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Сцена" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Път на Ñцената:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4396,6 +4388,10 @@ 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 "ПотребителÑко име" @@ -4423,6 +4419,10 @@ msgstr "" 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 "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index e656723205..265a7fb58a 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -688,6 +688,11 @@ msgid "Main Run Args" msgstr "পà§à¦°à¦§à¦¾à¦¨ দৃশà§à¦¯à§‡à¦° মান/আরà§à¦—à§à¦®à§‡à¦¨à§à¦Ÿ-সমূহ:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "দৃশà§à¦¯à§‡à¦° পথ:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -695,20 +700,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "সংসà§à¦•à¦°à¦£:" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "পà§à¦²à¦¾à¦—ইন-সমূহ" +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 @@ -2899,7 +2899,7 @@ msgstr "পথ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿/কপি করà§à¦¨" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "পà§à¦¯à¦¾à¦•à§‡à¦œ ইনà§à¦¸à¦Ÿà¦² সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" #: editor/editor_export.cpp @@ -4496,15 +4496,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "দৃশà§à¦¯" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "দৃশà§à¦¯à§‡à¦° পথ:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4635,6 +4626,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "সংসà§à¦•à¦°à¦£:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•à¦°à¦£ করà§à¦¨" @@ -4664,6 +4660,10 @@ msgstr "বিকà§à¦·à§‡à¦ª-হীন মোড" 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 "পূরà§à¦¬à§‡ খোলা দৃশà§à¦¯à§‡ যান।" diff --git a/editor/translations/br.po b/editor/translations/br.po index f528b0af67..3d1ca48f3f 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -638,24 +638,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2727,7 +2726,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4139,14 +4138,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4262,6 +4253,10 @@ 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 "" @@ -4289,6 +4284,10 @@ msgstr "" 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 "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 1cba26c8ac..380a247ac7 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -16,13 +16,14 @@ # Roberto Pérez <djleizar@gmail.com>, 2021. # Joel Garcia Cascalló <jocsencat@gmail.com>, 2021. # DFC <damiafluixacanals28@gmail.com>, 2021. +# Roger VC <rogervilarasau@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-03 13:13+0000\n" -"Last-Translator: roger <616steam@gmail.com>\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"Last-Translator: Roger VC <rogervilarasau@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" "Language: ca\n" @@ -30,11 +31,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Controlador de tauleta" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -46,20 +47,19 @@ msgstr "Escena Actual" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Codi de sortida" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "V-Sync Activat" +msgstr "Sincronització Vertical habilitada" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync mitjançant Compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Suavitzat delta" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -91,13 +91,12 @@ msgid "Window" msgstr "Finestra" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Borderless" msgstr "Sense Vores" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Transparència per pÃxel activada" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -105,7 +104,7 @@ msgstr "Pantalla Completa" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Maximitzat" #: core/bind/core_bind.cpp msgid "Minimized" @@ -114,7 +113,7 @@ msgstr "Minimitzat" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Redimensionable" #: 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 @@ -146,7 +145,7 @@ msgstr "Suggeriment de l'Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Imprimeix missatges d'error" #: core/bind/core_bind.cpp msgid "Iterations Per Second" @@ -184,7 +183,7 @@ msgstr "Resultat" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Memòria" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -195,7 +194,7 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "LÃmits" #: core/command_queue_mt.cpp msgid "Command Queue" @@ -203,7 +202,7 @@ msgstr "Cua de Comandes" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Mida de la cua de multiprocés (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -215,7 +214,7 @@ msgstr "Funció" #: 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 "Dades" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp @@ -226,9 +225,8 @@ msgid "Network" msgstr "Xarxa" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Remot " +msgstr "FS remot" #: core/io/file_access_network.cpp msgid "Page Size" @@ -240,7 +238,7 @@ msgstr "" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Mode de bloqueig activat" #: core/io/http_client.cpp msgid "Connection" @@ -261,7 +259,7 @@ msgstr "Activa l'Efecte Paper Ceba" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "Rebutja les noves connexions de xarxa" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp #, fuzzy @@ -287,11 +285,11 @@ msgstr "" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "Mida mà xima del buffer d'entrada" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "Mida mà xima del buffer de sortida" #: core/io/packet_peer.cpp msgid "Stream Peer" @@ -303,16 +301,15 @@ msgstr "" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "Matriu de dades" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" msgstr "" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Editar Connexió:" +msgstr "Mà xim de connexions pendents" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -361,7 +358,7 @@ msgstr "En la crida a '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "Llavor" #: core/math/random_number_generator.cpp msgid "State" @@ -369,11 +366,11 @@ msgstr "Estat" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Cua de missatges" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "Mida mà xima (KB)" #: core/os/input.cpp #, fuzzy @@ -397,7 +394,7 @@ msgstr "Tot" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp msgid "Control" @@ -405,7 +402,7 @@ msgstr "Control" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Meta" #: core/os/input_event.cpp #, fuzzy @@ -425,11 +422,11 @@ msgstr "Explora" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "Codi d'escaneig fÃsic" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -449,13 +446,12 @@ msgid "Factor" msgstr "Factor" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Ãndex del Botó del ratolÃ:" +msgstr "Ãndex de botons" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "Doble clic" #: core/os/input_event.cpp msgid "Tilt" @@ -531,9 +527,8 @@ msgid "Instrument" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "Nombre de controlador" +msgstr "Número de controlador" #: core/os/input_event.cpp msgid "Controller Value" @@ -550,9 +545,8 @@ msgid "Config" msgstr "Configuració" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Configuració del Projecte..." +msgstr "Anul·lació de la configuració del projecte" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -662,9 +656,12 @@ msgid "Editor" msgstr "Editor" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Arguments de l'Escena Principal:" +msgstr "Arguments d'execució principal" + +#: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Nomenclatura de l'escena" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -674,18 +671,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Control de Versions" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Sistema de control de versions" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nom del Connector" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Control de Versions" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -884,9 +878,8 @@ msgid "TCP" msgstr "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Connexions al mètode:" +msgstr "Segons de temps d'espera de connexió" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -1171,9 +1164,8 @@ msgstr "Localització" #: 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 "Pas de la Rotació:" +msgstr "Rotació" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1181,9 +1173,8 @@ msgid "Value" msgstr "Valor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Quantitat:" +msgstr "Quantitat d'arguments" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1215,14 +1206,12 @@ msgid "Stream" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "òfset de la quadrÃcula:" +msgstr "Desplaçament d'inici" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "òfset:" +msgstr "Desplaçament final" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1346,14 +1335,12 @@ msgid "Remove this track." msgstr "Treu la Pista." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Temps (s): " +msgstr "Temps (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Posició" +msgstr "Posició:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1375,9 +1362,8 @@ msgid "Type:" msgstr "Tipus:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Plantilla d'exportació no và lida:" +msgstr "(No và lid, tipus esperat: %s)" #: editor/animation_track_editor.cpp #, fuzzy @@ -1630,9 +1616,8 @@ msgid "Add Method Track Key" msgstr "Afegir Clau de Pista de Mètode" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "No s'ha trobat el mètode en l'objecte: " +msgstr "Mètode no trobat a l'objecte:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2450,17 +2435,15 @@ msgid "%s (already exists)" msgstr "%s (ja existeix)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" msgstr "" -"El contingut del(s) fitxer(s) d'asset \"%s\" - %d entra en conflicte amb el " -"vostre project:" +"El contingut del recurs \"%s\" - %d fitxer(s) entra en conflicte amb el " +"vostre projecte:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Contents of asset \"%s\" - No files conflict with your project:" msgstr "" -"Continguts de l'asset \"%s\" - Cap fitxer entra en conflicte amb el vostre " +"Contingut del recurs \"%s\": no hi ha cap fitxer en conflicte amb el vostre " "projecte:" #: editor/editor_asset_installer.cpp @@ -2477,9 +2460,8 @@ msgid "(and %s more files)" msgstr "(i %s fitxer(s) més)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "El asset \"%s\" s'ha instal·lat exitosament!" +msgstr "El recurs \"%s\" s'ha instal·lat correctament!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2613,9 +2595,8 @@ msgid "There is no '%s' file." msgstr "No hi ha cap fitxer '%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Desar Disseny" +msgstr "Disseny:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2738,9 +2719,8 @@ msgid "%s is an invalid path. File does not exist." msgstr "%s es un camà no và lid. El fitxer no existeix." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "%s es un camà no và lid. No està en el camà del recurs (res://)." +msgstr "%s no és un camà và lid. No a la ruta del recurs (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -2823,19 +2803,17 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Copia el Camà del Node" +msgstr "Completat amb errors." #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." -msgstr "Paquet instal·lat amb èxit!" +msgid "Completed successfully." +msgstr "Completat amb èxit." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Ha fallat:" +msgstr "Fallit:" #: editor/editor_export.cpp msgid "Storing File:" @@ -2860,14 +2838,12 @@ msgid "Cannot create file \"%s\"." msgstr "No s'ha pogut crear el directori." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "No s'ha pogut escriure el fitxer" +msgstr "No s'han pogut exportar els fitxers del projecte." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "No s'ha pogut escriure en el fitxer:" +msgstr "No es pot obrir el fitxer per llegir-lo des del camà \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -2949,9 +2925,8 @@ msgid "Release" msgstr "alliberat" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "Operador Color." +msgstr "Format binari" #: editor/editor_export.cpp msgid "64 Bits" @@ -3004,19 +2979,16 @@ msgid "Prepare Template" msgstr "Administrar Plantilles" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." msgstr "El camà d'exportació donat no existeix:" #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "No s'ha trobat la Plantilla:" +msgstr "No s'ha trobat el fitxer de plantilla: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Plantilla d'exportació no và lida:" +msgstr "No s'ha pogut copiar la plantilla d'exportació." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -3071,9 +3043,8 @@ msgid "Allows to edit scripts using the integrated script editor." msgstr "Permet editar scripts utilitzant l'editor de scripts integrat." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Provides built-in access to the Asset Library." -msgstr "Proveeix accés integrat a la Llibreria de Assets." +msgstr "Proporciona accés integrat a la Biblioteca de Recursos." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." @@ -3319,14 +3290,12 @@ msgid "Save a File" msgstr "Desa un Fitxer" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "Èxit!" +msgstr "Accés" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "Mode de Reproducció:" +msgstr "Mode de visualització" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3344,19 +3313,16 @@ msgid "Mode" msgstr "Mode d'Escombratge lateral" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "Actual:" +msgstr "Directori actual" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "Perfil Actual:" +msgstr "Fitxer actual" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "Actual:" +msgstr "Camà actual" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp @@ -3687,9 +3653,8 @@ msgid "Checked" msgstr "Element validat" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "Crides de Dibuix:" +msgstr "Dibuixa en vermell" #: editor/editor_inspector.cpp #, fuzzy @@ -4078,10 +4043,9 @@ msgid "Save changes to '%s' before closing?" msgstr "Desar els canvis a '%s' abans de tancar?" #: editor/editor_node.cpp -#, fuzzy msgid "%s no longer exists! Please specify a new save location." msgstr "" -"%s ja no existeix! Si us plau especifiqueu una nova localització de guardat." +"%s ja no existeix! Si us plau especifiqueu una nova ubicació per desar." #: editor/editor_node.cpp msgid "" @@ -4382,15 +4346,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Escena" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Camà de l'Escena:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4479,9 +4434,8 @@ msgid "Inspector" msgstr "Inspector" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Camà del Projecte:" +msgstr "Estil de nom de propietat per defecte" #: editor/editor_node.cpp msgid "Default Float Step" @@ -4519,6 +4473,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control de Versions" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Reanomena" @@ -4547,6 +4505,10 @@ msgstr "Commutar el Mode Lliure de Distraccions." msgid "Add a new scene." msgstr "Afegeix una escena nova." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Escena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Vés a l'escena oberta anteriorment." @@ -4903,9 +4865,8 @@ msgid "Update All Changes" msgstr "Actualitzar quan es canvia" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Changes" -msgstr "Canvis de Material:" +msgstr "Actualitza els canvis vitals" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -5241,9 +5202,8 @@ msgid "Size:" msgstr "Mida:" #: 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 @@ -5330,9 +5290,8 @@ msgid "Extend Script" msgstr "Estendre l'script" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Nom de l'script:" +msgstr "Propietari de l'script" #: editor/editor_run_native.cpp #, fuzzy @@ -5510,14 +5469,12 @@ msgid "Directories" msgstr "Direccions" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Camà del Projecte:" +msgstr "Escaneja automà ticament la ruta del projecte" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Camà del Projecte:" +msgstr "Camà del projecte per defecte" #: editor/editor_settings.cpp #, fuzzy @@ -5539,9 +5496,8 @@ msgid "File Dialog" msgstr "Dià leg XForm" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Miniatura..." +msgstr "Mida de la miniatura" #: editor/editor_settings.cpp msgid "Docks" @@ -5623,14 +5579,12 @@ msgid "Convert Indent On Save" msgstr "Converteix la Sagnia en Espais" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "Crides de Dibuix:" +msgstr "Dibuixa pestanyes" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "Crides de Dibuix:" +msgstr "Dibuixa espais" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5666,9 +5620,8 @@ msgid "Appearance" msgstr "" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "LÃnia:" +msgstr "Mostra els números de lÃnia" #: editor/editor_settings.cpp #, fuzzy @@ -5814,9 +5767,8 @@ msgid "Add Type Hints" msgstr "Tipus" #: editor/editor_settings.cpp -#, fuzzy msgid "Use Single Quotes" -msgstr "Utilitzar Cometes Simples" +msgstr "Utilitza cometes simples" #: editor/editor_settings.cpp #, fuzzy @@ -5840,9 +5792,8 @@ msgid "Grid Map" msgstr "Mapa de Graella" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "Trieu la distà ncia:" +msgstr "Trieu la distà ncia" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -5895,14 +5846,12 @@ msgid "Shape" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Pas de la QuadrÃcula:" +msgstr "Passos de la quadrÃcula primà ria" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Pas de la QuadrÃcula:" +msgstr "Mida de la quadrÃcula" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6087,7 +6036,7 @@ msgstr "Elimina Elements de Classe" #: editor/editor_settings.cpp #, fuzzy msgid "Bone Selected Color" -msgstr "Perfil Actual:" +msgstr "Color seleccionat de l'os" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -6098,9 +6047,8 @@ msgid "Bone Outline Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Mida del Contorn:" +msgstr "Mida del contorn de l'os" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -6194,9 +6142,8 @@ msgid "Auto Save" msgstr "Auto Tall" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Desar l'escena abans de executar-la..." +msgstr "Desa abans d'executar-lo" #: editor/editor_settings.cpp #, fuzzy @@ -6205,9 +6152,8 @@ msgstr "Vista Frontal" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" -msgstr "Remot " +msgstr "Amfitrió remot" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp @@ -6241,9 +6187,8 @@ msgstr "Gestor del Projecte" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Reanomenant directori:" +msgstr "Ordre d'ordenació" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6275,16 +6220,14 @@ msgid "Comment Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Emmagatzemant Fitxer:" +msgstr "Color de la cadena" #: 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 "Color de fons no và lid." +msgstr "Color de fons" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6314,14 +6257,12 @@ msgid "Text Color" msgstr "Planta Següent" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "LÃnia:" +msgstr "Color del número de lÃnia" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "LÃnia:" +msgstr "Color del número de lÃnia segura" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6447,9 +6388,8 @@ msgid "%s Error" msgstr "Error" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open the folder containing these templates." -msgstr "Obrir la carpeta que conte aquestes plantilles." +msgstr "Obriu la carpeta que conté aquestes plantilles." #: editor/export_template_manager.cpp msgid "Uninstall these templates." @@ -6466,9 +6406,8 @@ msgid "Retrieving the mirror list..." msgstr "S'estan buscant rèpliques..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Starting the download..." -msgstr "Començant la descarrega..." +msgstr "S'està iniciant la baixada..." #: editor/export_template_manager.cpp msgid "Error requesting URL:" @@ -6497,18 +6436,16 @@ msgid "Request failed." msgstr "Ha fallat la sol·licitud." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request ended up in a redirect loop." -msgstr "La sol·licitud a acabat en un bucle de redirecció." +msgstr "La sol·licitud ha acabat en un bucle de redirecció." #: editor/export_template_manager.cpp msgid "Request failed:" msgstr "La Sol·licitud ha fallat:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download complete; extracting templates..." -msgstr "Descarrega completa; extraient plantilles..." +msgstr "S'ha completat la baixada; s'estan extraient les plantilles..." #: editor/export_template_manager.cpp #, fuzzy @@ -6535,7 +6472,6 @@ msgstr "" "informeu d'aquest problema!" #: editor/export_template_manager.cpp -#, fuzzy msgid "Best available mirror" msgstr "Millor mirall disponible" @@ -6661,9 +6597,8 @@ msgid "Uninstall" msgstr "Desinstal·lar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "Valor inicial per al comptador." +msgstr "Desinstal·la les plantilles de la versió actual." #: editor/export_template_manager.cpp msgid "Download from:" @@ -6703,9 +6638,8 @@ msgid "Install from File" msgstr "Instal·lar des d'un Fitxer" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "Instal·lar plantilles des d'un fitxer local." +msgstr "Instal·la plantilles des d'un fitxer local." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -7178,9 +7112,8 @@ msgstr "" #: 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 "Filtres:" +msgstr "Filtre" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7207,17 +7140,15 @@ msgstr "Auto Tall" #: 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 "Horitzontal:" +msgstr "Horitzontal" #: 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 "Vertical:" +msgstr "Vertical" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -7297,9 +7228,8 @@ msgid "Root Type" msgstr "Tipus de Membre" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "Remot " +msgstr "Nom de l'arrel" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7312,18 +7242,16 @@ msgid "Custom Script" msgstr "Talla els Nodes" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "Emmagatzemant Fitxer:" +msgstr "Emmagatzematge" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" msgstr "" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "Canvis de Material:" +msgstr "Materials" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7400,14 +7328,12 @@ msgid "Enabled" msgstr "Activar" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "Error Lineal Max.:" +msgstr "Error lineal mà xim" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "Error Angular Max.:" +msgstr "Error angular mà xim" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7427,9 +7353,8 @@ msgstr "Talls d'Animació" #: 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 "Quantitat:" +msgstr "Quantitat" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7445,9 +7370,8 @@ msgid "Generating Lightmaps" msgstr "S'estan generant els Lightmaps" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "S'està generant per a la Malla: " +msgstr "S'està generant per malla:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7543,9 +7467,8 @@ msgid "Normal Map Invert Y" msgstr "Escala aleatòria:" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Size Limit" -msgstr "Mida: " +msgstr "LÃmit de mida" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" @@ -7563,14 +7486,12 @@ msgid "" msgstr "" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "Mida del Contorn:" +msgstr "Fitxer Atles" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "Mode d'Exportació:" +msgstr "Mode d'importació" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7582,9 +7503,8 @@ msgid "Trim Alpha Border From Region" msgstr "" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "Malla d'Origen:" +msgstr "Força" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" @@ -7705,9 +7625,8 @@ msgid "Failed to load resource." msgstr "No s'ha pogut carregar el recurs." #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "Nom del Projecte:" +msgstr "Estil del nom de la propietat" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" @@ -8059,9 +7978,8 @@ msgid "Blend:" msgstr "Mescla:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "Parà metre Canviat:" +msgstr "Parà metre canviat:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -8139,14 +8057,12 @@ msgstr "" "que no es poden recuperar els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Anim Clips" -msgstr "Talls d'Animació" +msgstr "Clips d'animació" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "Talls d'Àudio" +msgstr "Clips d'à udio" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Functions" @@ -8474,9 +8390,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Definiu l'animació final. Això és útil per a sub-transicions." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "Transició: " +msgstr "Transició:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -8743,9 +8658,8 @@ msgid "Download Error" msgstr "Error en la Baixada" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Available URLs" -msgstr "Perfils Disponibles:" +msgstr "URL disponibles" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8808,9 +8722,8 @@ msgid "All" msgstr "Tot" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Search templates, projects, and demos" -msgstr "Buscar plantilles, projectes i demos." +msgstr "Cerca plantilles, projectes i demostracions" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search assets (excluding templates, projects, and demos)" @@ -9858,9 +9771,8 @@ msgstr "" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Separació:" +msgstr "Separador" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -9951,9 +9863,8 @@ msgid "No mesh to debug." msgstr "Cap malla per depurar." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Mesh has no UV in layer %d." -msgstr "El model no té UVs en aquesta capa." +msgstr "La malla no té UV a la capa %d." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" @@ -10293,9 +10204,8 @@ msgid "Volume" msgstr "Volum" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Font d'Emissió: " +msgstr "Font d'emissió:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10709,9 +10619,8 @@ msgid "Room Generate Points" msgstr "Recompte de punts generats" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Recompte de punts generats" +msgstr "Generar punts" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -11028,9 +10937,8 @@ msgid "Script Temperature History Size" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "Color de fons no và lid." +msgstr "Color de fons de l'script actual" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -11043,9 +10951,8 @@ msgid "Sort Scripts By" msgstr "Crea un Script" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Nom de l'script:" +msgstr "Llista els noms dels scripts com a" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -11429,9 +11336,8 @@ msgstr "Translació" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "Escala: " +msgstr "Escalat:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp @@ -11461,27 +11367,22 @@ msgid "Yaw:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "Objectes Dibuixats:" +msgstr "Objectes dibuixats:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Canvis de Material:" +msgstr "Canvis del Material:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Canvis de Shader:" +msgstr "Canvis del Shader:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Canvis de superfÃcie:" +msgstr "Canvis de la superfÃcie:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" msgstr "Crides de Dibuix:" @@ -11996,19 +11897,16 @@ msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "Simplificació: " +msgstr "Simplificació:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "Redueix (PÃxels): " +msgstr "Redueix (PÃxels):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "Engrandeix (PÃxels): " +msgstr "Engrandeix (PÃxels):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -12266,9 +12164,8 @@ msgid "With Data" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "Selecciona un Node:" +msgstr "Seleccioneu per tipus de dades:" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items." @@ -12337,19 +12234,16 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "Col·lapsar tot." +msgstr "Col·lapsar els tipus." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "Expandir tot." +msgstr "Expandir els tipus." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Seleccioneu un Fitxer de Plantilla." +msgstr "Seleccioneu tots els elements del tema." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -12518,9 +12412,8 @@ msgid "Add Type:" msgstr "Tipus:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "Afegeix un Element:" +msgstr "Afegeix un element:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -12528,9 +12421,8 @@ msgid "Add StyleBox Item" msgstr "Afegeix tots els Elements" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Elimina Element:" +msgstr "Suprimeix els elements:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -12571,9 +12463,8 @@ msgid "Editor Theme" msgstr "Editar Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Elimina el Recurs:" +msgstr "Seleccioneu un altre recurs de tema:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -12600,9 +12491,8 @@ msgid "Available Node-based types:" msgstr "Perfils Disponibles:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "El nom del fitxer és buit." +msgstr "El nom del tipus és buit!" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -13051,9 +12941,8 @@ msgid "Priority" msgstr "Mode Prioritat" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/node_2d.cpp -#, fuzzy msgid "Z Index" -msgstr "Ãndex" +msgstr "Ãndex Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region Mode" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 1e589d1dc3..9c3aea1d27 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -718,6 +718,11 @@ msgid "Main Run Args" msgstr "Argumenty hlavnà scény:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Cesta ke scénÄ›:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -725,19 +730,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Správa verzÃ" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Verzovánà (VCS)" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Název pluginu:" +msgid "Version Control Plugin Name" +msgstr "Správa verzÃ" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2876,7 +2877,7 @@ msgstr "KopÃrovat cestu k uzlu" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "BalÃÄek byl úspěšnÄ› nainstalován!" #: editor/editor_export.cpp @@ -4398,15 +4399,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scéna" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Cesta ke scénÄ›:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4535,6 +4527,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Správa verzÃ" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "PÅ™ejmenovat" @@ -4563,6 +4559,10 @@ msgstr "Zapnout nerozptylujÃcà režim." msgid "Add a new scene." msgstr "PÅ™idat novou scénu." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scéna" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "PÅ™ejÃt na pÅ™edchozà scénu." diff --git a/editor/translations/da.po b/editor/translations/da.po index fb07e70ead..a90d207941 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -683,6 +683,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scene Sti:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -690,20 +695,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "Versionskontrol" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Node Navn:" +msgid "Version Control Plugin Name" +msgstr "Versionskontrol" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2890,7 +2890,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakke installeret med succes!" #: editor/editor_export.cpp @@ -4449,15 +4449,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scene" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scene Sti:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4586,6 +4577,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "Versionskontrol" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "Omdøb" @@ -4613,6 +4609,10 @@ msgstr "Skift distraktions-fri modus." msgid "Add a new scene." msgstr "Tilføj en ny scene." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scene" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "GÃ¥ til den forrige Ã¥bnede scene." diff --git a/editor/translations/de.po b/editor/translations/de.po index 63031da9ea..795dbd5328 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -706,6 +706,10 @@ msgid "Main Run Args" msgstr "Laufzeitargumente für Main" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Szenenbenennung" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "In Dateierweiterungen suchen" @@ -713,18 +717,15 @@ msgstr "In Dateierweiterungen suchen" msgid "Script Templates Search Path" msgstr "Suchpfad für Skriptvorlagen" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versionsverwaltung" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Autoladen beim Start" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Pluginname" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Versionsverwaltung" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2828,7 +2829,7 @@ msgstr "Dateipfade vervollständigen" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paket wurde erfolgreich installiert!" #: editor/editor_export.cpp @@ -4362,14 +4363,6 @@ msgstr "" "In Datei ‚%s‘ kann nicht geschrieben werden. Die Datei wird bereits " "verwendet, sie ist gesperrt, oder es ist keine Schreibberechtigung vorhanden." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Szene" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Szenenbenennung" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4484,6 +4477,10 @@ msgid "Default Color Picker Mode" msgstr "Standard Farbwahlmodus" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versionsverwaltung" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nutzername" @@ -4511,6 +4508,10 @@ msgstr "Ablenkungsfreien Modus umschalten." msgid "Add a new scene." msgstr "Eine neue Szene hinzufügen." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Szene" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Gehe zu vorher geöffneter Szene." diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index d3e83bf799..169d40ebd7 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -618,24 +618,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2680,7 +2679,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4086,14 +4085,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4208,6 +4199,10 @@ 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 "" @@ -4235,6 +4230,10 @@ msgstr "" 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 "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 10357edf88..a3f5e815e1 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -660,6 +660,10 @@ msgid "Main Run Args" msgstr "ΟÏίσματα κÏÏιας σκηνής" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Όνομα Σκηνής" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Αναζήτηση στις Επεκτάσεις ΑÏχείων" @@ -667,18 +671,15 @@ msgstr "Αναζήτηση στις Επεκτάσεις ΑÏχείων" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Έλεγχος Îκδοσης" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "ΣÏστημα ΕλÎγχου Έκδοσης" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Όνομα Î ÏοσθÎτου" +#, fuzzy +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 @@ -2835,7 +2836,7 @@ msgstr "ΑντιγÏαφή διαδÏομής κόμβου" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Το πακÎτο εγκαταστάθηκε επιτυχώς!" #: editor/editor_export.cpp @@ -4377,14 +4378,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Σκηνή" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Όνομα Σκηνής" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4502,6 +4495,10 @@ 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 "Ψευδώνυμο" @@ -4529,6 +4526,10 @@ msgstr "Εναλλαγή λειτουÏγίας χωÏίς πεÏÎ¹ÏƒÏ€Î±ÏƒÎ¼Î¿Ï 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 "ΕπιστÏοφή στην Ï€ÏοηγουμÎνως ανοιγμÎνη σκηνή." diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 0c77d2c65e..14388e1c66 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -630,24 +630,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2702,7 +2701,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4110,14 +4109,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4232,6 +4223,10 @@ 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 "" @@ -4259,6 +4254,10 @@ msgstr "" 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 "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 1cc476926f..46e8f898ce 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -691,6 +691,11 @@ msgid "Main Run Args" msgstr "Parametroj de ĉefa sceno:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scena dosierindiko:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -698,19 +703,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versikontrolo" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Versikontrolo" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Nomo de kromprogramon:" +msgid "Version Control Plugin Name" +msgstr "Versikontrolo" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2846,7 +2847,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakaĵo instalis sukcese!" #: editor/editor_export.cpp @@ -4375,15 +4376,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Sceno" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scena dosierindiko:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4512,6 +4504,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versikontrolo" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Renomi" @@ -4540,6 +4536,10 @@ msgstr "Baskuli sendistran reÄimon." msgid "Add a new scene." msgstr "Aldoni novan scenon." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Sceno" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Iri al antaÅe malfermitan scenon." diff --git a/editor/translations/es.po b/editor/translations/es.po index ca733436b7..d419b78e4b 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -84,8 +84,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-06-08 06:48+0000\n" -"Last-Translator: David MartÃnez <goddrinksjava@gmail.com>\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -93,7 +93,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.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -350,7 +350,7 @@ msgstr "Tamaño Máximo del Buffer de Salida" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "Stream Peer" +msgstr "Stream de Pares" #: core/io/stream_peer.cpp msgid "Big Endian" @@ -705,6 +705,10 @@ msgid "Main Run Args" msgstr "Argumentos de la Ejecución Principal" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Nombres de Escenas" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Buscar En Extensiones de Archivos" @@ -712,18 +716,15 @@ msgstr "Buscar En Extensiones de Archivos" msgid "Script Templates Search Path" msgstr "Ruta de Búsqueda de Plantillas de Scripts" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Control de Versiones" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Cargar automáticamente al inicio" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nombre del Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Control de Versiones" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -915,7 +916,7 @@ msgstr "Tiempo de Espera de Conexión en Segundos" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "Packet Peer Stream" +msgstr "Stream de Paquetes de Pares" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -1088,7 +1089,7 @@ msgstr "Ponderar Muestras" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "Voxel Cone Tracing" +msgstr "Trazado de Conos de Vóxeles" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1197,9 +1198,8 @@ msgid "Value" msgstr "Valor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Cuenta" +msgstr "Conteo de Argumentos" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1360,19 +1360,16 @@ msgid "Remove this track." msgstr "Eliminar esta pista." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Tiempo (s): " +msgstr "Tiempo (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Posición" +msgstr "Posición:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Rotación" +msgstr "Rotación:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1389,29 +1386,24 @@ msgid "Type:" msgstr "Tipo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Plantilla de exportación inválida:" +msgstr "(Inválido, tipo esperado: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "Entrada-Salida Suave" +msgstr "Relajación:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Establecer Manipulador" +msgstr "In-Handle:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Establecer Manipulador" +msgstr "Out-Handle:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Stream Peer" +msgstr "Stream:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1643,9 +1635,8 @@ msgid "Add Method Track Key" msgstr "Añadir Clave de Pista de Método" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Método no encontrado en el objeto: " +msgstr "Método no encontrado en el objeto:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2615,9 +2606,8 @@ msgid "There is no '%s' file." msgstr "No hay ningún archivo `%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Layout" +msgstr "Layout:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2823,19 +2813,17 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Completar Rutas de Archivos" +msgstr "Completado con errores." #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." -msgstr "¡Paquete instalado con éxito!" +msgid "Completed successfully." +msgstr "Completado con éxito." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Fallido:" +msgstr "Falló." #: editor/editor_export.cpp msgid "Storing File:" @@ -2861,14 +2849,12 @@ msgid "Cannot create file \"%s\"." msgstr "No se pudo crear la carpeta." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "No se pudieron exportar los archivos del proyecto" +msgstr "Fallo en la exportación de los archivos del proyecto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "No se puede abrir el archivo para escribir:" +msgstr "No se puede abrir el archivo a leer de la ruta \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -2999,19 +2985,16 @@ msgid "Prepare Template" msgstr "Administrar Plantillas" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "La ruta de exportación especificada no existe:" +msgstr "La ruta de exportación proporcionada no existe." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Archivo de plantilla no encontrado:" +msgstr "Archivo de plantilla no encontrado: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Plantilla de exportación inválida:" +msgstr "Fallo al copiar la plantilla de exportación." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -4354,14 +4337,6 @@ msgstr "" "No se puede escribir en el archivo '%s', archivo en uso, bloqueado o sin " "permisos." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Escena" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Nombres de Escenas" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4476,6 +4451,10 @@ msgid "Default Color Picker Mode" msgstr "Modo De Selección De Color Por Defecto" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control de Versiones" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nombre de usuario" @@ -4503,6 +4482,10 @@ msgstr "Act./Desact. modo sin distracciones." msgid "Add a new scene." msgstr "Añadir nueva escena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Escena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." @@ -5199,9 +5182,8 @@ msgid "Size:" msgstr "Tamaño:" #: 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 @@ -5613,7 +5595,7 @@ msgstr "Plegado de Código" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Ajuste de Palabras" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" @@ -5621,7 +5603,7 @@ msgstr "Mostrar GuÃas de Longitud de LÃnea" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Directriz de longitud de LÃnea de Columna Flexible" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" @@ -5722,9 +5704,8 @@ msgid "Complete File Paths" msgstr "Completar Rutas de Archivos" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "Añadir Tipo" +msgstr "Añadir Sugerencias de Tipo" #: editor/editor_settings.cpp msgid "Use Single Quotes" @@ -5843,9 +5824,8 @@ msgid "Default Z Far" msgstr "Z Lejana por Defecto" #: editor/editor_settings.cpp -#, fuzzy msgid "Lightmap Baking Number Of CPU Threads" -msgstr "Número de Hilos de la CPU para Baking de Mapa de Luz" +msgstr "Número de hilos de la CPU para el Lightmap Baking" #: editor/editor_settings.cpp msgid "Navigation Scheme" @@ -5968,9 +5948,8 @@ msgid "Bone Selected Color" msgstr "Selección del Color de los Huesos" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone IK Color" -msgstr "Color IK Hueso" +msgstr "Color del hueso IK" #: editor/editor_settings.cpp msgid "Bone Outline Color" @@ -7257,9 +7236,8 @@ msgid "Generating Lightmaps" msgstr "Generando Lightmaps" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "Generando para la Malla: " +msgstr "Generar para el Mesh:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -8281,9 +8259,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Asignar la animación de fin. Esto es útil para sub-transiciones." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "Transición: " +msgstr "Transición:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -10061,9 +10038,8 @@ msgid "Volume" msgstr "Volumen" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Fuente de Emisión: " +msgstr "Fuente de Emisión:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -11162,15 +11138,13 @@ msgstr "Mover" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "Escalado: " +msgstr "Escala:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" -msgstr "Trasladar: " +msgstr "Trasladar:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -11714,19 +11688,16 @@ msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "Simplificación: " +msgstr "Simplificación:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "Encoger (PÃxeles): " +msgstr "Reducción (PÃxeles):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "Crecer (Pixeles): " +msgstr "Crecimiento (PÃxeles):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -15908,9 +15879,8 @@ msgid "Attach Node Script" msgstr "Añadir Script de Nodo" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "Remoto " +msgstr "Remoto %s:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -16956,9 +16926,8 @@ msgid "Disabled GDNative Singleton" msgstr "GDNative Singleton desactivado" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "Bibliotecas: " +msgstr "LibrerÃas:" #: modules/gdnative/nativescript/nativescript.cpp msgid "Class Name" @@ -17849,9 +17818,8 @@ msgstr "" "trabajo de nodos. Prueba arreglando el nodo." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "El nodo devolvió una secuencia de salida incorrecta: " +msgstr "El nodo ha devuelto una secuencia de salida inválida:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" @@ -17860,9 +17828,8 @@ msgstr "" "problema!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Desbordamiento de pila en el nivel: " +msgstr "Desbordamiento de pila con profundidad de pila:" #: modules/visual_script/visual_script.cpp #, fuzzy @@ -18232,18 +18199,16 @@ msgid "for (elem) in (input):" msgstr "for (elem) in (input):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "El tipo de entrada no es iterable: " +msgstr "Tipo de entrada no iterable:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "El iterador ya no es correcto" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "El iterador ya no es correcto: " +msgstr "El iterador es inválido:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18405,14 +18370,12 @@ msgid "Operator" msgstr "Iterador" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ": Argumento incorrecto de tipo: " +msgstr "Argumento inválido de tipo:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": Argumentos incorrectos: " +msgstr "Argumentos inválidos:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18424,14 +18387,12 @@ msgid "Var Name" msgstr "Nombre" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet no encontrado en el script: " +msgstr "VariableGet no encontrada en el script:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet no encontrado en el script: " +msgstr "VariableSet no encontrada en el script:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -19101,15 +19062,13 @@ msgid "Code Signing" msgstr "Firma de código DMG" #: platform/android/export/export_plugin.cpp -#, fuzzy 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 "" -"No se ha encontrado 'apksigner'.\n" -"Por favor, compruebe que el comando está disponible en el directorio Android " -"SDK build-tools.\n" -"El resultado %s es sin firma." +"No se ha encontrado el 'apksigner'. Por favor, comprueba que el comando está " +"disponible en el directorio Android SDK build-tools. El resultado %s es sin " +"firma." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19124,9 +19083,8 @@ msgid "Could not find keystore, unable to export." msgstr "No se pudo encontrar la keystore, no se puedo exportar." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "¡No se pudo comenzar el subproceso!" +msgstr "No se ha podido iniciar el ejecutable apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19158,9 +19116,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "¡Nombre de archivo inválido! Android APK requiere la extensión *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "¡Formato de exportación no compatible!\n" +msgstr "¡Formato de exportación no compatible!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19172,29 +19129,24 @@ msgstr "" "'Proyecto'." #: 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 "" -"La versión de compilación de Android no coincide:\n" -" Plantilla instalada: %s\n" -" Versión de Godot: %s\n" -"Por favor, reinstala la plantilla de compilación de Android desde el menú " -"'Proyecto'." +"La versión de compilación de Android no coincide: Plantilla instalada: %s, " +"versión de Godot: %s. Reinstala la plantilla de compilación de Android desde " +"el menú \"Proyecto\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "No se puede sobrescribir los archivos res://android/build/res/*.xml con el " -"nombre del proyecto" +"mismo nombre del proyecto." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "No se pueden exportar los archivos del proyecto a un proyecto gradle\n" +msgstr "No se pueden exportar los archivos del proyecto a un proyecto gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19205,13 +19157,12 @@ msgid "Building Android Project (gradle)" msgstr "Construir Proyecto Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"La construcción del proyecto Android falló, comprueba la salida del error.\n" -"También puedes visitar docs.godotengine.org para consultar la documentación " +"La compilación del proyecto Android ha fallado, comprueba la salida del " +"error. También puedes visitar docs.godotengine.org para ver la documentación " "de compilación de Android." #: platform/android/export/export_plugin.cpp @@ -19227,41 +19178,35 @@ msgstr "" "directorio del proyecto de gradle para ver los resultados." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Paquete no encontrado:% s" +msgstr "Paquete no encontrado: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Creando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"No se pudo encontrar la plantilla APK para exportar:\n" -"%s" +msgstr "No se pudo encontrar la plantilla APK para exportar: \"%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 "" -"Faltan bibliotecas en la plantilla de exportación para las arquitecturas " -"seleccionadas: %s.\n" -"Por favor, construya una plantilla con todas las bibliotecas necesarias, o " -"desmarque las arquitecturas que faltan en el preajuste de exportación." +"Faltan librerÃas en la plantilla de exportación para las arquitecturas " +"seleccionadas: %s. Por favor, crea una plantilla con todas las librerÃas " +"necesarias, o desmarca las arquitecturas que faltan en el preset de " +"exportación." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Añadiendo archivos ..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "No se pudieron exportar los archivos del proyecto" +msgstr "No se han podido exportar los archivos del proyecto." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19533,19 +19478,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "Ejecutar HTML exportado en el navegador predeterminado del sistema." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "No se pudo abrir la plantilla para exportar:" +msgstr "No se pudo abrir la plantilla para la exportación: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Plantilla de exportación inválida:" +msgstr "Plantilla de exportación inválida: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "No se puede escribir en el archivo:" +msgstr "No se pudo escribir el archivo: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19553,9 +19495,8 @@ msgid "Icon Creation" msgstr "Asignar Margen" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "No se pudo leer el archivo:" +msgstr "No se pudo leer el archivo: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19635,19 +19576,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "No se pudo leer el shell HTML:" +msgstr "No se ha podido leer el HTML shell: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "No se pudo crear el directorio del servidor HTTP:" +msgstr "No se ha podido crear el directorio del servidor HTTP: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Error al iniciar el servidor HTTP:" +msgstr "Error al iniciar el servidor HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19938,19 +19876,16 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "No se pudieron exportar los archivos del proyecto" +msgstr "No se ha podido abrir el archivo de icono \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "¡No se pudo comenzar el subproceso!" +msgstr "No se ha podido iniciar el ejecutable xcrun." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Traducciones" +msgstr "La notarización ha fallado." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20013,9 +19948,8 @@ msgid "No identity found." msgstr "No se encontró identidad." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Error guardando el archivo: %s" +msgstr "No se puede firmar el archivo %s." #: platform/osx/export/export.cpp #, fuzzy @@ -20030,9 +19964,8 @@ msgid "DMG Creation" msgstr "Direcciones" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "¡No se pudo comenzar el subproceso!" +msgstr "No se ha podido iniciar el ejecutable hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20047,14 +19980,13 @@ msgid "Creating app bundle" msgstr "Crear paquete de aplicaciones" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "No se pudo encontrar la aplicación de plantilla para exportar:" +msgstr "" +"No se ha podido encontrar la plantilla de la aplicación a exportar: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Plantilla de exportación inválida:" +msgstr "Formato de exportación inválido." #: platform/osx/export/export.cpp msgid "" @@ -20119,9 +20051,8 @@ msgid "ZIP Creation" msgstr "Proyecto" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "No se pueden exportar los archivos del proyecto a un proyecto gradle\n" +msgstr "No se pudo abrir el archivo a leer de la ruta \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20477,9 +20408,8 @@ msgid "Debug Algorithm" msgstr "Depurador" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "No se puede eliminar el archivo temporal:" +msgstr "Fallo al renombrar el archivo temporal \"%s\"." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20567,9 +20497,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "No se pudo encontrar la keystore, no se puedo exportar." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Identificador inválido:" +msgstr "Tipo de identificador inválido." #: platform/windows/export/export.cpp #, fuzzy @@ -20593,9 +20522,8 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "No se puede eliminar el archivo temporal:" +msgstr "No se ha podido eliminar el archivo temporal \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -23894,9 +23822,8 @@ msgid "Cast Shadow" msgstr "Sombra Proyectada" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Extra Cull Margin" -msgstr "Argumentos extras de llamada:" +msgstr "Margen de Sacrificio Extra" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23987,9 +23914,8 @@ msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Inclinación al azar:" +msgstr "Retraso Aleatorio" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24474,9 +24400,8 @@ msgid "Right Disconnects" msgstr "Desconectar" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Scroll Offset" -msgstr "Desplazamiento de CuadrÃcula:" +msgstr "Desplazamiento de Scroll" #: scene/gui/graph_edit.cpp msgid "Snap Distance" @@ -26324,12 +26249,11 @@ msgstr "Fuente Principal" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Table H Separation" -msgstr "Separación:" +msgstr "Separación de Tabla H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table V Separation" -msgstr "Separación:" +msgstr "Separación de Tabla V" #: scene/resources/default_theme/default_theme.cpp msgid "Margin Left" @@ -26588,9 +26512,8 @@ msgid "Max Steps" msgstr "Paso" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "Fundido de entrada (s):" +msgstr "Fundido de Entrada" #: scene/resources/environment.cpp msgid "Fade Out" @@ -26732,9 +26655,8 @@ msgid "Color Correction" msgstr "Corrección del Color" #: scene/resources/font.cpp -#, fuzzy msgid "Ascent" -msgstr "Recientes:" +msgstr "Aumento" #: scene/resources/font.cpp #, fuzzy @@ -26747,9 +26669,8 @@ msgid "Raw Data" msgstr "Profundidad" #: scene/resources/gradient.cpp -#, fuzzy msgid "Offsets" -msgstr "Offset:" +msgstr "Desplazamientos" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -27067,9 +26988,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "Escalado: " +msgstr "Muestreo" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27677,9 +27597,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 "Plano:" +msgstr "Pan" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -28297,7 +28216,7 @@ msgstr "Ver Eliminación de Oclusión" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "Esferas Activas Máximas" #: servers/visual_server.cpp msgid "Max Active Polygons" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 2d5420e663..c79bf0828f 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -671,6 +671,11 @@ msgid "Main Run Args" msgstr "Argumentos de Escena Principal:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Ruta a la Escena:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Buscar En Extensiones de Archivos" @@ -678,18 +683,15 @@ msgstr "Buscar En Extensiones de Archivos" msgid "Script Templates Search Path" msgstr "Ruta de Búsqueda de Plantillas de Scripts" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Control de Versiones" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Sistema de Control de Versiones" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nombre del Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Control de Versiones" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2816,7 +2818,7 @@ msgstr "Copiar Ruta del Nodo" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "El Paquete se instaló exitosamente!" #: editor/editor_export.cpp @@ -4360,15 +4362,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Escena" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Ruta a la Escena:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4497,6 +4490,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control de Versiones" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nombre de usuario" @@ -4524,6 +4521,10 @@ msgstr "Act./Desact. modo sin distracciones." msgid "Add a new scene." msgstr "Agregar nueva escena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Escena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." diff --git a/editor/translations/et.po b/editor/translations/et.po index 05cf7b9e4d..ca2105aa20 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -669,6 +669,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Stseeni tee:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -676,19 +681,13 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "" - #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -#, fuzzy -msgid "Plugin Name" -msgstr "Pistikprogrammi nimi:" +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 @@ -2784,7 +2783,7 @@ msgid "Completed with errors." msgstr "Kopeeri sõlme tee" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4265,15 +4264,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Stseen" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Stseeni tee:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4399,6 +4389,10 @@ 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 #, fuzzy msgid "Username" msgstr "Nimeta ümber" @@ -4427,6 +4421,10 @@ msgstr "" msgid "Add a new scene." msgstr "Lisa uus stseen." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Stseen" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 1ea606fe3c..cfbf2945ff 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -639,6 +639,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Eszenaren bidea:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -646,18 +651,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Bertsio kontrola" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Bertsio kontrola" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Bertsio kontrola" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2749,7 +2751,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paketea ondo instalatu da!" #: editor/editor_export.cpp @@ -4186,15 +4188,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Eszenaren bidea:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4315,6 +4308,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Bertsio kontrola" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "" @@ -4342,6 +4339,10 @@ msgstr "" 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 "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 4c2b858131..43d79c6ede 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -701,6 +701,10 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -708,19 +712,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "مهار نسخه" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "مهار نسخه" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "اÙزونه‌ها" +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 @@ -2834,7 +2834,7 @@ msgstr "Ú©Ù¾ÛŒ کردن مسیر node" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "بسته با موÙقیت نصب شد!" #: editor/editor_export.cpp @@ -4295,14 +4295,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "صØنه" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4430,6 +4422,10 @@ 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 #, fuzzy msgid "Username" msgstr "تغییر نام" @@ -4458,6 +4454,10 @@ msgstr "" 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 "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index c921bfdb62..7c69731934 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -703,6 +703,11 @@ msgid "Main Run Args" msgstr "Pääkohtauksen argumentit:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Kohtauspolku:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -710,19 +715,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versionhallinta" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Versionhallintajärjestelmä" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Liitännäisen nimi:" +msgid "Version Control Plugin Name" +msgstr "Versionhallinta" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2858,7 +2859,7 @@ msgstr "Kopioi solmun polku" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paketti asennettu onnistuneesti!" #: editor/editor_export.cpp @@ -4390,15 +4391,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Kohtaus" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Kohtauspolku:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4527,6 +4519,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versionhallinta" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Käyttäjänimi" @@ -4554,6 +4550,10 @@ msgstr "Käytä häiriötöntä tilaa." msgid "Add a new scene." msgstr "Lisää uusi kohtaus." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Kohtaus" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Siirry aiemmin avattuun kohtaukseen." diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 88bb60f942..19cb3febb0 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -630,6 +630,10 @@ msgid "Main Run Args" msgstr "Pangunahing Args sa Pagtakbo" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Maghanap sa mga File Extension" @@ -637,18 +641,15 @@ msgstr "Maghanap sa mga File Extension" msgid "Script Templates Search Path" msgstr "Path ng mga Hahanaping Script Template" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Version Control" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Kusang i-load sa Simula" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Pangalan ng Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Version Control" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2705,7 +2706,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4122,14 +4123,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4247,6 +4240,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Version Control" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "" @@ -4274,6 +4271,10 @@ msgstr "" 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 "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 056d03af56..6b077ba5e4 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -734,6 +734,11 @@ msgid "Main Run Args" msgstr "Arguments de la scène principale :" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Chemin de la scène :" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -741,18 +746,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Contrôle de version" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Système de contrôle de version" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nom du Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Contrôle de version" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2883,7 +2885,7 @@ msgstr "Copier le chemin du nÅ“ud" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paquetage installé avec succès !" #: editor/editor_export.cpp @@ -4422,15 +4424,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scène" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Chemin de la scène :" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4558,6 +4551,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Contrôle de version" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nom d'utilisateur" @@ -4585,6 +4582,10 @@ msgstr "Basculer en mode sans distraction." msgid "Add a new scene." msgstr "Ajouter une nouvelle scène." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scène" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Aller à la scène ouverte précédemment." diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 7d8a3f9826..884214d851 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -636,24 +636,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2715,7 +2714,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4126,14 +4125,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4250,6 +4241,10 @@ 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 #, fuzzy msgid "Username" msgstr "Ainm nua:" @@ -4278,6 +4273,10 @@ msgstr "" 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 "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 991f3be41a..398746ea6a 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -686,6 +686,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Ruta da Escena:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -693,19 +698,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Control de Versións" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Control de Versións" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Nome do Plugin:" +msgid "Version Control Plugin Name" +msgstr "Control de Versións" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2845,7 +2846,7 @@ msgstr "Copiar Ruta do Nodo" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paquete instalado correctamente!" #: editor/editor_export.cpp @@ -4387,15 +4388,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Escena" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Ruta da Escena:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4521,6 +4513,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control de Versións" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Renomear" @@ -4549,6 +4545,10 @@ msgstr "Act./Desact. modo sen distraccións." msgid "Add a new scene." msgstr "Engadir unha nova escena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Escena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ir á escena aberta previamente." diff --git a/editor/translations/he.po b/editor/translations/he.po index 48fb256d23..78c74fd01b 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -675,6 +675,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "× ×ª×™×‘ ×¡×¦× ×•×ª:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -682,19 +687,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "בקרת גירס×ות" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "בקרת גירס×ות" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "×©× ×”×ž×¤×¨×§:" +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 @@ -2801,7 +2802,7 @@ msgstr "העתקת × ×ª×™×‘ המפרק" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "החבילה ×”×•×ª×§× ×” בהצלחה!" #: editor/editor_export.cpp @@ -4299,15 +4300,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "×¡×¦× ×”" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "× ×ª×™×‘ ×¡×¦× ×•×ª:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4435,6 +4427,10 @@ 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 #, fuzzy msgid "Username" msgstr "×©×™× ×•×™ ש×" @@ -4463,6 +4459,10 @@ msgstr "הפעל/בטל מצב ×œ×œ× ×”×¡×—×•×ª דעת." 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 "מעבר ×œ×¡×¦× ×” הקודמת." diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 0d90bddc82..2486887cac 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -658,6 +658,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "दृशà¥à¤¯ पथ:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -665,19 +670,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "पà¥à¤²à¤—इनà¥à¤¸" +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 @@ -2798,7 +2799,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "पैकेज सफलतापूरà¥à¤µà¤• सà¥à¤¥à¤¾à¤ªà¤¿à¤¤!" #: editor/editor_export.cpp @@ -4305,15 +4306,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "दृशà¥à¤¯" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "दृशà¥à¤¯ पथ:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4438,6 +4430,10 @@ 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 #, fuzzy msgid "Username" msgstr "नाम बदली" @@ -4466,6 +4462,10 @@ msgstr "वà¥à¤¯à¤¾à¤•à¥à¤²à¤¤à¤¾ मà¥à¤•à¥à¤¤ मोड टॉगल।" 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 "पहले खोले गठदृशà¥à¤¯ में जाà¤à¤‚।" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 1c7dca2872..c9a87722f5 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -654,26 +654,24 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -#, fuzzy -msgid "Plugin Name" -msgstr "Naziv ÄŒvora(node):" +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 @@ -2762,7 +2760,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paket uspjeÅ¡no instaliran!" #: editor/editor_export.cpp @@ -4192,14 +4190,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4320,6 +4310,10 @@ 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 #, fuzzy msgid "Username" msgstr "Preimenuj zvuÄnu sabirnicu" @@ -4348,6 +4342,10 @@ msgstr "" 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 "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index ac0a5d2667..5ee85051da 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -23,13 +23,14 @@ # balintmaci <balintmaci@gmail.com>, 2021. # Balázs Püspök-Kiss <pkblazsak@gmail.com>, 2021. # Mr.Catfood <sipos22@msn.com>, 2022. +# 6Leoo6 <leo.takacs@yahoo.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-03 02:51+0000\n" -"Last-Translator: Mr.Catfood <sipos22@msn.com>\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"Last-Translator: 6Leoo6 <leo.takacs@yahoo.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" @@ -37,7 +38,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.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -366,7 +367,7 @@ msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self nem használható, mert a példány null (nincs átadva)" +msgstr "Nem használható self mivel nincs megadva" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -452,9 +453,8 @@ msgid "Pressed" msgstr "ElÅ‘re beállÃtott" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Keresés" +msgstr "beolvasási kód" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -462,7 +462,7 @@ msgstr "" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -706,6 +706,11 @@ msgid "Main Run Args" msgstr "FÅ‘ Jelenet Argumentumok:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scene elérési Út:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -713,19 +718,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Verziókezelés" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Verziókezelés" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "BÅ‘vÃtmény neve:" +msgid "Version Control Plugin Name" +msgstr "Verziókezelés" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2165,7 +2166,7 @@ msgstr "Biztosan eltávolÃtja az összes kapcsolatot a(z) \"%s\" jelzésrÅ‘l?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "Jelzések" +msgstr "jelek" #: editor/connections_dialog.cpp msgid "Filter signals" @@ -2866,7 +2867,7 @@ msgstr "Node Útvonal Másolása" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "A csomag telepÃtése sikeres volt!" #: editor/editor_export.cpp @@ -4417,15 +4418,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Jelenet" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scene elérési Út:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4552,6 +4544,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Verziókezelés" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Ãtnevezés" @@ -4580,6 +4576,10 @@ msgstr "Zavarmentes mód váltása." msgid "Add a new scene." msgstr "Hozzáad egy új jelenetet." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Jelenet" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ugrás az elÅ‘zÅ‘leg megnyitott jelenetre." @@ -5898,7 +5898,7 @@ msgstr "Pont" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "Alakzat" #: editor/editor_settings.cpp #, fuzzy @@ -7157,7 +7157,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 @@ -13339,7 +13339,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH Passphrase" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" @@ -16787,9 +16787,8 @@ 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 "Sokszögek" +msgstr "Sokszög" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" @@ -18222,7 +18221,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "AmÃg" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18551,7 +18550,7 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "hozam" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" diff --git a/editor/translations/id.po b/editor/translations/id.po index c16217217b..4788d2a7c2 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -666,6 +666,10 @@ msgid "Main Run Args" msgstr "Jalan Utama Argumen" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Penamaan Skena" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Cari dalam Ekstensi File" @@ -673,18 +677,15 @@ msgstr "Cari dalam Ekstensi File" msgid "Script Templates Search Path" msgstr "Jalur Pencarian Template Skrip" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Kontrol Versi" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Muat Otomatis Saat Memulai" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nama Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Kontrol Versi" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2797,7 +2798,7 @@ msgstr "Salin Lokasi Node" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paket Sukses Terpasang!" #: editor/editor_export.cpp @@ -4330,14 +4331,6 @@ msgstr "" "Tidak dapat menulis ke file '%s', file sedang digunakan, terkunci atau tidak " "memiliki izin." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scene" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Penamaan Skena" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4466,6 +4459,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Kontrol Versi" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Ubah Nama" @@ -4494,6 +4491,10 @@ msgstr "Toggle mode tanpa gangguan." msgid "Add a new scene." msgstr "Tambah skena baru." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scene" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Pergi ke skena yang sebelumnya dibuka." diff --git a/editor/translations/is.po b/editor/translations/is.po index 9119f1fc50..ea3301ce7f 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -647,24 +647,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2763,7 +2762,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4187,14 +4186,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4315,6 +4306,10 @@ 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 #, fuzzy msgid "Username" msgstr "Endurnefning Anim track" @@ -4343,6 +4338,10 @@ msgstr "" 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 "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 9406ec6484..c529c06241 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -73,7 +73,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-16 18:57+0000\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" "Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" @@ -82,7 +82,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.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -693,6 +693,10 @@ msgid "Main Run Args" msgstr "Parametri Principali Eseguiti" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Nome Scena" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Cerca nelle Estensioni dei File" @@ -700,18 +704,15 @@ msgstr "Cerca nelle Estensioni dei File" msgid "Script Templates Search Path" msgstr "Percorso di Ricerca dei Template di Script" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Controllo della versione" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Autocaricamento all'Avvio" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nome dell'estensione" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Controllo della versione" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2808,23 +2809,24 @@ msgid "Choose" msgstr "Scegli" #: editor/editor_export.cpp +#, fuzzy msgid "Project export for platform:" -msgstr "" +msgstr "Esportazione del progetto per la piattaforma:" #: editor/editor_export.cpp #, fuzzy msgid "Completed with errors." -msgstr "Percorsi Completi dei File" +msgstr "Completato con errori." #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." -msgstr "Pacchetto installato con successo!" +msgid "Completed successfully." +msgstr "Completato con successo." #: editor/editor_export.cpp #, fuzzy msgid "Failed." -msgstr "Fallito:" +msgstr "Fallito." #: editor/editor_export.cpp msgid "Storing File:" @@ -2841,7 +2843,7 @@ msgstr "Impacchettando" #: editor/editor_export.cpp #, fuzzy msgid "Save PCK" -msgstr "Salva come" +msgstr "Salva PCK" #: editor/editor_export.cpp #, fuzzy @@ -2861,7 +2863,7 @@ msgstr "Impossibile aprire il file in scrittura:" #: editor/editor_export.cpp #, fuzzy msgid "Save ZIP" -msgstr "Salva come" +msgstr "Salva ZIP" #: editor/editor_export.cpp msgid "" @@ -4345,14 +4347,6 @@ msgid "" msgstr "" "Impossibile scrivere sul file '%s', file in uso, bloccato o mancano permessi." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scena" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Nome Scena" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4467,6 +4461,10 @@ msgid "Default Color Picker Mode" msgstr "Modalità di Scelta Colore Predefinita" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Controllo della versione" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nome Utente" @@ -4494,6 +4492,10 @@ msgstr "Commuta la modalità senza distrazioni." msgid "Add a new scene." msgstr "Aggiungi una nuova scena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Va alla scena precedentemente aperta." @@ -18032,8 +18034,9 @@ msgid "if (cond) is:" msgstr "if (cond) is:" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "While" -msgstr "" +msgstr "While" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18345,8 +18348,9 @@ msgid "Search VisualScript" msgstr "Ricerca VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp +#, fuzzy msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -18371,17 +18375,17 @@ msgstr "Tempo Di Attesa" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitSignal" -msgstr "Segnale" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitNodeSignal" -msgstr "Segnale" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitInstanceSignal" -msgstr "Istanza" +msgstr "WaitInstanceSignal" #: modules/webrtc/webrtc_data_channel.cpp #, fuzzy @@ -18921,7 +18925,7 @@ msgstr "Non è stato possibile trovare keystore, impossible esportare." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not start apksigner executable." -msgstr "Impossibile avviare il sottoprocesso!" +msgstr "Non è stato possibile avviare l'eseguibile apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -18954,9 +18958,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Nome file non valido! L'APK Android richiede l'estensione *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Formato d'esportazione non supportato!\n" +msgstr "Formato d'esportazione non supportato!" #: platform/android/export/export_plugin.cpp msgid "" @@ -18973,10 +18976,9 @@ msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Versione build di Android non coerente:\n" -" Template installato: %s\n" -" Versione Godot: %s\n" -"Per favore, reinstalla il build template di Android dal menu \"Progetto\"." +"Versione build di Android non coerente: Template installato: %s, Versione " +"Godot: %s. Per favore, reinstalla il build template di Android dal menu " +"\"Progetto\"." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18989,7 +18991,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not export project files to gradle project." -msgstr "Impossibile esportare i file del progetto in un progetto gradle\n" +msgstr "Impossibile esportare i file del progetto in un progetto gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19034,9 +19036,7 @@ msgstr "Creazione APK..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Impossibile trovare il template APK per l'esportazione:\n" -"%s" +msgstr "Impossibile trovare il template APK per l'esportazione: \"%s\"." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19754,7 +19754,7 @@ msgstr "Impossibile esportare i file del progetto" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not start xcrun executable." -msgstr "Impossibile avviare il sottoprocesso!" +msgstr "Impossibile avviare l'eseguibile xcrun." #: platform/osx/export/export.cpp #, fuzzy @@ -19828,7 +19828,7 @@ msgstr "Direzione" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not start hdiutil executable." -msgstr "Impossibile avviare il sottoprocesso!" +msgstr "Impossibile avviare l'eseguibile hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -19909,7 +19909,7 @@ msgstr "Proiezione" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Impossibile esportare i file del progetto in un progetto gradle\n" +msgstr "Impossibile aprire il file da leggere dal percorso \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20226,7 +20226,7 @@ msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp #, fuzzy msgid "Signtool" -msgstr "Segnale" +msgstr "Signtool" #: platform/uwp/export/export.cpp msgid "Debug Certificate" @@ -21026,8 +21026,9 @@ msgstr "" #: scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp +#, fuzzy msgid "Damping" -msgstr "" +msgstr "Smorzamento" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21042,8 +21043,9 @@ msgstr "Dividi Curva" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp +#, fuzzy msgid "Angle" -msgstr "" +msgstr "Angolo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21176,8 +21178,9 @@ msgstr "" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp +#, fuzzy msgid "Length" -msgstr "" +msgstr "Lunghezza" #: scene/2d/joints_2d.cpp #, fuzzy @@ -21213,8 +21216,9 @@ msgstr "TextureRegion" #: 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 +#, fuzzy msgid "Energy" -msgstr "" +msgstr "Energia" #: scene/2d/light_2d.cpp msgid "Z Min" @@ -21291,8 +21295,9 @@ msgid "Default Color" msgstr "Predefinito" #: scene/2d/line_2d.cpp scene/resources/texture.cpp +#, fuzzy msgid "Fill" -msgstr "" +msgstr "Riempimento" #: scene/2d/line_2d.cpp scene/resources/texture.cpp #, fuzzy @@ -21343,8 +21348,9 @@ msgid "Antialiased" msgstr "Inizializza" #: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp +#, fuzzy msgid "Multimesh" -msgstr "" +msgstr "Multimesh" #: scene/2d/navigation_2d.cpp scene/3d/baked_lightmap.cpp #: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp @@ -21415,8 +21421,9 @@ msgstr "" "poligono." #: scene/2d/navigation_polygon.cpp +#, fuzzy msgid "Navpoly" -msgstr "" +msgstr "Navpoly" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp #, fuzzy @@ -21630,8 +21637,9 @@ msgstr "" "Modifica invece la dimensione nelle forme di collisione figlie." #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#, fuzzy msgid "Mass" -msgstr "" +msgstr "Massa" #: scene/2d/physics_body_2d.cpp #, fuzzy @@ -21682,8 +21690,9 @@ msgid "Damp" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#, fuzzy msgid "Angular" -msgstr "" +msgstr "Angolare" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index c0b37f1509..1ae3c9cf8c 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -675,6 +675,10 @@ msgid "Main Run Args" msgstr "メインシーンã®å¼•æ•°:" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "シーンã®å‘½åè¦å‰‡" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "ファイル拡張åã§æ¤œç´¢" @@ -682,18 +686,15 @@ msgstr "ファイル拡張åã§æ¤œç´¢" msgid "Script Templates Search Path" msgstr "スクリプトテンプレートã®æ¤œç´¢ãƒ‘ス" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "起動時ã®è‡ªå‹•èªã¿è¾¼ã¿" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "プラグインå" +#, fuzzy +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 @@ -2815,7 +2816,7 @@ msgstr "ノードã®ãƒ‘スをコピー" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "パッケージã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸï¼" #: editor/editor_export.cpp @@ -4329,14 +4330,6 @@ msgstr "" "ファイル '%s'ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“。ファイルãŒä½¿ç”¨ä¸ã‹ã€ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ã‹ã€æ¨©é™ãŒ" "ã‚ã‚Šã¾ã›ã‚“。" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "シーン" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "シーンã®å‘½åè¦å‰‡" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4456,6 +4449,10 @@ 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 "ユーザーå" @@ -4483,6 +4480,10 @@ msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰ã‚’切り替ãˆã‚‹ã€‚" 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 "以å‰ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•ã™ã‚‹ã€‚" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index bd99c1497d..34914a67b6 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -661,24 +661,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2843,7 +2842,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "პáƒáƒ™áƒ”ტი დáƒáƒ§áƒ”ნდრწáƒáƒ მáƒáƒ¢áƒ”ბით!" #: editor/editor_export.cpp @@ -4300,14 +4299,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4428,6 +4419,10 @@ 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 #, fuzzy msgid "Username" msgstr "áƒáƒ£áƒ“ირგáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის ცვლილებáƒ" @@ -4456,6 +4451,10 @@ msgstr "" 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 "" diff --git a/editor/translations/km.po b/editor/translations/km.po index 52131ea96a..700f4f483c 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -624,24 +624,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2691,7 +2690,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4097,14 +4096,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4219,6 +4210,10 @@ 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 "" @@ -4246,6 +4241,10 @@ msgstr "" 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 "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index cc27ce3de6..b4a91e0076 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -657,6 +657,10 @@ msgid "Main Run Args" msgstr "ë©”ì¸ ì‹¤í–‰ ì¸ìž" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "씬 ì´ë¦„ ì§€ì •" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "íŒŒì¼ í™•ìž¥ìžë¡œ 찾기" @@ -664,18 +668,15 @@ msgstr "íŒŒì¼ í™•ìž¥ìžë¡œ 찾기" msgid "Script Templates Search Path" msgstr "스í¬ë¦½íŠ¸ 템플릿 검색 경로" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "ë²„ì „ 컨트롤" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "스타트업으로 ìžë™ 로드" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "í”ŒëŸ¬ê·¸ì¸ ì´ë¦„" +#, fuzzy +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 @@ -2753,7 +2754,7 @@ msgstr "íŒŒì¼ ê²½ë¡œ 완성" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "패키지를 성공ì 으로 설치했습니다!" #: editor/editor_export.cpp @@ -4252,14 +4253,6 @@ msgid "" msgstr "" "íŒŒì¼ '%s'ì— ì“¸ 수 없습니다. 파ì¼ì´ 사용 중ì´ê±°ë‚˜ ìž ê²¨ 있거나 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "씬" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "씬 ì´ë¦„ ì§€ì •" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4374,6 +4367,10 @@ 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 "ì‚¬ìš©ìž ì´ë¦„" @@ -4401,6 +4398,10 @@ msgstr "집중 모드를 í† ê¸€í•©ë‹ˆë‹¤." 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 "ì´ì „ì— ì—´ì—ˆë˜ ì”¬ìœ¼ë¡œ ì´ë™í•©ë‹ˆë‹¤." diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 15e8da21f8..5f0e9b24ad 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -668,6 +668,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Kelias iki Scenos:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -675,20 +680,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "Versija:" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Priedai" +msgid "Version Control Plugin Name" +msgstr "Versija:" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2800,7 +2800,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4263,15 +4263,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Kelias iki Scenos:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4394,6 +4385,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "Versija:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "Naujas pavadinimas:" @@ -4421,6 +4417,10 @@ msgstr "" 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 "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 88132bc800..7397c083fa 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -675,6 +675,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Ainas ceļš:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -682,19 +687,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versiju Kontrole" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Versiju Kontrole" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Spraudņi" +msgid "Version Control Plugin Name" +msgstr "Versiju Kontrole" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2813,7 +2814,7 @@ msgstr "KopÄ“t mezgla ceļu" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakete instalÄ“ta sekmÄ«gi!" #: editor/editor_export.cpp @@ -4327,15 +4328,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Aina" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Ainas ceļš:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4460,6 +4452,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versiju Kontrole" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "PÄrsaukt" @@ -4488,6 +4484,10 @@ msgstr "PÄrslÄ“gt traucÄ“jumu brÄ«vo režīmu." msgid "Add a new scene." msgstr "Pievienot jaunu ainu." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Aina" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Iet uz iepriekÅ¡ atvÄ“rto ainu." diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 90af441963..e37eadfeaf 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -631,24 +631,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2702,7 +2701,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4113,14 +4112,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4235,6 +4226,10 @@ 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 "" @@ -4262,6 +4257,10 @@ msgstr "" 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 "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 8e5ef57cd8..74ea6168e4 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -635,24 +635,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2711,7 +2710,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4126,14 +4125,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4249,6 +4240,10 @@ 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 "" @@ -4276,6 +4271,10 @@ msgstr "" 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 "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index e9ce5ad750..005f8a3177 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -637,24 +637,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2711,7 +2710,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4119,14 +4118,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4243,6 +4234,10 @@ 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 "" @@ -4270,6 +4265,10 @@ msgstr "" 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 "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index cb6b65ee49..3ef25ef863 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -633,6 +633,11 @@ msgid "Main Run Args" msgstr "Jalan Utama Args" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Laluan Adegan:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Cari Dalam Sambungan Fail" @@ -640,18 +645,15 @@ msgstr "Cari Dalam Sambungan Fail" msgid "Script Templates Search Path" msgstr "Laluan Carian Templat Skrip" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Kawalan Versi" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Muatkan Automatik Semasa Permulaan" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nama Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Kawalan Versi" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2738,7 +2740,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakej berjaya dipasang!" #: editor/editor_export.cpp @@ -4268,15 +4270,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Adegan" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Laluan Adegan:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4404,6 +4397,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Kawalan Versi" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Namakan Semula" @@ -4432,6 +4429,10 @@ msgstr "Togol mod bebas gangguan." msgid "Add a new scene." msgstr "Tambah adegan baru." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Adegan" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Pergi ke adegan yang dibuka sebelum ini." diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 21a2832614..e5b0dcc26f 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -670,6 +670,11 @@ msgid "Main Run Args" msgstr "Hovedkjøringsargumenter" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scene-Sti:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Søk I Filetternavn" @@ -677,18 +682,15 @@ msgstr "Søk I Filetternavn" msgid "Script Templates Search Path" msgstr "Skriptmaler Søkesti" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versjonskontroll" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Automatisk Lasting Ved Oppstart" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Navn PÃ¥ Programvareutvidelse" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Versjonskontroll" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2869,7 +2871,7 @@ msgstr "Kopier Node-bane" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Vellykket Installering av Pakke!" #: editor/editor_export.cpp @@ -4439,15 +4441,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scene" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scene-Sti:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4577,6 +4570,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versjonskontroll" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Gi nytt navn" @@ -4605,6 +4602,10 @@ msgstr "Vis/skjul distraksjonsfri modus." msgid "Add a new scene." msgstr "Legg til ny scene." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scene" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "GÃ¥ til forrige Ã¥pne scene." diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 4cfc0fa652..6d43002a17 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -749,6 +749,11 @@ msgid "Main Run Args" msgstr "Startscène argumenten:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scènepad:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -756,19 +761,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versiebeheer" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Versiebeheersysteem" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Pluginnaam:" +msgid "Version Control Plugin Name" +msgstr "Versiebeheer" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2910,7 +2911,7 @@ msgstr "Knooppad kopiëren" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakket succesvol geïnstalleerd!" #: editor/editor_export.cpp @@ -4447,15 +4448,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scène" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scènepad:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4584,6 +4576,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versiebeheer" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Naam wijzigen" @@ -4612,6 +4608,10 @@ msgstr "Afleidingsvrijemodus omschakelen." msgid "Add a new scene." msgstr "Nieuwe scène toevoegen." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scène" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ga naar de eerder geopende scène." diff --git a/editor/translations/pl.po b/editor/translations/pl.po index e89a8b69b4..5960c6933e 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -690,6 +690,11 @@ msgid "Main Run Args" msgstr "Główne argumenty wÅ‚Ä…czania" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Åšcieżka sceny:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Wyszukiwanie w rozszerzeniach plików" @@ -697,18 +702,15 @@ msgstr "Wyszukiwanie w rozszerzeniach plików" msgid "Script Templates Search Path" msgstr "Åšcieżka wyszukiwania szablonów skryptów" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Kontrola wersji" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Automatyczne Å‚adowanie podczas uruchamiania" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nazwa wtyczki" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Kontrola wersji" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2812,7 +2814,7 @@ msgstr "Skopiuj Å›cieżkÄ™ wÄ™zÅ‚a" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pakiet zainstalowano poprawnie!" #: editor/editor_export.cpp @@ -4340,15 +4342,6 @@ msgstr "" "Nie można zapisać do pliku '%s', plik jest w użyciu, zablokowany lub nie ma " "wystarczajÄ…cych uprawnieÅ„." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scena" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Åšcieżka sceny:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4480,6 +4473,10 @@ msgid "Default Color Picker Mode" msgstr "DomyÅ›lny tryb pipety" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Kontrola wersji" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Użytkownik" @@ -4507,6 +4504,10 @@ msgstr "Tryb bez rozproszeÅ„." msgid "Add a new scene." msgstr "Dodaj nowÄ… scenÄ™." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Wróć do poprzednio otwartej sceny." diff --git a/editor/translations/pr.po b/editor/translations/pr.po index d01d1dcf33..139d252495 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -665,24 +665,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2794,7 +2793,7 @@ msgid "Completed with errors." msgstr "Forge yer Node!" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4257,14 +4256,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4384,6 +4375,10 @@ 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 #, fuzzy msgid "Username" msgstr "Rename Function" @@ -4412,6 +4407,10 @@ msgstr "" 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 "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 510d2515dd..c0af7140fc 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -663,6 +663,10 @@ msgid "Main Run Args" msgstr "Argumentos da Execução Principal" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Nomear a Cena" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -670,18 +674,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Controle de Versões" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Sistema de Controlo de Versões" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nome do Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Controle de Versões" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2814,7 +2815,7 @@ msgstr "Copiar Caminho do Nó" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pacote Instalado com sucesso!" #: editor/editor_export.cpp @@ -4336,14 +4337,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Cena" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Nomear a Cena" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4470,6 +4463,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Controle de Versões" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nome de Utilizador" @@ -4497,6 +4494,10 @@ msgstr "Alternar modo livre de distrações." msgid "Add a new scene." msgstr "Adicionar nova cena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Cena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ir para cena aberta anteriormente." diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 09d0e6c64e..df7e56059b 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -145,7 +145,7 @@ 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-06-16 18:57+0000\n" +"PO-Revision-Date: 2022-06-19 11:52+0000\n" "Last-Translator: lucas rossy brasil coelho <lucasrossy270@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" @@ -154,7 +154,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.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -766,6 +766,10 @@ msgid "Main Run Args" msgstr "Argumentos de Execução Principais" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Nomeação de Cena" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Pesquisar em Extensões de Arquivo" @@ -773,18 +777,15 @@ msgstr "Pesquisar em Extensões de Arquivo" msgid "Script Templates Search Path" msgstr "Caminho de Pesquisa de Modelos de Script" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Controle de Versão" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Carregamento Automático na Inicialização" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Nome do Plugin" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Controle de Versão" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2892,7 +2893,7 @@ msgstr "Copiar Caminho do Nó" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pacote instalado com sucesso!" #: editor/editor_export.cpp @@ -4412,14 +4413,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Cena" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Nomeação de Cena" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4543,6 +4536,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Controle de Versão" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Nome do usuário" @@ -4570,6 +4567,10 @@ msgstr "Alternar modo sem-distrações." msgid "Add a new scene." msgstr "Adicionar nova cena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Cena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Ir para cena aberta anteriormente." @@ -9873,7 +9874,7 @@ msgstr "Criar Contorno" #: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/texture.cpp msgid "Mesh" -msgstr "Malha" +msgstr "Mesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -19225,15 +19226,13 @@ msgid "Code Signing" msgstr "Sinal" #: platform/android/export/export_plugin.cpp -#, fuzzy 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' não foi encontrado.\n" -"Verifique se o comando está disponÃvel no diretório do Android SDK build-" -"tools.\n" -"O %s resultante está sem assinatura." +"'apksigner' não foi encontrado. Verifique se o comando está disponÃvel no " +"diretório de ferramentas de compilação do Android SDK. O %s resultante não é " +"assinado." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19281,9 +19280,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Nome de arquivo inválido! Android APK requer a extensão *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Formato de Exportação Não Suportado\n" +msgstr "Formato de exportação não suportado!" #: platform/android/export/export_plugin.cpp msgid "" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 144032dcff..b6b92325e4 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -673,6 +673,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Calea Scenei:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -680,19 +685,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Control versiune" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Control versiune" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Nume plugin:" +msgid "Version Control Plugin Name" +msgstr "Control versiune" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2830,7 +2831,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Pachet instalat cu succes!" #: editor/editor_export.cpp @@ -4360,15 +4361,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scenă" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Calea Scenei:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4497,6 +4489,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control versiune" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "RedenumeÈ™te" @@ -4525,6 +4521,10 @@ msgstr "Comutează modul fără distrageri." msgid "Add a new scene." msgstr "Adaugă o nouă scenă." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scenă" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Mergi la o scenă deschisă anterior." diff --git a/editor/translations/ru.po b/editor/translations/ru.po index e1d6bd5fbc..b920136351 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -741,6 +741,10 @@ msgid "Main Run Args" msgstr "ОÑновные аргументы запуÑка" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Именование Ñцен" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "ИÑкать в раÑширениÑÑ… файлов" @@ -748,18 +752,15 @@ msgstr "ИÑкать в раÑширениÑÑ… файлов" msgid "Script Templates Search Path" msgstr "Путь поиÑка шаблонов Ñкриптов" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Контроль верÑий" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Ðвтозагрузка при запуÑке" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Ðазвание плагина" +#, fuzzy +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 @@ -2848,7 +2849,7 @@ msgstr "Завершать пути файлов" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Пакет уÑпешно уÑтановлен!" #: editor/editor_export.cpp @@ -4364,14 +4365,6 @@ msgstr "" "Ðевозможно запиÑать в файл «%s», файл иÑпользуетÑÑ, заблокирован или " "отÑутÑтвуют разрешениÑ." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Сцена" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Именование Ñцен" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4486,6 +4479,10 @@ 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 "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" @@ -4513,6 +4510,10 @@ msgstr "Переключить режим без отвлечениÑ." 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 "Перейти к предыдущей открытой Ñцене." diff --git a/editor/translations/si.po b/editor/translations/si.po index 3c24ed1f7b..d28d0a4f81 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -640,24 +640,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2741,7 +2740,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4160,14 +4159,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4286,6 +4277,10 @@ 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 "" @@ -4313,6 +4308,10 @@ msgstr "" 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 "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index c131bd6515..6615ae93a0 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -693,6 +693,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Cesta Scény:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -700,19 +705,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Kontrola Verzie" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Kontrola Verzie" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Meno Pluginu:" +msgid "Version Control Plugin Name" +msgstr "Kontrola Verzie" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2848,7 +2849,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "BalÃk bol úspeÅ¡ne nainÅ¡talovaný!" #: editor/editor_export.cpp @@ -4376,15 +4377,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scéna" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Cesta Scény:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4512,6 +4504,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Kontrola Verzie" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "PremenovaÅ¥" @@ -4540,6 +4536,10 @@ msgstr "Prepnúť režim bez rozptyľovania." msgid "Add a new scene." msgstr "PridaÅ¥ novú scénu." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scéna" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "ÃsÅ¥ do naposledy otvorenej scény." diff --git a/editor/translations/sl.po b/editor/translations/sl.po index c717fcb4c9..acb24489bd 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -667,6 +667,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Pot Prizora:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -674,20 +679,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "RazliÄica:" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "VtiÄniki" +msgid "Version Control Plugin Name" +msgstr "RazliÄica:" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2882,7 +2882,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paket je UspeÅ¡no NameÅ¡Äen!" #: editor/editor_export.cpp @@ -4446,15 +4446,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Prizor" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Pot Prizora:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4583,6 +4574,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "RazliÄica:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "Preimenuj" @@ -4610,6 +4606,10 @@ msgstr "Preklop naÄin pisanja brez motenj." msgid "Add a new scene." msgstr "Dodaj nov Prizor." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Prizor" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Pojdi na predhodno odprti prizor." diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 452dad01af..c97aac239a 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -669,6 +669,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Rruga Skenës:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -676,20 +681,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "Versioni:" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Emri i Shtojcës:" +msgid "Version Control Plugin Name" +msgstr "Versioni:" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2819,7 +2819,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paketa u instalua me sukses!" #: editor/editor_export.cpp @@ -4386,15 +4386,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Skenë" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Rruga Skenës:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4521,6 +4512,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "Versioni:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "Riemërto" @@ -4548,6 +4544,10 @@ msgstr "Ndrysho metodën pa shpërqëndrime." msgid "Add a new scene." msgstr "Shto një skenë të re." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Skenë" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Shko në skenën e hapur më parë." diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index d4b703a467..55387743e7 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -700,6 +700,11 @@ msgid "Main Run Args" msgstr "Ðргументи Главне Сцене" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Пут Ñцене:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -707,20 +712,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy -msgid "Version Control" -msgstr "Верзија:" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "VCS(СиÑтем Контроле Верзије)" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Име Прикључка :" +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 @@ -2998,7 +2998,7 @@ msgstr "Копирај Путању Чвора" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Пакет је инÑталиран уÑпешно!" #: editor/editor_export.cpp @@ -4629,15 +4629,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Сцена" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Пут Ñцене:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4768,6 +4759,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "Верзија:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "Преименуј" @@ -4795,6 +4791,10 @@ msgstr "Укљ./ИÑкљ. режим без Ñметње." 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 "Отвори претходну Ñцену." diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 7b1eebf83f..21d94999a2 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -656,24 +656,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2764,7 +2763,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4174,14 +4173,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4301,6 +4292,10 @@ 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 #, fuzzy msgid "Username" msgstr "Animacija Preimenuj Kanal" @@ -4329,6 +4324,10 @@ msgstr "" 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 "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index c221b5e7a0..54655bcecf 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -704,6 +704,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Scen Filsökväg:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -711,19 +716,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Versionshantering" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Versionshantering" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Plugin Namn:" +msgid "Version Control Plugin Name" +msgstr "Versionshantering" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2850,7 +2851,7 @@ msgstr "Kopiera Nod-Sökväg" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paketet installerades!" #: editor/editor_export.cpp @@ -4424,15 +4425,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Scen" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Scen Filsökväg:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4559,6 +4551,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Versionshantering" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Byt namn" @@ -4587,6 +4583,10 @@ msgstr "Växla distraktionsfritt läge." msgid "Add a new scene." msgstr "Lägg till en ny scen." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Scen" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "GÃ¥ till föregÃ¥ende öppna scen." diff --git a/editor/translations/te.po b/editor/translations/te.po index 4d679d390c..7e39aed20c 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -628,24 +628,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2694,7 +2693,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4100,14 +4099,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4222,6 +4213,10 @@ 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 "" @@ -4249,6 +4244,10 @@ msgstr "" 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 "" diff --git a/editor/translations/th.po b/editor/translations/th.po index a8568f7437..cf482896d4 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -703,6 +703,11 @@ msgid "Main Run Args" msgstr "ตัวà¹à¸›à¸£à¸‰à¸²à¸à¸«à¸¥à¸±à¸:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¸‰à¸²à¸:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -710,19 +715,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "เวà¸à¸£à¹Œà¸Šà¸±à¸™à¸„à¸à¸™à¹‚ทรล" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "ระบบจัดà¸à¸²à¸£à¸‹à¸à¸£à¹Œà¸ª (Version Control)" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "ชื่à¸à¸›à¸¥à¸±à¹Šà¸à¸à¸´à¸™:" +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 @@ -2869,7 +2870,7 @@ msgstr "คัดลà¸à¸à¸•à¸³à¹à¸«à¸™à¹ˆà¸‡à¹‚หนด" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "ติดตั้งà¹à¸žà¸„เà¸à¸ˆà¹€à¸ªà¸£à¹‡à¸ˆà¸ªà¸¡à¸šà¸¹à¸£à¸“์!" #: editor/editor_export.cpp @@ -4376,15 +4377,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "ฉาà¸" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¸‰à¸²à¸:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4513,6 +4505,10 @@ 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 #, fuzzy msgid "Username" msgstr "เปลี่ยนชื่à¸" @@ -4541,6 +4537,10 @@ msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" 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 "ไปยังฉาà¸à¸—ี่เพิ่งเปิด" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index 2ba6909fa2..963d542e6d 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -672,6 +672,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Kinalalagyan ng Eksena:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -679,19 +684,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Pagmamahala ng Bersyon" - #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" +#, fuzzy +msgid "Version Control Autoload On Startup" +msgstr "Pagmamahala ng Bersyon" #: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "Pangalan ng Plugin:" +msgid "Version Control Plugin Name" +msgstr "Pagmamahala ng Bersyon" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2807,7 +2808,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4254,15 +4255,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Eksena" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Kinalalagyan ng Eksena:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4386,6 +4378,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Pagmamahala ng Bersyon" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Username" msgstr "Inibang Pangalan" @@ -4414,6 +4410,10 @@ msgstr "" msgid "Add a new scene." msgstr "Magdagdag ng panibagong eksena." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Eksena" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Bumalik sa dating binuksang eksena." diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 04e27574ea..ea437aaf30 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -705,6 +705,11 @@ msgid "Main Run Args" msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "Sahne Yolu:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Dosya Uzantılarında Ara" @@ -712,19 +717,15 @@ msgstr "Dosya Uzantılarında Ara" msgid "Script Templates Search Path" msgstr "Script Dosyalarını Aramak İçin Dosya Yolu" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Sürüm Kontrol" - #: core/project_settings.cpp #, fuzzy -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "BaÅŸlangıçta Otomatik Yükleme" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Eklenti Adı" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Sürüm Kontrol" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2830,7 +2831,7 @@ msgstr "Düğüm Yolunu Kopyala" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Paket BaÅŸarı ile Kuruldu!" #: editor/editor_export.cpp @@ -4362,15 +4363,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Sahne" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "Sahne Yolu:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4499,6 +4491,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Sürüm Kontrol" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Kullanıcı adı" @@ -4526,6 +4522,10 @@ msgstr "Dikkat-Dağıtmayan Kipine geç." msgid "Add a new scene." msgstr "Yeni bir sahne ekle." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Sahne" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Daha önce açılan sahneye git." diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 4c90b9e989..6d96ccc30b 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -650,6 +650,10 @@ msgid "Main Run Args" msgstr "Ðргументи оÑновного запуÑку" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "Ð†Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñцен" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ у файлах" @@ -657,18 +661,15 @@ msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ у файлах" msgid "Script Templates Search Path" msgstr "ШлÑÑ… пошуку Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñ–Ð² Ñкриптів" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñми" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Ðвтоматично завантажувати під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Ðазва додатка" +#, fuzzy +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 @@ -2754,7 +2755,7 @@ msgstr "Повні шлÑхи до файлів" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Пакунок уÑпішно вÑтановлено!" #: editor/editor_export.cpp @@ -4274,14 +4275,6 @@ msgstr "" "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файла «%s», файл викориÑтовує інша програма, його " "заблоковано або у Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” відповідних прав доÑтупу до нього." -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Сцена" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "Ð†Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñцен" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4396,6 +4389,10 @@ 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 "КориÑтувач" @@ -4423,6 +4420,10 @@ msgstr "Перемкнути режим без відволіканнÑ." 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 "Перейти до раніше відкритої Ñцени." diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index db5af915dc..79cb7b84e2 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -655,24 +655,23 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -msgid "Search In File Extensions" +msgid "Scene Naming" msgstr "" #: core/project_settings.cpp -msgid "Script Templates Search Path" +msgid "Search In File Extensions" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" +#: core/project_settings.cpp +msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -msgid "Autoload On Startup" +msgid "Version Control Autoload On Startup" msgstr "" #: core/project_settings.cpp -msgid "Plugin Name" +msgid "Version Control Plugin Name" msgstr "" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp @@ -2759,7 +2758,7 @@ msgid "Completed with errors." msgstr "" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4211,14 +4210,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4338,6 +4329,10 @@ 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 #, fuzzy msgid "Username" msgstr ".تمام کا انتخاب" @@ -4366,6 +4361,10 @@ msgstr "" 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 "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 7e5dd162f7..a16d75a4bc 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -659,6 +659,11 @@ msgid "Main Run Args" msgstr "Tham số Cảnh chÃnh:" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "ÄÆ°á»ng dẫn Cảnh:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -666,18 +671,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "ÄÆ°á»ng dẫn tìm kiếm bản mẫu kịch bản" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "Theo dõi phiên bản" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "Tá»± nạp khi khởi Ä‘á»™ng" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "Tên trình cắm" +#, fuzzy +msgid "Version Control Plugin Name" +msgstr "Theo dõi phiên bản" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2790,7 +2792,7 @@ msgstr "Sao chép Ä‘Æ°á»ng dẫn nút" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "Cà i đặt gói thà nh công!" #: editor/editor_export.cpp @@ -4275,15 +4277,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "Cảnh" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "ÄÆ°á»ng dẫn Cảnh:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4406,6 +4399,10 @@ msgid "Default Color Picker Mode" msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Theo dõi phiên bản" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" msgstr "Tên ngÆ°á»i dùng" @@ -4433,6 +4430,10 @@ msgstr "Báºt tắt chế Ä‘á»™ táºp trung." msgid "Add a new scene." msgstr "Thêm cảnh má»›i." +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "Cảnh" + #: editor/editor_node.cpp msgid "Go to previously opened scene." msgstr "Trở vá» cảnh đã mở trÆ°á»›c đó." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 336418ef35..ea23349421 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-06-12 13:19+0000\n" +"PO-Revision-Date: 2022-06-19 11:52+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" @@ -98,7 +98,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.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -434,14 +434,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 @@ -706,6 +704,10 @@ msgid "Main Run Args" msgstr "主è¿è¡Œå‚æ•°" #: core/project_settings.cpp +msgid "Scene Naming" +msgstr "场景命å" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "æœç´¢æ–‡ä»¶æ‰©å±•å" @@ -713,18 +715,15 @@ msgstr "æœç´¢æ–‡ä»¶æ‰©å±•å" msgid "Script Templates Search Path" msgstr "脚本模æ¿æœç´¢è·¯å¾„" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "版本控制" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨åŠ è½½" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "æ’件å" +#, fuzzy +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 @@ -2228,7 +2227,7 @@ msgstr "打开" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "%s 的所有者(总计:%d)" #: editor/dependency_editor.cpp msgid "" @@ -2782,22 +2781,20 @@ msgstr "选择" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "补全文件路径" +msgstr "已完æˆï¼Œå˜åœ¨é”™è¯¯ã€‚" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." -msgstr "软件包安装æˆåŠŸï¼" +msgid "Completed successfully." +msgstr "æˆåŠŸå®Œæˆã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "失败:" +msgstr "失败。" #: editor/editor_export.cpp msgid "Storing File:" @@ -2812,29 +2809,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 "" @@ -2946,30 +2938,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." @@ -4251,14 +4238,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "æ— æ³•å†™å…¥æ–‡ä»¶â€œ%sâ€ï¼Œæ–‡ä»¶è¢«å 用ã€å·²é”定ã€æˆ–æƒé™ä¸è¶³ã€‚" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "场景" - -#: editor/editor_node.cpp -msgid "Scene Naming" -msgstr "场景命å" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4373,6 +4352,10 @@ 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 "用户å" @@ -4400,6 +4383,10 @@ msgstr "切æ¢ä¸“注模å¼ã€‚" 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 "转到上一个打开的场景。" @@ -5164,9 +5151,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." @@ -7083,12 +7069,15 @@ 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 msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s:检测到纹ç†è¢«ç”¨äºŽ 3D。æ£åœ¨å¯ç”¨è¿‡æ»¤ã€é‡å¤ã€Mipmap 生æˆå’Œ VRAM 纹ç†åŽ‹ç¼©ã€‚" #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" @@ -11363,9 +11352,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." @@ -13933,9 +13921,8 @@ msgid "Export templates for this platform are missing:" msgstr "该平å°çš„导出模æ¿ç¼ºå¤±ï¼š" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "项目创始人" +msgstr "项目导出" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -16834,17 +16821,15 @@ msgid "Mask" msgstr "é®ç½©" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "导航" +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 -#, fuzzy msgid "Navigation Layers" -msgstr "导航体验" +msgstr "导航层" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -18385,19 +18370,16 @@ msgstr "“Target Sdkâ€ç‰ˆæœ¬å¿…须大于ç‰äºŽâ€œMin Sdkâ€ç‰ˆæœ¬ã€‚" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "æ£åœ¨å¯¹ DMG 进行代ç ç¾å" +msgstr "代ç ç¾å" #: platform/android/export/export_plugin.cpp -#, fuzzy 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â€ã€‚\n" -"请检查 Android SDK çš„ build-tools 目录ä¸æ˜¯å¦æœ‰æ¤å‘½ä»¤ã€‚\n" -"生æˆçš„ %s 未ç¾å。" +"æ— æ³•æ‰¾åˆ°â€œapksignerâ€ã€‚请检查 Android SDK çš„ build-tools 目录ä¸æ˜¯å¦æœ‰æ¤å‘½ä»¤ã€‚生" +"æˆçš„ %s 未ç¾å。" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -18412,9 +18394,8 @@ msgid "Could not find keystore, unable to export." msgstr "找ä¸åˆ°å¯†é’¥åº“ï¼Œæ— æ³•å¯¼å‡ºã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "æ— æ³•å¯åŠ¨å进程ï¼" +msgstr "æ— æ³•å¯åŠ¨ apksigner å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -18445,9 +18426,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "æ— æ•ˆæ–‡ä»¶åï¼Android APK 必须有 *.apk 扩展。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "ä¸æ”¯æŒçš„å¯¼å‡ºæ ¼å¼ï¼\n" +msgstr "ä¸æ”¯æŒçš„å¯¼å‡ºæ ¼å¼ï¼" #: platform/android/export/export_plugin.cpp msgid "" @@ -18457,26 +18437,21 @@ msgstr "" "å°è¯•ä»Žè‡ªå®šä¹‰æž„建的模æ¿æž„建,但是ä¸å˜åœ¨å…¶ç‰ˆæœ¬ä¿¡æ¯ã€‚请从“项目â€èœå•ä¸é‡æ–°å®‰è£…。" #: 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 构建版本ä¸åŒ¹é…:\n" -" 安装的模æ¿ï¼š%s\n" -" Godot 版本:%s\n" -"请从“项目â€èœå•ä¸é‡æ–°å®‰è£… Android 构建模æ¿ã€‚" +"Android 构建版本ä¸åŒ¹é…:安装的模æ¿ï¼š%s,Godot 版本:%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 -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "æ— æ³•å°†é¡¹ç›®æ–‡ä»¶å¯¼å‡ºè‡³ gradle 项目\n" +msgstr "æ— æ³•å°†é¡¹ç›®æ–‡ä»¶å¯¼å‡ºè‡³ gradle 项目。" #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -18487,13 +18462,12 @@ msgid "Building Android Project (gradle)" msgstr "构建 Android 项目 (Gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Android 项目构建失败,请检查输出ä¸æ˜¾ç¤ºçš„错误。\n" -"也å¯ä»¥è®¿é—® docs.godotengine.org 查看 Android 构建文档。" +"Android 项目构建失败,请检查输出ä¸æ˜¾ç¤ºçš„错误。也å¯ä»¥è®¿é—® docs.godotengine." +"org 查看 Android 构建文档。" #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -18506,39 +18480,33 @@ msgid "" 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..." msgstr "æ£åœ¨åˆ›å»º APK……" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"找ä¸åˆ°å¯¼å‡ºæ¨¡æ¿ APK:\n" -"%s" +msgstr "找ä¸åˆ°å¯¼å‡ºæ¨¡æ¿ APK:“%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 "" -"导出模æ¿ç¼ºå¤±æ‰€é€‰æž¶æž„的库:%s。\n" -"请使用全部所需的库构建模æ¿ï¼Œæˆ–者在导出预设ä¸å–消对缺失架构的选择。" +"导出模æ¿ç¼ºå¤±æ‰€é€‰æž¶æž„的库:%s。请使用全部所需的库构建模æ¿ï¼Œæˆ–者在导出预设ä¸å–" +"消对缺失架构的选择。" #: platform/android/export/export_plugin.cpp 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..." @@ -18763,14 +18731,12 @@ msgstr "自定义背景色" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "管ç†æ¨¡æ¿" +msgstr "准备模æ¿" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "找ä¸åˆ°è‡ªå®šä¹‰å‘布模æ¿ã€‚" +msgstr "找ä¸åˆ°å¯¼å‡ºæ¨¡æ¿ã€‚" #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -18793,33 +18759,28 @@ 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 msgid "Icon Creation" -msgstr "å›¾æ ‡è¾¹è·" +msgstr "å›¾æ ‡åˆ›å»º" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "æ— æ³•è¯»å–文件:" +msgstr "æ— æ³•è¯»å–文件:“%sâ€ã€‚" #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp msgid "Variant" @@ -18890,19 +18851,16 @@ msgid "Icon 512 X 512" msgstr "å›¾æ ‡ 512×512" #: 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 msgid "Error starting HTTP server: %d." -msgstr "å¯åŠ¨ HTTP æœåŠ¡å™¨æ—¶å‡ºé”™ï¼š" +msgstr "å¯åŠ¨ HTTP æœåŠ¡å™¨æ—¶å‡ºé”™ï¼š%d。" #: platform/javascript/export/export.cpp msgid "Web" @@ -19166,30 +19124,26 @@ msgid "Apple Team ID" msgstr "Apple 团队 ID" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "æ— æ³•å¯¼å‡ºé¡¹ç›®æ–‡ä»¶" +msgstr "æ— æ³•æ‰“å¼€å›¾æ ‡æ–‡ä»¶â€œ%sâ€ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "æ— æ³•å¯åŠ¨å进程ï¼" +msgstr "æ— æ³•å¯åŠ¨ xcrun å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "å…¬è¯" +msgstr "å…¬è¯å¤±è´¥ã€‚" #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" -msgstr "" +msgstr "å…¬è¯è¯·æ±‚ UUID:“%sâ€" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "The notarization process generally takes less than an hour. When the process " "is completed, you'll receive an email." -msgstr "注æ„:公è¯è¿‡ç¨‹é€šå¸¸å°‘于一个å°æ—¶ã€‚过程结æŸåŽï¼Œä½ 会收到一å°é‚®ä»¶ã€‚" +msgstr "å…¬è¯è¿‡ç¨‹é€šå¸¸å°‘于一个å°æ—¶ã€‚过程结æŸåŽï¼Œä½ 会收到一å°é‚®ä»¶ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -19204,75 +19158,67 @@ msgid "" msgstr "è¿è¡Œä»¥ä¸‹å‘½ä»¤å°†å…¬è¯ç¥¨è¯è£…订到导出的应用ä¸ï¼ˆå¯é€‰ï¼‰ï¼š" #: platform/osx/export/export.cpp -#, fuzzy msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" -msgstr "时间戳è¿è¡Œæ—¶çŽ¯å¢ƒä¸Ž Ad-hoc ç¾åä¸å…¼å®¹ï¼Œå°†è¢«ç¦ç”¨ï¼" +msgstr "æ·»åŠ æ—¶é—´æˆ³ä¸Ž Ad-hoc ç¾åä¸å…¼å®¹ï¼Œå·²è¢«ç¦ç”¨ï¼" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "Hardened Runtime is not compatible with ad-hoc signature, and was disabled!" -msgstr "åŠ å›ºè¿è¡Œæ—¶çŽ¯å¢ƒä¸Ž Ad-hoc ç¾åä¸å…¼å®¹ï¼Œå°†è¢«ç¦ç”¨ï¼" +msgstr "åŠ å›ºè¿è¡Œæ—¶çŽ¯å¢ƒä¸Ž Ad-hoc ç¾åä¸å…¼å®¹ï¼Œå·²è¢«ç¦ç”¨ï¼" #: platform/osx/export/export.cpp msgid "Built-in CodeSign failed with error \"%s\"." -msgstr "" +msgstr "内置 CodeSign 失败,错误为“%sâ€ã€‚" #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." -msgstr "" +msgstr "内置 CodeSign éœ€è¦ regex 模å—。" #: platform/osx/export/export.cpp msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." -msgstr "" +msgstr "æ— æ³•å¯åŠ¨ codesign å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·ç¡®ä¿å·²å®‰è£… Xcode 命令行工具。" #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." msgstr "没有找到身份。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "ä¿å˜æ–‡ä»¶æ—¶å‡ºé”™ï¼š%s" +msgstr "æ— æ³•ç¾å文件 %s。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" -msgstr "该æ“作系统上ä¸æ”¯æŒç›¸å¯¹ç¬¦å·é“¾æŽ¥ï¼Œå¯¼å‡ºçš„项目å¯èƒ½æŸåï¼" +msgstr "ä¸æ”¯æŒç›¸å¯¹ç¬¦å·é“¾æŽ¥ï¼Œå¯¼å‡ºçš„“%sâ€å¯èƒ½æŸåï¼" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "æ–¹å‘" +msgstr "DMG 创建" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "æ— æ³•å¯åŠ¨å进程ï¼" +msgstr "æ— æ³•å¯åŠ¨ hdiutil å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` 失败 - 文件已å˜åœ¨ã€‚" #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` 失败。" #: platform/osx/export/export.cpp msgid "Creating app bundle" msgstr "æ£åœ¨åˆ›å»ºåº”用æ†ç»‘包" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "æ— æ³•æ‰¾åˆ°å¯¼å‡ºçš„æ¨¡æ¿åº”用:" +msgstr "æ— æ³•æ‰¾åˆ°å¯¼å‡ºçš„æ¨¡æ¿åº”用:“%sâ€ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "导出模æ¿æ— 效:" +msgstr "å¯¼å‡ºæ ¼å¼æ— 效。" #: platform/osx/export/export.cpp msgid "" @@ -19281,11 +19227,10 @@ msgid "" msgstr "该æ“作系统上ä¸æ”¯æŒç›¸å¯¹ç¬¦å·é“¾æŽ¥ï¼Œå¯¼å‡ºçš„项目å¯èƒ½æŸåï¼" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." -msgstr "未找到请求的二进制模æ¿â€œ%sâ€ã€‚ä½ çš„æ¨¡æ¿å½’æ¡£ä¸å¯èƒ½ç¼ºå¤±è¯¥æ–‡ä»¶ã€‚" +msgstr "未找到请求的模æ¿äºŒè¿›åˆ¶æ–‡ä»¶â€œ%sâ€ã€‚ä½ çš„æ¨¡æ¿å½’æ¡£ä¸å¯èƒ½ç¼ºå¤±è¯¥æ–‡ä»¶ã€‚" #: platform/osx/export/export.cpp msgid "Making PKG" @@ -19324,14 +19269,12 @@ msgid "Sending archive for notarization" msgstr "æ£åœ¨å‘é€å½’档进行公è¯" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "投影" +msgstr "ZIP 创建" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "æ— æ³•å°†é¡¹ç›®æ–‡ä»¶å¯¼å‡ºè‡³ gradle 项目\n" +msgstr "æ— æ³•æ‰“å¼€ä½äºŽâ€œ%sâ€çš„文件进行读å–。" #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -19638,9 +19581,8 @@ msgid "Debug Algorithm" msgstr "调试算法" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "æ— æ³•ç§»é™¤ä¸´æ—¶æ–‡ä»¶ï¼š" +msgstr "é‡å‘½å临时文件“%sâ€å¤±è´¥ã€‚" #: platform/windows/export/export.cpp msgid "Identity Type" @@ -19683,74 +19625,68 @@ msgid "Trademarks" msgstr "å•†æ ‡" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "推é€é€šçŸ¥" +msgstr "资æºä¿®æ”¹" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find rcedit executable at \"%s\"." -msgstr "找ä¸åˆ°å¯†é’¥åº“ï¼Œæ— æ³•å¯¼å‡ºã€‚" +msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° rcedit å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find wine executable at \"%s\"." -msgstr "找ä¸åˆ°å¯†é’¥åº“ï¼Œæ— æ³•å¯¼å‡ºã€‚" +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)." msgstr "" -"必须在编辑器设置ä¸é…ç½® rcedit 工具(Export > Windows > Rcedit)æ‰èƒ½ä¿®æ”¹å›¾æ ‡æˆ–" -"应用信æ¯æ•°æ®ã€‚" +"æ— æ³•å¯åŠ¨ rcedit å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " +"> Rcedit)。" #: platform/windows/export/export.cpp msgid "" "rcedit failed to modify executable:\n" "%s" msgstr "" +"rcedit 修改å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" +"%s" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find signtool executable at \"%s\"." -msgstr "找ä¸åˆ°å¯†é’¥åº“ï¼Œæ— æ³•å¯¼å‡ºã€‚" +msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° signtool å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find osslsigncode executable at \"%s\"." -msgstr "找ä¸åˆ°å¯†é’¥åº“ï¼Œæ— æ³•å¯¼å‡ºã€‚" +msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° osslsigncode å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "身份类型" +msgstr "èº«ä»½ç±»åž‹æ— æ•ˆã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid timestamp server." -msgstr "åç§°æ— æ•ˆã€‚" +msgstr "时间戳æœåŠ¡å™¨æ— 效。" #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable, configure signtool path in the Editor " "Settings (Export > Windows > Signtool)." msgstr "" -"必须在编辑器设置ä¸é…ç½® rcedit 工具(Export > Windows > Rcedit)æ‰èƒ½ä¿®æ”¹å›¾æ ‡æˆ–" -"应用信æ¯æ•°æ®ã€‚" +"æ— æ³•å¯åŠ¨ signtool å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® signtool 路径(导出 > " +"Windows > Signtool)。" #: platform/windows/export/export.cpp msgid "" "Signtool failed to sign executable:\n" "%s" msgstr "" +"Signtool ç¾åå¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" +"%s" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "æ— æ³•ç§»é™¤ä¸´æ—¶æ–‡ä»¶ï¼š" +msgstr "移除临时文件“%sâ€å¤±è´¥ã€‚" #: platform/windows/export/export.cpp msgid "" @@ -19774,20 +19710,19 @@ msgstr "产å“ç‰ˆæœ¬æ— æ•ˆï¼š" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Windows å¯æ‰§è¡Œæ–‡ä»¶ä¸èƒ½ >= 4GiB。" #: platform/windows/export/export.cpp platform/x11/export/export.cpp -#, fuzzy msgid "Failed to open executable file \"%s\"." -msgstr "å¯æ‰§è¡Œæ–‡ä»¶æ— 效。" +msgstr "打开å¯æ‰§è¡Œæ–‡ä»¶â€œ%sâ€å¤±è´¥ã€‚" #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." -msgstr "" +msgstr "å¯æ‰§è¡Œæ–‡ä»¶å¤´å·²æŸå。" #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "å¯æ‰§è¡Œæ–‡ä»¶â€œpckâ€åŒºæœªæ‰¾åˆ°ã€‚" #: platform/windows/export/export.cpp msgid "Windows" @@ -19807,7 +19742,7 @@ msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." -msgstr "" +msgstr "32 ä½å¯æ‰§è¡Œæ–‡ä»¶æ— 法内嵌 >= 4 GiB çš„æ•°æ®ã€‚" #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp @@ -20684,14 +20619,12 @@ msgid "Navpoly" msgstr "导航多边形" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Enter Cost" -msgstr "底部居ä¸" +msgstr "进入消耗" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Travel Cost" -msgstr "行程" +msgstr "移动消耗" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp @@ -24162,14 +24095,12 @@ msgid "3D Physics" msgstr "3D 物ç†" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "导航" +msgstr "2D 导航" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "导航" +msgstr "3D 导航" #: scene/register_scene_types.cpp msgid "Use hiDPI" @@ -25455,14 +25386,12 @@ msgid "Visible Instance Count" msgstr "å¯è§å®žä¾‹æ•°" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "缩放:" +msgstr "é‡‡æ ·" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "é‡‡æ ·åˆ†åŒºç±»åž‹" +msgstr "分区类型" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -25477,12 +25406,10 @@ msgid "Source Group Name" msgstr "æ¥æºåˆ†ç»„å称" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Cells" msgstr "å•å…ƒæ ¼" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" msgstr "代ç†" @@ -25495,16 +25422,14 @@ msgid "Max Slope" msgstr "最大斜å¡" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "区域" +msgstr "地区" #: scene/resources/navigation_mesh.cpp msgid "Merge Size" msgstr "åˆå¹¶å¤§å°" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Edges" msgstr "边界" @@ -25517,7 +25442,6 @@ msgid "Verts Per Poly" msgstr "æ¯å¤šè¾¹å½¢é¡¶ç‚¹æ•°" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" msgstr "细节" @@ -25538,9 +25462,8 @@ msgid "Ledge Spans" msgstr "凸å°èŒƒå›´" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Walkable Low Height Spans" -msgstr "过滤å¯è¡Œèµ°ä½Žé«˜åº¦èŒƒå›´" +msgstr "å¯è¡Œèµ°ä½Žé«˜åº¦èŒƒå›´" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -25897,9 +25820,8 @@ msgid "Scenario" msgstr "场景" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "导航" +msgstr "导航地图" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" @@ -25918,24 +25840,20 @@ msgid "Default Angular Damp" msgstr "默认角度阻尼" #: scene/resources/world.cpp -#, fuzzy msgid "Default Map Up" -msgstr "默认浮点数æ¥é•¿" +msgstr "默认地图上方" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "å•å…ƒæ ¼å¤§å°" +msgstr "默认å•å…ƒæ ¼å¤§å°" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "å•å…ƒæ ¼é«˜åº¦" +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" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 898b29af95..01c72c6ee1 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -676,6 +676,11 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp +#, fuzzy +msgid "Scene Naming" +msgstr "å ´æ™¯è·¯å¾‘:" + +#: core/project_settings.cpp msgid "Search In File Extensions" msgstr "" @@ -683,20 +688,15 @@ msgstr "" msgid "Script Templates Search Path" msgstr "" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp +#: core/project_settings.cpp #, fuzzy -msgid "Version Control" +msgid "Version Control Autoload On Startup" msgstr "版本:" #: core/project_settings.cpp -msgid "Autoload On Startup" -msgstr "" - -#: core/project_settings.cpp #, fuzzy -msgid "Plugin Name" -msgstr "æ’件列表:" +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 @@ -2885,7 +2885,7 @@ msgid "Completed with errors." msgstr "複製路徑" #: editor/editor_export.cpp -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "" #: editor/editor_export.cpp @@ -4408,15 +4408,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "å ´æ™¯" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "å ´æ™¯è·¯å¾‘:" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp msgid "Interface" @@ -4544,6 +4535,11 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy +msgid "Version Control" +msgstr "版本:" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Username" msgstr "é‡æ–°å‘½å" @@ -4573,6 +4569,10 @@ msgstr "" msgid "Add a new scene." msgstr "新增軌迹" +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "å ´æ™¯" + #: editor/editor_node.cpp #, fuzzy msgid "Go to previously opened scene." diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index eb229cb9fa..be888529cc 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -689,6 +689,11 @@ msgstr "主執行引數" #: core/project_settings.cpp #, fuzzy +msgid "Scene Naming" +msgstr "å ´æ™¯è·¯å¾‘ï¼š" + +#: core/project_settings.cpp +#, fuzzy msgid "Search In File Extensions" msgstr "以副檔åæœå°‹" @@ -696,18 +701,15 @@ msgstr "以副檔åæœå°‹" msgid "Script Templates Search Path" msgstr "腳本樣æ¿æœå°‹è·¯å¾‘" -#: core/project_settings.cpp editor/editor_node.cpp -#: editor/plugins/version_control_editor_plugin.cpp -msgid "Version Control" -msgstr "版本控制" - #: core/project_settings.cpp -msgid "Autoload On Startup" +#, fuzzy +msgid "Version Control Autoload On Startup" msgstr "啟動時自動載入" #: core/project_settings.cpp -msgid "Plugin Name" -msgstr "外掛å稱" +#, fuzzy +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 @@ -2827,7 +2829,7 @@ msgstr "複製節點路徑" #: editor/editor_export.cpp #, fuzzy -msgid "Completed sucessfully." +msgid "Completed successfully." msgstr "套件安è£æˆåŠŸï¼" #: editor/editor_export.cpp @@ -4315,15 +4317,6 @@ msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "無法寫入檔案'%s',該檔案æ£è¢«ä½¿ç”¨ã€éŽ–å®šæˆ–å› æ¬Šé™ä¸è¶³ã€‚" -#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp -msgid "Scene" -msgstr "å ´æ™¯" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Scene Naming" -msgstr "å ´æ™¯è·¯å¾‘ï¼š" - #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -4454,6 +4447,10 @@ 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 #, fuzzy msgid "Username" msgstr "é‡æ–°å‘½å" @@ -4482,6 +4479,10 @@ msgstr "切æ›ï¼å–消專注模å¼ã€‚" 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 "è·³è‡³ä¸Šä¸€å€‹é–‹å•Ÿçš„å ´æ™¯ã€‚" diff --git a/misc/scripts/codespell.sh b/misc/scripts/codespell.sh index f99c5d22b2..f99c5d22b2 100644..100755 --- a/misc/scripts/codespell.sh +++ b/misc/scripts/codespell.sh diff --git a/modules/csg/csg.h b/modules/csg/csg.h index 53a9e5d722..738e3d68ea 100644 --- a/modules/csg/csg.h +++ b/modules/csg/csg.h @@ -130,9 +130,9 @@ struct CSGBrushOperation { struct VertexKeyHash { static _FORCE_INLINE_ uint32_t hash(const VertexKey &p_vk) { - uint32_t h = hash_djb2_one_32(p_vk.x); - h = hash_djb2_one_32(p_vk.y, h); - h = hash_djb2_one_32(p_vk.z, h); + uint32_t h = hash_murmur3_one_32(p_vk.x); + h = hash_murmur3_one_32(p_vk.y, h); + h = hash_murmur3_one_32(p_vk.z, h); return h; } }; diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h index 0eaf5c3727..0b49dc4609 100644 --- a/modules/csg/csg_shape.h +++ b/modules/csg/csg_shape.h @@ -74,9 +74,9 @@ private: struct Vector3Hasher { _ALWAYS_INLINE_ uint32_t hash(const Vector3 &p_vec3) const { - uint32_t h = hash_djb2_one_float(p_vec3.x); - h = hash_djb2_one_float(p_vec3.y, h); - h = hash_djb2_one_float(p_vec3.z, h); + uint32_t h = hash_murmur3_one_float(p_vec3.x); + h = hash_murmur3_one_float(p_vec3.y, h); + h = hash_murmur3_one_float(p_vec3.z, h); return h; } }; diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 64258ee8d3..617db883f8 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -62,7 +62,7 @@ GDScriptNativeClass::GDScriptNativeClass(const StringName &p_name) { bool GDScriptNativeClass::_get(const StringName &p_name, Variant &r_ret) const { bool ok; - int v = ClassDB::get_integer_constant(name, p_name, &ok); + int64_t v = ClassDB::get_integer_constant(name, p_name, &ok); if (ok) { r_ret = v; diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index 80f187a375..0057962d5e 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -368,7 +368,7 @@ public: if (_debug_call_stack_pos >= _debug_max_call_stack) { //stack overflow - _debug_error = "Stack Overflow (Stack Size: " + itos(_debug_max_call_stack) + ")"; + _debug_error = vformat("Stack overflow (stack size: %s). Check for infinite recursion in your script.", _debug_max_call_stack); EngineDebugger::get_script_debugger()->debug(this); return; } diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index a070d319f3..42b02ce3b9 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -2900,7 +2900,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod return; } bool valid = false; - int int_constant = ClassDB::get_integer_constant(native, name, &valid); + int64_t int_constant = ClassDB::get_integer_constant(native, name, &valid); if (valid) { p_identifier->is_constant = true; p_identifier->reduced_value = int_constant; diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index b2cce9d8ee..25454030b1 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -312,7 +312,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code // Class C++ integer constant. if (nc) { bool success = false; - int constant = ClassDB::get_integer_constant(nc->get_name(), identifier, &success); + int64_t constant = ClassDB::get_integer_constant(nc->get_name(), identifier, &success); if (success) { return codegen.add_constant(constant); } diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 202d1dcdf4..5345143271 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -738,7 +738,7 @@ static void _get_directory_contents(EditorFileSystemDirectory *p_dir, HashMap<St static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_annotation, int p_argument, const String p_quote_style, HashMap<String, ScriptLanguage::CodeCompletionOption> &r_result) { if (p_annotation->name == SNAME("@export_range")) { - if (p_argument == 3 || p_argument == 4) { + if (p_argument == 3 || p_argument == 4 || p_argument == 5) { // Slider hint. ScriptLanguage::CodeCompletionOption slider1("or_greater", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); slider1.insert_text = slider1.display.quote(p_quote_style); @@ -746,6 +746,9 @@ static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_a ScriptLanguage::CodeCompletionOption slider2("or_lesser", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); slider2.insert_text = slider2.display.quote(p_quote_style); r_result.insert(slider2.display, slider2); + ScriptLanguage::CodeCompletionOption slider3("noslider", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); + slider3.insert_text = slider3.display.quote(p_quote_style); + r_result.insert(slider3.display, slider3); } } else if (p_annotation->name == SNAME("@export_exp_easing")) { if (p_argument == 0 || p_argument == 1) { diff --git a/modules/gdscript/gdscript_lambda_callable.cpp b/modules/gdscript/gdscript_lambda_callable.cpp index c43fa12c8c..a25bf9a306 100644 --- a/modules/gdscript/gdscript_lambda_callable.cpp +++ b/modules/gdscript/gdscript_lambda_callable.cpp @@ -91,7 +91,7 @@ GDScriptLambdaCallable::GDScriptLambdaCallable(Ref<GDScript> p_script, GDScriptF function = p_function; captures = p_captures; - h = (uint32_t)hash_djb2_one_64((uint64_t)this); + h = (uint32_t)hash_murmur3_one_64((uint64_t)this); } bool GDScriptLambdaSelfCallable::compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) { @@ -161,7 +161,7 @@ GDScriptLambdaSelfCallable::GDScriptLambdaSelfCallable(Ref<RefCounted> p_self, G function = p_function; captures = p_captures; - h = (uint32_t)hash_djb2_one_64((uint64_t)this); + h = (uint32_t)hash_murmur3_one_64((uint64_t)this); } GDScriptLambdaSelfCallable::GDScriptLambdaSelfCallable(Object *p_self, GDScriptFunction *p_function, const Vector<Variant> &p_captures) { @@ -169,5 +169,5 @@ GDScriptLambdaSelfCallable::GDScriptLambdaSelfCallable(Object *p_self, GDScriptF function = p_function; captures = p_captures; - h = (uint32_t)hash_djb2_one_64((uint64_t)this); + h = (uint32_t)hash_murmur3_one_64((uint64_t)this); } diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index bc225850c9..5abbf907c7 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -120,7 +120,7 @@ GDScriptParser::GDScriptParser() { register_annotation(MethodInfo("@export_global_dir"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_GLOBAL_DIR, Variant::STRING>); register_annotation(MethodInfo("@export_multiline"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_MULTILINE_TEXT, Variant::STRING>); register_annotation(MethodInfo("@export_placeholder"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_PLACEHOLDER_TEXT, Variant::STRING>); - register_annotation(MethodInfo("@export_range", { Variant::FLOAT, "min" }, { Variant::FLOAT, "max" }, { Variant::FLOAT, "step" }, { Variant::STRING, "slider1" }, { Variant::STRING, "slider2" }), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_RANGE, Variant::FLOAT>, 3); + register_annotation(MethodInfo("@export_range", { Variant::FLOAT, "min" }, { Variant::FLOAT, "max" }, { Variant::FLOAT, "step" }, { Variant::STRING, "slider1" }, { Variant::STRING, "slider2" }, { Variant::STRING, "slider3" }), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_RANGE, Variant::FLOAT>, 4); register_annotation(MethodInfo("@export_exp_easing", { Variant::STRING, "hint1" }, { Variant::STRING, "hint2" }), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_EXP_EASING, Variant::FLOAT>, 2); register_annotation(MethodInfo("@export_color_no_alpha"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_COLOR_NO_ALPHA, Variant::COLOR>); register_annotation(MethodInfo("@export_node_path", { Variant::STRING, "type" }), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_NODE_PATH_VALID_TYPES, Variant::NODE_PATH>, 1, true); diff --git a/modules/gdscript/gdscript_rpc_callable.cpp b/modules/gdscript/gdscript_rpc_callable.cpp index 07ef5aefcb..63ebd8acf5 100644 --- a/modules/gdscript/gdscript_rpc_callable.cpp +++ b/modules/gdscript/gdscript_rpc_callable.cpp @@ -71,7 +71,7 @@ GDScriptRPCCallable::GDScriptRPCCallable(Object *p_object, const StringName &p_m object = p_object; method = p_method; h = method.hash(); - h = hash_djb2_one_64(object->get_instance_id(), h); + h = hash_murmur3_one_64(object->get_instance_id(), h); node = Object::cast_to<Node>(object); ERR_FAIL_COND_MSG(!node, "RPC can only be defined on class that extends Node."); } diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index 407ce961c8..499f54e3ba 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -73,6 +73,13 @@ Returns an array of [Transform3D] and [Mesh] references corresponding to the non-empty cells in the grid. The transforms are specified in world space. </description> </method> + <method name="get_navigation_layer_value" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="layer_number" type="int" /> + <description> + 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_used_cells" qualifiers="const"> <return type="Array" /> <description> @@ -133,6 +140,14 @@ Based on [code]value[/code], enables or disables the specified layer in the [member collision_mask], given a [code]layer_number[/code] between 1 and 32. </description> </method> + <method name="set_navigation_layer_value"> + <return type="void" /> + <argument index="0" name="layer_number" type="int" /> + <argument index="1" name="value" type="bool" /> + <description> + 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="world_to_map" qualifiers="const"> <return type="Vector3i" /> <argument index="0" name="world_position" type="Vector3" /> @@ -177,7 +192,7 @@ The assigned [MeshLibrary]. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> - The navigation layers the GridMap generates its navigable regions in. + A bitmask determining all navigation layers the GridMap generated navigation regions belong to. These navigation layers can be checked upon when requesting a path with [method NavigationServer3D.map_get_path]. </member> <member name="physics_material" type="PhysicsMaterial" setter="set_physics_material" getter="get_physics_material"> Overrides the default friction and bounce physics properties for the whole [GridMap]. diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 0e34b5907e..7d80cbef7c 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -231,10 +231,28 @@ void GridMap::set_navigation_layers(uint32_t p_navigation_layers) { _recreate_octant_data(); } -uint32_t GridMap::get_navigation_layers() { +uint32_t GridMap::get_navigation_layers() const { return navigation_layers; } +void GridMap::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool GridMap::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) { if (!mesh_library.is_null()) { mesh_library->unregister_owner(this); @@ -885,6 +903,9 @@ void GridMap::_bind_methods() { 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); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &GridMap::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &GridMap::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("set_mesh_library", "mesh_library"), &GridMap::set_mesh_library); ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library); diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index 08ed4d3d12..078a1d9de5 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -239,7 +239,10 @@ public: bool is_baking_navigation(); void set_navigation_layers(uint32_t p_navigation_layers); - uint32_t get_navigation_layers(); + uint32_t get_navigation_layers() const; + + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library); Ref<MeshLibrary> get_mesh_library() const; diff --git a/modules/lightmapper_rd/lightmapper_rd.h b/modules/lightmapper_rd/lightmapper_rd.h index 503f5f7009..bf9f9b5954 100644 --- a/modules/lightmapper_rd/lightmapper_rd.h +++ b/modules/lightmapper_rd/lightmapper_rd.h @@ -110,12 +110,12 @@ class LightmapperRD : public Lightmapper { struct EdgeHash { _FORCE_INLINE_ static uint32_t hash(const Edge &p_edge) { - uint32_t h = hash_djb2_one_float(p_edge.a.x); - h = hash_djb2_one_float(p_edge.a.y, h); - h = hash_djb2_one_float(p_edge.a.z, h); - h = hash_djb2_one_float(p_edge.b.x, h); - h = hash_djb2_one_float(p_edge.b.y, h); - h = hash_djb2_one_float(p_edge.b.z, h); + uint32_t h = hash_murmur3_one_float(p_edge.a.x); + h = hash_murmur3_one_float(p_edge.a.y, h); + h = hash_murmur3_one_float(p_edge.a.z, h); + h = hash_murmur3_one_float(p_edge.b.x, h); + h = hash_murmur3_one_float(p_edge.b.y, h); + h = hash_murmur3_one_float(p_edge.b.z, h); return h; } }; @@ -146,15 +146,15 @@ class LightmapperRD : public Lightmapper { struct VertexHash { _FORCE_INLINE_ static uint32_t hash(const Vertex &p_vtx) { - uint32_t h = hash_djb2_one_float(p_vtx.position[0]); - h = hash_djb2_one_float(p_vtx.position[1], h); - h = hash_djb2_one_float(p_vtx.position[2], h); - h = hash_djb2_one_float(p_vtx.uv[0], h); - h = hash_djb2_one_float(p_vtx.uv[1], h); - h = hash_djb2_one_float(p_vtx.normal_xy[0], h); - h = hash_djb2_one_float(p_vtx.normal_xy[1], h); - h = hash_djb2_one_float(p_vtx.normal_z, h); - return h; + uint32_t h = hash_murmur3_one_float(p_vtx.position[0]); + h = hash_murmur3_one_float(p_vtx.position[1], h); + h = hash_murmur3_one_float(p_vtx.position[2], h); + h = hash_murmur3_one_float(p_vtx.uv[0], h); + h = hash_murmur3_one_float(p_vtx.uv[1], h); + h = hash_murmur3_one_float(p_vtx.normal_xy[0], h); + h = hash_murmur3_one_float(p_vtx.normal_xy[1], h); + h = hash_murmur3_one_float(p_vtx.normal_z, h); + return hash_fmix32(h); } }; diff --git a/modules/mono/class_db_api_json.cpp b/modules/mono/class_db_api_json.cpp index 3afde1e8d3..c4547b4323 100644 --- a/modules/mono/class_db_api_json.cpp +++ b/modules/mono/class_db_api_json.cpp @@ -124,7 +124,7 @@ void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api) { List<StringName> snames; - for (const KeyValue<StringName, int> &F : t->constant_map) { + for (const KeyValue<StringName, int64_t> &F : t->constant_map) { snames.push_back(F.key); } diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 960d2fe27c..9d3d481068 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -954,7 +954,7 @@ void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) { } } - p_output.append(MEMBER_BEGIN "public const int "); + p_output.append(MEMBER_BEGIN "public const long "); p_output.append(iconstant.proxy_name); p_output.append(" = "); p_output.append(itos(iconstant.value)); @@ -992,6 +992,7 @@ void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) { p_output.append("\n" INDENT1 "public enum "); p_output.append(enum_proxy_name); + p_output.append(" : long"); p_output.append("\n" INDENT1 OPEN_BLOCK); const ConstantInterface &last = ienum.constants.back()->get(); @@ -1417,7 +1418,7 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str } } - output.append(MEMBER_BEGIN "public const int "); + output.append(MEMBER_BEGIN "public const long "); output.append(iconstant.proxy_name); output.append(" = "); output.append(itos(iconstant.value)); @@ -1435,6 +1436,7 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str output.append(MEMBER_BEGIN "public enum "); output.append(ienum.cname.operator String()); + output.append(" : long"); output.append(MEMBER_BEGIN OPEN_BLOCK); const ConstantInterface &last = ienum.constants.back()->get(); @@ -3088,7 +3090,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() { const List<StringName> &enum_constants = E.value; for (const StringName &constant_cname : enum_constants) { String constant_name = constant_cname.operator String(); - int *value = class_info->constant_map.getptr(constant_cname); + int64_t *value = class_info->constant_map.getptr(constant_cname); ERR_FAIL_NULL_V(value, false); constants.erase(constant_name); @@ -3123,7 +3125,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() { } for (const String &constant_name : constants) { - int *value = class_info->constant_map.getptr(StringName(constant_name)); + int64_t *value = class_info->constant_map.getptr(StringName(constant_name)); ERR_FAIL_NULL_V(value, false); ConstantInterface iconstant(constant_name, snake_to_pascal_case(constant_name, true), *value); @@ -3666,7 +3668,7 @@ void BindingsGenerator::_populate_global_constants() { } } - int constant_value = CoreConstants::get_global_constant_value(i); + int64_t constant_value = CoreConstants::get_global_constant_value(i); StringName enum_name = CoreConstants::get_global_constant_enum(i); ConstantInterface iconstant(constant_name, snake_to_pascal_case(constant_name, true), constant_value); diff --git a/modules/mono/editor/bindings_generator.h b/modules/mono/editor/bindings_generator.h index f0ba2b18e4..70c4f12146 100644 --- a/modules/mono/editor/bindings_generator.h +++ b/modules/mono/editor/bindings_generator.h @@ -45,12 +45,12 @@ class BindingsGenerator { struct ConstantInterface { String name; String proxy_name; - int value = 0; + int64_t value = 0; const DocData::ConstantDoc *const_doc; ConstantInterface() {} - ConstantInterface(const String &p_name, const String &p_proxy_name, int p_value) { + ConstantInterface(const String &p_name, const String &p_proxy_name, int64_t p_value) { name = p_name; proxy_name = p_proxy_name; value = p_value; diff --git a/modules/mono/managed_callable.cpp b/modules/mono/managed_callable.cpp index 4f7783b765..c159bb9eea 100644 --- a/modules/mono/managed_callable.cpp +++ b/modules/mono/managed_callable.cpp @@ -66,9 +66,8 @@ bool ManagedCallable::compare_less(const CallableCustom *p_a, const CallableCust } uint32_t ManagedCallable::hash() const { - // hmm uint32_t hash = delegate_invoke->get_name().hash(); - return hash_djb2_one_64(delegate_handle.handle, hash); + return hash_murmur3_one_64(delegate_handle.handle, hash); } String ManagedCallable::get_as_text() const { diff --git a/modules/mono/signal_awaiter_utils.cpp b/modules/mono/signal_awaiter_utils.cpp index 315a9c29f6..618e1b58e0 100644 --- a/modules/mono/signal_awaiter_utils.cpp +++ b/modules/mono/signal_awaiter_utils.cpp @@ -63,7 +63,7 @@ bool SignalAwaiterCallable::compare_less(const CallableCustom *p_a, const Callab uint32_t SignalAwaiterCallable::hash() const { uint32_t hash = signal.hash(); - return hash_djb2_one_64(target_id, hash); + return hash_murmur3_one_64(target_id, hash); } String SignalAwaiterCallable::get_as_text() const { @@ -164,7 +164,7 @@ bool EventSignalCallable::compare_less(const CallableCustom *p_a, const Callable uint32_t EventSignalCallable::hash() const { uint32_t hash = event_signal->field->get_name().hash(); - return hash_djb2_one_64(owner->get_instance_id(), hash); + return hash_murmur3_one_64(owner->get_instance_id(), hash); } String EventSignalCallable::get_as_text() const { diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp index e6975611d2..64b68b70af 100644 --- a/modules/mono/utils/string_utils.cpp +++ b/modules/mono/utils/string_utils.cpp @@ -145,7 +145,7 @@ bool is_csharp_keyword(const String &p_name) { p_name == "do" || p_name == "double" || p_name == "else" || p_name == "enum" || p_name == "event" || p_name == "explicit" || p_name == "extern" || p_name == "false" || p_name == "finally" || p_name == "fixed" || p_name == "float" || p_name == "for" || - p_name == "forech" || p_name == "goto" || p_name == "if" || p_name == "implicit" || + p_name == "foreach" || p_name == "goto" || p_name == "if" || p_name == "implicit" || p_name == "in" || p_name == "int" || p_name == "interface" || p_name == "internal" || p_name == "is" || p_name == "lock" || p_name == "long" || p_name == "namespace" || p_name == "new" || p_name == "null" || p_name == "object" || p_name == "operator" || diff --git a/modules/openxr/SCsub b/modules/openxr/SCsub index ff320236a7..8783e061d2 100644 --- a/modules/openxr/SCsub +++ b/modules/openxr/SCsub @@ -81,6 +81,8 @@ if env["platform"] == "android": if env["vulkan"]: env_openxr.add_source_files(module_obj, "extensions/openxr_vulkan_extension.cpp") +env_openxr.add_source_files(module_obj, "extensions/openxr_htc_vive_tracker_extension.cpp") + env.modules_sources += module_obj if env["tools"]: diff --git a/modules/openxr/action_map/openxr_action_map.cpp b/modules/openxr/action_map/openxr_action_map.cpp index 366e131369..0eb5302442 100644 --- a/modules/openxr/action_map/openxr_action_map.cpp +++ b/modules/openxr/action_map/openxr_action_map.cpp @@ -182,10 +182,40 @@ void OpenXRActionMap::create_default_action_sets() { Ref<OpenXRAction> ax_touch = action_set->add_new_action("ax_touch", "A/X touching", OpenXRAction::OPENXR_ACTION_BOOL, "/user/hand/left,/user/hand/right"); Ref<OpenXRAction> by_button = action_set->add_new_action("by_button", "B/Y button", OpenXRAction::OPENXR_ACTION_BOOL, "/user/hand/left,/user/hand/right"); Ref<OpenXRAction> by_touch = action_set->add_new_action("by_touch", "B/Y touching", OpenXRAction::OPENXR_ACTION_BOOL, "/user/hand/left,/user/hand/right"); - Ref<OpenXRAction> default_pose = action_set->add_new_action("default_pose", "Default pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); + Ref<OpenXRAction> default_pose = action_set->add_new_action("default_pose", "Default pose", OpenXRAction::OPENXR_ACTION_POSE, + "/user/hand/left," + "/user/hand/right," + // "/user/vive_tracker_htcx/role/handheld_object," <-- getting errors on this one + "/user/vive_tracker_htcx/role/left_foot," + "/user/vive_tracker_htcx/role/right_foot," + "/user/vive_tracker_htcx/role/left_shoulder," + "/user/vive_tracker_htcx/role/right_shoulder," + "/user/vive_tracker_htcx/role/left_elbow," + "/user/vive_tracker_htcx/role/right_elbow," + "/user/vive_tracker_htcx/role/left_knee," + "/user/vive_tracker_htcx/role/right_knee," + "/user/vive_tracker_htcx/role/waist," + "/user/vive_tracker_htcx/role/chest," + "/user/vive_tracker_htcx/role/camera," + "/user/vive_tracker_htcx/role/keyboard"); Ref<OpenXRAction> aim_pose = action_set->add_new_action("aim_pose", "Aim pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); Ref<OpenXRAction> grip_pose = action_set->add_new_action("grip_pose", "Grip pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); - Ref<OpenXRAction> haptic = action_set->add_new_action("haptic", "Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC, "/user/hand/left,/user/hand/right"); + Ref<OpenXRAction> haptic = action_set->add_new_action("haptic", "Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC, + "/user/hand/left," + "/user/hand/right," + // "/user/vive_tracker_htcx/role/handheld_object," <-- getting errors on this one + "/user/vive_tracker_htcx/role/left_foot," + "/user/vive_tracker_htcx/role/right_foot," + "/user/vive_tracker_htcx/role/left_shoulder," + "/user/vive_tracker_htcx/role/right_shoulder," + "/user/vive_tracker_htcx/role/left_elbow," + "/user/vive_tracker_htcx/role/right_elbow," + "/user/vive_tracker_htcx/role/left_knee," + "/user/vive_tracker_htcx/role/right_knee," + "/user/vive_tracker_htcx/role/waist," + "/user/vive_tracker_htcx/role/chest," + "/user/vive_tracker_htcx/role/camera," + "/user/vive_tracker_htcx/role/keyboard"); // Create our interaction profiles Ref<OpenXRInteractionProfile> profile = OpenXRInteractionProfile::new_profile("/interaction_profiles/khr/simple_controller"); @@ -399,6 +429,37 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(primary_click, "/user/hand/left/input/trackpad/click,/user/hand/right/input/trackpad/click"); profile->add_new_binding(primary_touch, "/user/hand/left/input/trackpad/touch,/user/hand/right/input/trackpad/touch"); profile->add_new_binding(haptic, "/user/hand/left/output/haptic,/user/hand/right/output/haptic"); + + // Create our HTC Vive tracker profile + profile = OpenXRInteractionProfile::new_profile("/interaction_profiles/htc/vive_tracker_htcx"); + profile->add_new_binding(default_pose, + // "/user/vive_tracker_htcx/role/handheld_object/input/grip/pose," <-- getting errors on this one + "/user/vive_tracker_htcx/role/left_foot/input/grip/pose," + "/user/vive_tracker_htcx/role/right_foot/input/grip/pose," + "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose," + "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose," + "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose," + "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose," + "/user/vive_tracker_htcx/role/left_knee/input/grip/pose," + "/user/vive_tracker_htcx/role/right_knee/input/grip/pose," + "/user/vive_tracker_htcx/role/waist/input/grip/pose," + "/user/vive_tracker_htcx/role/chest/input/grip/pose," + "/user/vive_tracker_htcx/role/camera/input/grip/pose," + "/user/vive_tracker_htcx/role/keyboard/input/grip/pose"); + profile->add_new_binding(haptic, + // "/user/vive_tracker_htcx/role/handheld_object/output/haptic," <-- getting errors on this one + "/user/vive_tracker_htcx/role/left_foot/output/haptic," + "/user/vive_tracker_htcx/role/right_foot/output/haptic," + "/user/vive_tracker_htcx/role/left_shoulder/output/haptic," + "/user/vive_tracker_htcx/role/right_shoulder/output/haptic," + "/user/vive_tracker_htcx/role/left_elbow/output/haptic," + "/user/vive_tracker_htcx/role/right_elbow/output/haptic," + "/user/vive_tracker_htcx/role/left_knee/output/haptic," + "/user/vive_tracker_htcx/role/right_knee/output/haptic," + "/user/vive_tracker_htcx/role/waist/output/haptic," + "/user/vive_tracker_htcx/role/chest/output/haptic," + "/user/vive_tracker_htcx/role/camera/output/haptic," + "/user/vive_tracker_htcx/role/keyboard/output/haptic"); add_interaction_profile(profile); } diff --git a/modules/openxr/action_map/openxr_defs.cpp b/modules/openxr/action_map/openxr_defs.cpp index e10326449c..89860199be 100644 --- a/modules/openxr/action_map/openxr_defs.cpp +++ b/modules/openxr/action_map/openxr_defs.cpp @@ -32,8 +32,28 @@ // Our top level paths to which devices can be bound OpenXRDefs::TopLevelPath OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_TOP_LEVEL_PATH_MAX] = { + // Core OpenXR paths { "Left hand controller", "/user/hand/left" }, { "Right hand controller", "/user/hand/right" }, + { "Head", "/user/head" }, + { "Gamepad", "/user/gamepad" }, + { "Treadmill", "/user/treadmill" }, + + // Specific to HTC tracker extension + // { "Handheld object tracker", "/user/vive_tracker_htcx/role/handheld_object" }, + { "Left foot tracker", "/user/vive_tracker_htcx/role/left_foot" }, + { "Right foot tracker", "/user/vive_tracker_htcx/role/right_foot" }, + { "Left shoulder tracker", "/user/vive_tracker_htcx/role/left_shoulder" }, + { "Right shoulder tracker", "/user/vive_tracker_htcx/role/right_shoulder" }, + { "Left elbow tracker", "/user/vive_tracker_htcx/role/left_elbow" }, + { "Right elbow tracker", "/user/vive_tracker_htcx/role/right_elbow" }, + { "Left knee tracker", "/user/vive_tracker_htcx/role/left_knee" }, + { "Right knee tracker", "/user/vive_tracker_htcx/role/right_knee" }, + { "Waist tracker", "/user/vive_tracker_htcx/role/waist" }, + { "Chest tracker", "/user/vive_tracker_htcx/role/chest" }, + { "Camera tracker", "/user/vive_tracker_htcx/role/camera" }, + { "Keyboard tracker", "/user/vive_tracker_htcx/role/keyboard" }, + }; // Fallback Khronos simple controller @@ -378,6 +398,137 @@ OpenXRDefs::IOPath OpenXRDefs::huawei_controller_paths[] = { { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, }; +// HTC Vive tracker +// Interestingly enough trackers don't have buttons or inputs, yet these are defined in the spec. +// I think this can be supported through attachments on the trackers. +OpenXRDefs::IOPath OpenXRDefs::vive_tracker_controller_paths[] = { + // { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, + + // { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, + + // { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, + + // { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, + + // { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, + + // { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, + + // { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, + + // { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, + + // { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, + { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, +}; + OpenXRDefs::InteractionProfile OpenXRDefs::available_interaction_profiles[] = { { "Simple controller", // display_name @@ -439,6 +590,13 @@ OpenXRDefs::InteractionProfile OpenXRDefs::available_interaction_profiles[] = { huawei_controller_paths, // io_paths sizeof(huawei_controller_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count }, + + { + "HTC Vive tracker", // display_name + "/interaction_profiles/htc/vive_tracker_htcx", // openxr_path + vive_tracker_controller_paths, // io_paths + sizeof(vive_tracker_controller_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count + }, }; int OpenXRDefs::available_interaction_profile_count = sizeof(OpenXRDefs::available_interaction_profiles) / sizeof(OpenXRDefs::InteractionProfile); diff --git a/modules/openxr/action_map/openxr_defs.h b/modules/openxr/action_map/openxr_defs.h index dbda4757f1..9bdd9a6ded 100644 --- a/modules/openxr/action_map/openxr_defs.h +++ b/modules/openxr/action_map/openxr_defs.h @@ -51,8 +51,28 @@ class OpenXRDefs { public: enum TOP_LEVEL_PATH { + // Core OpenXR toplevel paths OPENXR_LEFT_HAND, OPENXR_RIGHT_HAND, + OPENXR_HEAD, + OPENXR_GAMEPAD, + OPENXR_TREADMILL, + + // HTC tracker extension toplevel paths + // OPENXR_HTC_HANDHELD_TRACKER, + OPENXR_HTC_LEFT_FOOT_TRACKER, + OPENXR_HTC_RIGHT_FOOT_TRACKER, + OPENXR_HTC_LEFT_SHOULDER_TRACKER, + OPENXR_HTC_RIGHT_SHOULDER_TRACKER, + OPENXR_HTC_LEFT_ELBOW_TRACKER, + OPENXR_HTC_RIGHT_ELBOW_TRACKER, + OPENXR_HTC_LEFT_KNEE_TRACKER, + OPENXR_HTC_RIGHT_KNEE_TRACKER, + OPENXR_HTC_WAIST_TRACKER, + OPENXR_HTC_CHEST_TRACKER, + OPENXR_HTC_CAMERA_TRACKER, + OPENXR_HTC_KEYBOARD_TRACKER, + OPENXR_TOP_LEVEL_PATH_MAX }; @@ -89,6 +109,7 @@ private: static IOPath vive_cosmos_paths[]; static IOPath vive_focus3_paths[]; static IOPath huawei_controller_paths[]; + static IOPath vive_tracker_controller_paths[]; static InteractionProfile available_interaction_profiles[]; static int available_interaction_profile_count; diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp new file mode 100644 index 0000000000..302acf4e30 --- /dev/null +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp @@ -0,0 +1,67 @@ +/*************************************************************************/ +/* openxr_htc_vive_tracker_extension.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 "openxr_htc_vive_tracker_extension.h" +#include "core/string/print_string.h" + +OpenXRHTCViveTrackerExtension *OpenXRHTCViveTrackerExtension::singleton = nullptr; + +OpenXRHTCViveTrackerExtension *OpenXRHTCViveTrackerExtension::get_singleton() { + return singleton; +} + +OpenXRHTCViveTrackerExtension::OpenXRHTCViveTrackerExtension(OpenXRAPI *p_openxr_api) : + OpenXRExtensionWrapper(p_openxr_api) { + singleton = this; + + request_extensions[XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME] = &available; +} + +OpenXRHTCViveTrackerExtension::~OpenXRHTCViveTrackerExtension() { + singleton = nullptr; +} + +bool OpenXRHTCViveTrackerExtension::is_available() { + return available; +} + +bool OpenXRHTCViveTrackerExtension::on_event_polled(const XrEventDataBuffer &event) { + switch (event.type) { + case XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX: { + // Investigate if we need to do more here + print_verbose("OpenXR EVENT: VIVE tracker connected"); + + return true; + } break; + default: { + return false; + } break; + } +} diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h new file mode 100644 index 0000000000..7670bc074b --- /dev/null +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* openxr_htc_vive_tracker_extension.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 OPENXR_HTC_VIVE_TRACKER_EXTENSION_H +#define OPENXR_HTC_VIVE_TRACKER_EXTENSION_H + +#include "openxr_extension_wrapper.h" + +class OpenXRHTCViveTrackerExtension : public OpenXRExtensionWrapper { +public: + static OpenXRHTCViveTrackerExtension *get_singleton(); + + OpenXRHTCViveTrackerExtension(OpenXRAPI *p_openxr_api); + virtual ~OpenXRHTCViveTrackerExtension() override; + + bool is_available(); + virtual bool on_event_polled(const XrEventDataBuffer &event) override; + +private: + static OpenXRHTCViveTrackerExtension *singleton; + + bool available = false; +}; + +#endif // !OPENXR_HTC_VIVE_TRACKER_EXTENSION_H diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index d8d3bacb19..5e35942012 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -48,7 +48,9 @@ #include "extensions/openxr_vulkan_extension.h" #endif -#include "openxr_interface.h" +#include "extensions/openxr_htc_vive_tracker_extension.h" + +#include "modules/openxr/openxr_interface.h" OpenXRAPI *OpenXRAPI::singleton = nullptr; @@ -1644,6 +1646,9 @@ OpenXRAPI::OpenXRAPI() { // our android wrapper will initialize our android loader at this point register_extension_wrapper(memnew(OpenXRAndroidExtension(this))); #endif + + // register our other extensions + register_extension_wrapper(memnew(OpenXRHTCViveTrackerExtension(this))); } OpenXRAPI::~OpenXRAPI() { diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index ab06583932..9dfa005600 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -57,7 +57,24 @@ PackedStringArray OpenXRInterface::get_suggested_tracker_names() const { PackedStringArray arr = { "left_hand", // /user/hand/left is mapped to our defaults "right_hand", // /user/hand/right is mapped to our defaults - "/user/treadmill" + "/user/treadmill", + + // Even though these are only available if you have the tracker extension, + // we add these as we may be deploying on a different platform than our + // editor is running on. + "/user/vive_tracker_htcx/role/handheld_object", + "/user/vive_tracker_htcx/role/left_foot", + "/user/vive_tracker_htcx/role/right_foot", + "/user/vive_tracker_htcx/role/left_shoulder", + "/user/vive_tracker_htcx/role/right_shoulder", + "/user/vive_tracker_htcx/role/left_elbow", + "/user/vive_tracker_htcx/role/right_elbow", + "/user/vive_tracker_htcx/role/left_knee", + "/user/vive_tracker_htcx/role/right_knee", + "/user/vive_tracker_htcx/role/waist", + "/user/vive_tracker_htcx/role/chest", + "/user/vive_tracker_htcx/role/camera", + "/user/vive_tracker_htcx/role/keyboard" }; return arr; diff --git a/modules/raycast/raycast_occlusion_cull.h b/modules/raycast/raycast_occlusion_cull.h index 4474031991..6562c4e9c4 100644 --- a/modules/raycast/raycast_occlusion_cull.h +++ b/modules/raycast/raycast_occlusion_cull.h @@ -87,8 +87,8 @@ private: RID instance; static uint32_t hash(const InstanceID &p_ins) { - uint32_t h = hash_djb2_one_64(p_ins.scenario.get_id()); - return hash_djb2_one_64(p_ins.instance.get_id(), h); + uint32_t h = hash_murmur3_one_64(p_ins.scenario.get_id()); + return hash_fmix32(hash_murmur3_one_64(p_ins.instance.get_id(), h)); } bool operator==(const InstanceID &rhs) const { return instance == rhs.instance && rhs.scenario == scenario; diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index 30b64d0a7b..c4fafb6676 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -1582,7 +1582,7 @@ Variant VisualScriptInstance::_call_internal(const StringName &p_method, void *p if (!found) { r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; - error_str = RTR("Found sequence bit but not the node in the stack, report bug!"); + error_str = RTR("Found sequence bit but not the node in the stack (please report)."); error = true; break; } @@ -1594,7 +1594,7 @@ Variant VisualScriptInstance::_call_internal(const StringName &p_method, void *p // Check for stack overflow. if (flow_stack_pos + 1 >= flow_max) { r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; - error_str = RTR("Stack overflow with stack depth:") + " " + itos(output); + error_str = vformat(RTR("Stack overflow (stack size: %s). Check for infinite recursion in your script."), output); error = true; break; } diff --git a/modules/visual_script/visual_script.h b/modules/visual_script/visual_script.h index 0f3b8de3fc..c2e4d0e597 100644 --- a/modules/visual_script/visual_script.h +++ b/modules/visual_script/visual_script.h @@ -522,7 +522,7 @@ public: if (_debug_call_stack_pos >= _debug_max_call_stack) { // Stack overflow. - _debug_error = "Stack Overflow (Stack Size: " + itos(_debug_max_call_stack) + ")"; + _debug_error = vformat("Stack overflow (stack size: %s). Check for infinite recursion in your script.", _debug_max_call_stack); EngineDebugger::get_script_debugger()->debug(this); return; } @@ -545,7 +545,7 @@ public: } if (_debug_call_stack_pos == 0) { - _debug_error = "Stack Underflow (Engine Bug)"; + _debug_error = "Stack underflow (engine bug), please report."; EngineDebugger::get_script_debugger()->debug(this); return; } diff --git a/platform/linuxbsd/key_mapping_x11.cpp b/platform/linuxbsd/key_mapping_x11.cpp index afe965e038..047ee74671 100644 --- a/platform/linuxbsd/key_mapping_x11.cpp +++ b/platform/linuxbsd/key_mapping_x11.cpp @@ -135,6 +135,25 @@ static _XTranslatePair _xkeysym_to_keycode[] = { { XK_F14, Key::F14 }, { XK_F15, Key::F15 }, { XK_F16, Key::F16 }, + { XK_F17, Key::F17 }, + { XK_F18, Key::F18 }, + { XK_F19, Key::F19 }, + { XK_F20, Key::F20 }, + { XK_F21, Key::F21 }, + { XK_F22, Key::F22 }, + { XK_F23, Key::F23 }, + { XK_F24, Key::F24 }, + { XK_F25, Key::F25 }, + { XK_F26, Key::F26 }, + { XK_F27, Key::F27 }, + { XK_F28, Key::F28 }, + { XK_F29, Key::F29 }, + { XK_F30, Key::F30 }, + { XK_F31, Key::F31 }, + { XK_F32, Key::F32 }, + { XK_F33, Key::F33 }, + { XK_F34, Key::F34 }, + { XK_F35, Key::F35 }, // media keys { XF86XK_Back, Key::BACK }, @@ -294,6 +313,29 @@ static _TranslatePair _scancode_to_keycode[] = { { Key::SUPER_L, 0x85 }, { Key::SUPER_R, 0x86 }, { Key::MENU, 0x87 }, + { Key::F13, 0xBF }, + { Key::F14, 0xC0 }, + { Key::F15, 0xC1 }, + { Key::F16, 0xC2 }, + { Key::F17, 0xC3 }, + { Key::F18, 0xC4 }, + { Key::F19, 0xC5 }, + { Key::F20, 0xC6 }, + { Key::F21, 0xC7 }, + { Key::F22, 0xC8 }, + { Key::F23, 0xC9 }, + { Key::F24, 0xCA }, + { Key::F25, 0xCB }, + { Key::F26, 0xCC }, + { Key::F27, 0xCD }, + { Key::F28, 0xCE }, + { Key::F29, 0xCF }, + { Key::F30, 0xD0 }, + { Key::F31, 0xD1 }, + { Key::F32, 0xD2 }, + { Key::F33, 0xD3 }, + { Key::F34, 0xD4 }, + { Key::F35, 0xD5 }, { Key::UNKNOWN, 0 } }; diff --git a/platform/osx/key_mapping_osx.mm b/platform/osx/key_mapping_osx.mm index bfec45de58..0bf6bc7d1c 100644 --- a/platform/osx/key_mapping_osx.mm +++ b/platform/osx/key_mapping_osx.mm @@ -130,7 +130,7 @@ static const Key _osx_to_godot_table[128] = { /* 3d */ Key::ALT, /* 3e */ Key::CTRL, /* 3f */ Key::UNKNOWN, /* Function */ - /* 40 */ Key::UNKNOWN, /* F17 */ + /* 40 */ Key::F17, /* 41 */ Key::KP_PERIOD, /* 42 */ Key::UNKNOWN, /* 43 */ Key::KP_MULTIPLY, @@ -145,8 +145,8 @@ static const Key _osx_to_godot_table[128] = { /* 4c */ Key::KP_ENTER, /* 4d */ Key::UNKNOWN, /* 4e */ Key::KP_SUBTRACT, - /* 4f */ Key::UNKNOWN, /* F18 */ - /* 50 */ Key::UNKNOWN, /* F19 */ + /* 4f */ Key::F18, + /* 50 */ Key::F19, /* 51 */ Key::EQUAL, /* KeypadEqual */ /* 52 */ Key::KP_0, /* 53 */ Key::KP_1, @@ -156,7 +156,7 @@ static const Key _osx_to_godot_table[128] = { /* 57 */ Key::KP_5, /* 58 */ Key::KP_6, /* 59 */ Key::KP_7, - /* 5a */ Key::UNKNOWN, /* F20 */ + /* 5a */ Key::F20, /* 5b */ Key::KP_8, /* 5c */ Key::KP_9, /* 5d */ Key::YEN, /* JIS Yen */ @@ -366,7 +366,26 @@ static const _KeyCodeText _native_keycodes[] = { {Key::F13 ,NSF13FunctionKey}, {Key::F14 ,NSF14FunctionKey}, {Key::F15 ,NSF15FunctionKey}, - {Key::F16 ,NSF16FunctionKey}, //* ... NSF35FunctionKey */ + {Key::F16 ,NSF16FunctionKey}, + {Key::F17 ,NSF17FunctionKey}, + {Key::F18 ,NSF18FunctionKey}, + {Key::F19 ,NSF19FunctionKey}, + {Key::F20 ,NSF20FunctionKey}, + {Key::F21 ,NSF21FunctionKey}, + {Key::F22 ,NSF22FunctionKey}, + {Key::F23 ,NSF23FunctionKey}, + {Key::F24 ,NSF24FunctionKey}, + {Key::F25 ,NSF25FunctionKey}, + {Key::F26 ,NSF26FunctionKey}, + {Key::F27 ,NSF27FunctionKey}, + {Key::F28 ,NSF28FunctionKey}, + {Key::F29 ,NSF29FunctionKey}, + {Key::F30 ,NSF30FunctionKey}, + {Key::F31 ,NSF31FunctionKey}, + {Key::F32 ,NSF32FunctionKey}, + {Key::F33 ,NSF33FunctionKey}, + {Key::F34 ,NSF34FunctionKey}, + {Key::F35 ,NSF35FunctionKey}, {Key::MENU ,NSMenuFunctionKey}, {Key::HELP ,NSHelpFunctionKey}, {Key::STOP ,NSStopFunctionKey}, diff --git a/platform/windows/key_mapping_windows.cpp b/platform/windows/key_mapping_windows.cpp index e32dc0d1a6..2d8d68a575 100644 --- a/platform/windows/key_mapping_windows.cpp +++ b/platform/windows/key_mapping_windows.cpp @@ -179,7 +179,14 @@ static _WinTranslatePair _vk_to_keycode[] = { { Key::F14, VK_F14 }, // (0x7D) { Key::F15, VK_F15 }, // (0x7E) { Key::F16, VK_F16 }, // (0x7F) - // We have no mappings for F17-F24. (0x80-87) + { Key::F17, VK_F17 }, // (0x80) + { Key::F18, VK_F18 }, // (0x81) + { Key::F19, VK_F19 }, // (0x82) + { Key::F20, VK_F20 }, // (0x83) + { Key::F21, VK_F21 }, // (0x84) + { Key::F22, VK_F22 }, // (0x85) + { Key::F23, VK_F23 }, // (0x86) + { Key::F24, VK_F24 }, // (0x87) // 0x88-8F are reserved for UI navigation. { Key::NUMLOCK, VK_NUMLOCK }, // (0x90) { Key::SCROLLLOCK, VK_SCROLL }, // (0x91) @@ -409,6 +416,14 @@ static _WinTranslatePair _scancode_to_keycode[] = { { Key::F14, 0x65 }, { Key::F15, 0x66 }, { Key::F16, 0x67 }, + { Key::F17, 0x68 }, + { Key::F18, 0x69 }, + { Key::F19, 0x6A }, + { Key::F20, 0x6B }, + { Key::F21, 0x6C }, + { Key::F22, 0x6D }, + { Key::F23, 0x6E }, + { Key::F24, 0x76 }, { Key::UNKNOWN, 0 } }; diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index e7f1740f0b..eaab58c4ae 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -30,6 +30,7 @@ #include "audio_stream_player_2d.h" +#include "core/config/project_settings.h" #include "scene/2d/area_2d.h" #include "scene/2d/audio_listener_2d.h" #include "scene/main/window.h" @@ -186,7 +187,14 @@ void AudioStreamPlayer2D::_update_panning() { float multiplier = Math::pow(1.0f - dist / max_distance, attenuation); multiplier *= Math::db2linear(volume_db); //also apply player volume! - float pan = CLAMP((relative_to_listener.x + screen_size.x * 0.5) / screen_size.x, 0.0, 1.0); + float pan = relative_to_listener.x / screen_size.x; + // Don't let the panning effect extend (too far) beyond the screen. + pan = CLAMP(pan, -1, 1); + + // Bake in a constant factor here to allow the project setting defaults for 2d and 3d to be normalized to 1.0. + pan *= panning_strength * cached_global_panning_strength * 0.5f; + + pan = CLAMP(pan + 0.5, 0.0, 1.0); float l = 1.0 - pan; float r = pan; @@ -391,6 +399,15 @@ int AudioStreamPlayer2D::get_max_polyphony() const { return max_polyphony; } +void AudioStreamPlayer2D::set_panning_strength(float p_panning_strength) { + ERR_FAIL_COND_MSG(p_panning_strength < 0, "Panning strength must be a positive number."); + panning_strength = p_panning_strength; +} + +float AudioStreamPlayer2D::get_panning_strength() const { + return panning_strength; +} + void AudioStreamPlayer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer2D::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &AudioStreamPlayer2D::get_stream); @@ -432,6 +449,9 @@ void AudioStreamPlayer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_max_polyphony", "max_polyphony"), &AudioStreamPlayer2D::set_max_polyphony); ClassDB::bind_method(D_METHOD("get_max_polyphony"), &AudioStreamPlayer2D::get_max_polyphony); + ClassDB::bind_method(D_METHOD("set_panning_strength", "panning_strength"), &AudioStreamPlayer2D::set_panning_strength); + ClassDB::bind_method(D_METHOD("get_panning_strength"), &AudioStreamPlayer2D::get_panning_strength); + ClassDB::bind_method(D_METHOD("get_stream_playback"), &AudioStreamPlayer2D::get_stream_playback); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream"); @@ -443,6 +463,7 @@ void AudioStreamPlayer2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_distance", PROPERTY_HINT_RANGE, "1,4096,1,or_greater,exp,suffix:px"), "set_max_distance", "get_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "attenuation", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_attenuation", "get_attenuation"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_polyphony", PROPERTY_HINT_NONE, ""), "set_max_polyphony", "get_max_polyphony"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "panning_strength", PROPERTY_HINT_RANGE, "0,3,0.01,or_greater"), "set_panning_strength", "get_panning_strength"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "bus", PROPERTY_HINT_ENUM, ""), "set_bus", "get_bus"); ADD_PROPERTY(PropertyInfo(Variant::INT, "area_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_area_mask", "get_area_mask"); @@ -451,6 +472,7 @@ void AudioStreamPlayer2D::_bind_methods() { AudioStreamPlayer2D::AudioStreamPlayer2D() { AudioServer::get_singleton()->connect("bus_layout_changed", callable_mp(this, &AudioStreamPlayer2D::_bus_layout_changed)); + cached_global_panning_strength = ProjectSettings::get_singleton()->get("audio/general/2d_panning_strength"); } AudioStreamPlayer2D::~AudioStreamPlayer2D() { diff --git a/scene/2d/audio_stream_player_2d.h b/scene/2d/audio_stream_player_2d.h index 73b09e432f..a22782fe44 100644 --- a/scene/2d/audio_stream_player_2d.h +++ b/scene/2d/audio_stream_player_2d.h @@ -81,6 +81,9 @@ private: float max_distance = 2000.0; float attenuation = 1.0; + float panning_strength = 1.0f; + float cached_global_panning_strength = 1.0f; + protected: void _validate_property(PropertyInfo &property) const override; void _notification(int p_what); @@ -123,6 +126,9 @@ public: void set_max_polyphony(int p_max_polyphony); int get_max_polyphony() const; + void set_panning_strength(float p_panning_strength); + float get_panning_strength() const; + Ref<AudioStreamPlayback> get_stream_playback(); AudioStreamPlayer2D(); diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index f9cf70a586..913003c7e6 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -1362,7 +1362,7 @@ void CPUParticles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &CPUParticles2D::convert_from_particles); ADD_GROUP("Emission Shape", "emission_"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Sphere Surface,Box,Points,Directed Points", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_emission_shape", "get_emission_shape"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Sphere Surface,Rectangle,Points,Directed Points", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_emission_shape", "get_emission_shape"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_sphere_radius", PROPERTY_HINT_RANGE, "0.01,128,0.01,suffix:px"), "set_emission_sphere_radius", "get_emission_sphere_radius"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "emission_rect_extents", PROPERTY_HINT_NONE, "suffix:px"), "set_emission_rect_extents", "get_emission_rect_extents"); ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "emission_points"), "set_emission_points", "get_emission_points"); diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index e2ab4f7538..5a451a6dab 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -40,6 +40,9 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_avoidance_enabled", "enabled"), &NavigationAgent2D::set_avoidance_enabled); ClassDB::bind_method(D_METHOD("get_avoidance_enabled"), &NavigationAgent2D::get_avoidance_enabled); + ClassDB::bind_method(D_METHOD("set_path_desired_distance", "desired_distance"), &NavigationAgent2D::set_path_desired_distance); + ClassDB::bind_method(D_METHOD("get_path_desired_distance"), &NavigationAgent2D::get_path_desired_distance); + ClassDB::bind_method(D_METHOD("set_target_desired_distance", "desired_distance"), &NavigationAgent2D::set_target_desired_distance); ClassDB::bind_method(D_METHOD("get_target_desired_distance"), &NavigationAgent2D::get_target_desired_distance); @@ -64,6 +67,9 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationAgent2D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationAgent2D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationAgent2D::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationAgent2D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationAgent2D::set_navigation_map); ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationAgent2D::get_navigation_map); @@ -81,6 +87,7 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("_avoidance_done", "new_velocity"), &NavigationAgent2D::_avoidance_done); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:px"), "set_path_desired_distance", "get_path_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "target_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:px"), "set_target_desired_distance", "get_target_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius", PROPERTY_HINT_RANGE, "0.1,500,0.01,suffix:px"), "set_radius", "get_radius"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "neighbor_dist", PROPERTY_HINT_RANGE, "0.1,100000,0.01,suffix:px"), "set_neighbor_dist", "get_neighbor_dist"); @@ -219,6 +226,24 @@ uint32_t NavigationAgent2D::get_navigation_layers() const { return navigation_layers; } +void NavigationAgent2D::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool NavigationAgent2D::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void NavigationAgent2D::set_navigation_map(RID p_navigation_map) { map_override = p_navigation_map; NavigationServer2D::get_singleton()->agent_set_map(agent, map_override); @@ -234,6 +259,10 @@ RID NavigationAgent2D::get_navigation_map() const { return RID(); } +void NavigationAgent2D::set_path_desired_distance(real_t p_dd) { + path_desired_distance = p_dd; +} + void NavigationAgent2D::set_target_desired_distance(real_t p_dd) { target_desired_distance = p_dd; } @@ -399,7 +428,7 @@ void NavigationAgent2D::update_navigation() { // Check if we can advance the navigation path if (navigation_finished == false) { // Advances to the next far away location. - while (o.distance_to(navigation_path[nav_path_index]) < target_desired_distance) { + while (o.distance_to(navigation_path[nav_path_index]) < path_desired_distance) { nav_path_index += 1; if (nav_path_index == navigation_path.size()) { _check_distance_to_target(); diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 0e494a0512..032a15cad2 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -47,6 +47,7 @@ class NavigationAgent2D : public Node { bool avoidance_enabled = false; uint32_t navigation_layers = 1; + real_t path_desired_distance = 1.0; real_t target_desired_distance = 1.0; real_t radius = 0.0; real_t neighbor_dist = 0.0; @@ -88,9 +89,17 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; + void set_navigation_map(RID p_navigation_map); RID get_navigation_map() const; + void set_path_desired_distance(real_t p_dd); + real_t get_path_desired_distance() const { + return path_desired_distance; + } + void set_target_desired_distance(real_t p_dd); real_t get_target_desired_distance() const { return target_desired_distance; diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index d611e524a6..6e8fd891cb 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -388,6 +388,24 @@ uint32_t NavigationRegion2D::get_navigation_layers() const { return NavigationServer2D::get_singleton()->region_get_navigation_layers(region); } +void NavigationRegion2D::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool NavigationRegion2D::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void NavigationRegion2D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); enter_cost = MAX(p_enter_cost, 0.0); @@ -562,6 +580,9 @@ void NavigationRegion2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationRegion2D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationRegion2D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationRegion2D::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationRegion2D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_region_rid"), &NavigationRegion2D::get_region_rid); ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationRegion2D::set_enter_cost); diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 000cb32f95..3c9df91fe3 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -120,6 +120,9 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; + RID get_region_rid() const; void set_enter_cost(real_t p_enter_cost); diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 7c1fb3779f..824ea0407e 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -30,6 +30,7 @@ #include "audio_stream_player_3d.h" +#include "core/config/project_settings.h" #include "scene/3d/area_3d.h" #include "scene/3d/audio_listener_3d.h" #include "scene/3d/camera_3d.h" @@ -462,9 +463,10 @@ Vector<AudioFrame> AudioStreamPlayer3D::_update_panning() { for (Ref<AudioStreamPlayback> &playback : stream_playbacks) { AudioServer::get_singleton()->set_playback_highshelf_params(playback, linear_attenuation, attenuation_filter_cutoff_hz); } - //TODO: The lower the second parameter (tightness) the more the sound will "enclose" the listener (more undirected / playing from - // speakers not facing the source) - this could be made distance dependent. - _calc_output_vol(local_pos.normalized(), 4.0, output_volume_vector); + // Bake in a constant factor here to allow the project setting defaults for 2d and 3d to be normalized to 1.0. + float tightness = cached_global_panning_strength * 2.0f; + tightness *= panning_strength; + _calc_output_vol(local_pos.normalized(), tightness, output_volume_vector); for (unsigned int k = 0; k < 4; k++) { output_volume_vector.write[k] = multiplier * output_volume_vector[k]; @@ -792,6 +794,15 @@ int AudioStreamPlayer3D::get_max_polyphony() const { return max_polyphony; } +void AudioStreamPlayer3D::set_panning_strength(float p_panning_strength) { + ERR_FAIL_COND_MSG(p_panning_strength < 0, "Panning strength must be a positive number."); + panning_strength = p_panning_strength; +} + +float AudioStreamPlayer3D::get_panning_strength() const { + return panning_strength; +} + void AudioStreamPlayer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer3D::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &AudioStreamPlayer3D::get_stream); @@ -857,6 +868,9 @@ void AudioStreamPlayer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_max_polyphony", "max_polyphony"), &AudioStreamPlayer3D::set_max_polyphony); ClassDB::bind_method(D_METHOD("get_max_polyphony"), &AudioStreamPlayer3D::get_max_polyphony); + ClassDB::bind_method(D_METHOD("set_panning_strength", "panning_strength"), &AudioStreamPlayer3D::set_panning_strength); + ClassDB::bind_method(D_METHOD("get_panning_strength"), &AudioStreamPlayer3D::get_panning_strength); + ClassDB::bind_method(D_METHOD("get_stream_playback"), &AudioStreamPlayer3D::get_stream_playback); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream"); @@ -870,6 +884,7 @@ void AudioStreamPlayer3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "stream_paused", PROPERTY_HINT_NONE, ""), "set_stream_paused", "get_stream_paused"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_distance", PROPERTY_HINT_RANGE, "0,4096,0.01,or_greater,suffix:m"), "set_max_distance", "get_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_polyphony", PROPERTY_HINT_NONE, ""), "set_max_polyphony", "get_max_polyphony"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "panning_strength", PROPERTY_HINT_RANGE, "0,3,0.01,or_greater"), "set_panning_strength", "get_panning_strength"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "bus", PROPERTY_HINT_ENUM, ""), "set_bus", "get_bus"); ADD_PROPERTY(PropertyInfo(Variant::INT, "area_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_area_mask", "get_area_mask"); ADD_GROUP("Emission Angle", "emission_angle"); @@ -898,6 +913,7 @@ AudioStreamPlayer3D::AudioStreamPlayer3D() { velocity_tracker.instantiate(); AudioServer::get_singleton()->connect("bus_layout_changed", callable_mp(this, &AudioStreamPlayer3D::_bus_layout_changed)); set_disable_scale(true); + cached_global_panning_strength = ProjectSettings::get_singleton()->get("audio/general/3d_panning_strength"); } AudioStreamPlayer3D::~AudioStreamPlayer3D() { diff --git a/scene/3d/audio_stream_player_3d.h b/scene/3d/audio_stream_player_3d.h index bc47a8de93..85ece6d8d5 100644 --- a/scene/3d/audio_stream_player_3d.h +++ b/scene/3d/audio_stream_player_3d.h @@ -116,6 +116,9 @@ private: float _get_attenuation_db(float p_distance) const; + float panning_strength = 1.0f; + float cached_global_panning_strength = 1.0f; + protected: void _validate_property(PropertyInfo &property) const override; void _notification(int p_what); @@ -182,6 +185,9 @@ public: void set_stream_paused(bool p_pause); bool get_stream_paused() const; + void set_panning_strength(float p_panning_strength); + float get_panning_strength() const; + Ref<AudioStreamPlayback> get_stream_playback(); AudioStreamPlayer3D(); diff --git a/scene/3d/label_3d.cpp b/scene/3d/label_3d.cpp index 6ed4ce8c5b..0849b2c631 100644 --- a/scene/3d/label_3d.cpp +++ b/scene/3d/label_3d.cpp @@ -376,7 +376,7 @@ void Label3D::_generate_glyph_surfaces(const Glyph &p_glyph, Vector2 &r_offset, } else { mat_hash = hash_one_uint64(0); } - mat_hash = hash_djb2_one_64(p_priority | (p_outline_size << 31), mat_hash); + mat_hash = hash_fmix32(hash_murmur3_one_64(p_priority | (p_outline_size << 31), mat_hash)); if (!surfaces.has(mat_hash)) { SurfaceData surf; diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index d80c10d63a..28614d7cae 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -281,7 +281,7 @@ void Light3D::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_indirect_energy", PROPERTY_HINT_RANGE, "0,16,0.001,or_greater"), "set_param", "get_param", PARAM_INDIRECT_ENERGY); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "light_projector", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_projector", "get_projector"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_size", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"), "set_param", "get_param", PARAM_SIZE); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_angular_distance", PROPERTY_HINT_RANGE, "0,90,0.01,radians"), "set_param", "get_param", PARAM_SIZE); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_angular_distance", PROPERTY_HINT_RANGE, "0,90,0.01,degrees"), "set_param", "get_param", PARAM_SIZE); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "light_negative"), "set_negative", "is_negative"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_specular", PROPERTY_HINT_RANGE, "0,16,0.001,or_greater"), "set_param", "get_param", PARAM_SPECULAR); ADD_PROPERTY(PropertyInfo(Variant::INT, "light_bake_mode", PROPERTY_HINT_ENUM, "Disabled,Static (VoxelGI/SDFGI/LightmapGI),Dynamic (VoxelGI/SDFGI only)"), "set_bake_mode", "get_bake_mode"); diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index 9d1d8721e6..a8eec4b1f3 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -665,7 +665,7 @@ void LightmapGI::_plot_triangle_into_octree(GenProbesOctree *p_cell, float p_cel } } -void LightmapGI::_gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool, Vector3iHash> &positions_used, const AABB &p_bounds) { +void LightmapGI::_gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool> &positions_used, const AABB &p_bounds) { for (int i = 0; i < 8; i++) { Vector3i pos = p_cell->offset; if (i & 1) { @@ -934,7 +934,7 @@ LightmapGI::BakeError LightmapGI::bake(Node *p_from_node, String p_image_data_pa } LocalVector<Vector3> new_probe_positions; - HashMap<Vector3i, bool, Vector3iHash> positions_used; + HashMap<Vector3i, bool> positions_used; for (uint32_t i = 0; i < 8; i++) { //insert bounding endpoints Vector3i pos; if (i & 1) { diff --git a/scene/3d/lightmap_gi.h b/scene/3d/lightmap_gi.h index b39cde429d..f7a23c776a 100644 --- a/scene/3d/lightmap_gi.h +++ b/scene/3d/lightmap_gi.h @@ -212,16 +212,8 @@ private: } }; - struct Vector3iHash { - _FORCE_INLINE_ static uint32_t hash(const Vector3i &p_vtx) { - uint32_t h = hash_djb2_one_32(p_vtx.x); - h = hash_djb2_one_32(p_vtx.y, h); - return hash_djb2_one_32(p_vtx.z, h); - } - }; - void _plot_triangle_into_octree(GenProbesOctree *p_cell, float p_cell_size, const Vector3 *p_triangle); - void _gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool, Vector3iHash> &positions_used, const AABB &p_bounds); + void _gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool> &positions_used, const AABB &p_bounds); protected: void _validate_property(PropertyInfo &property) const override; diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 09d75dd284..e5ec444335 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -38,6 +38,9 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_avoidance_enabled", "enabled"), &NavigationAgent3D::set_avoidance_enabled); ClassDB::bind_method(D_METHOD("get_avoidance_enabled"), &NavigationAgent3D::get_avoidance_enabled); + ClassDB::bind_method(D_METHOD("set_path_desired_distance", "desired_distance"), &NavigationAgent3D::set_path_desired_distance); + ClassDB::bind_method(D_METHOD("get_path_desired_distance"), &NavigationAgent3D::get_path_desired_distance); + ClassDB::bind_method(D_METHOD("set_target_desired_distance", "desired_distance"), &NavigationAgent3D::set_target_desired_distance); ClassDB::bind_method(D_METHOD("get_target_desired_distance"), &NavigationAgent3D::get_target_desired_distance); @@ -68,6 +71,9 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationAgent3D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationAgent3D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationAgent3D::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationAgent3D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationAgent3D::set_navigation_map); ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationAgent3D::get_navigation_map); @@ -85,6 +91,7 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("_avoidance_done", "new_velocity"), &NavigationAgent3D::_avoidance_done); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_path_desired_distance", "get_path_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "target_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_target_desired_distance", "get_target_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_radius", "get_radius"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "agent_height_offset", PROPERTY_HINT_RANGE, "-100.0,100,0.01,suffix:m"), "set_agent_height_offset", "get_agent_height_offset"); @@ -226,6 +233,24 @@ uint32_t NavigationAgent3D::get_navigation_layers() const { return navigation_layers; } +void NavigationAgent3D::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool NavigationAgent3D::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void NavigationAgent3D::set_navigation_map(RID p_navigation_map) { map_override = p_navigation_map; NavigationServer3D::get_singleton()->agent_set_map(agent, map_override); @@ -241,6 +266,10 @@ RID NavigationAgent3D::get_navigation_map() const { return RID(); } +void NavigationAgent3D::set_path_desired_distance(real_t p_dd) { + path_desired_distance = p_dd; +} + void NavigationAgent3D::set_target_desired_distance(real_t p_dd) { target_desired_distance = p_dd; } @@ -416,7 +445,7 @@ void NavigationAgent3D::update_navigation() { // Check if we can advance the navigation path if (navigation_finished == false) { // Advances to the next far away location. - while (o.distance_to(navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0)) < target_desired_distance) { + while (o.distance_to(navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { nav_path_index += 1; if (nav_path_index == navigation_path.size()) { _check_distance_to_target(); diff --git a/scene/3d/navigation_agent_3d.h b/scene/3d/navigation_agent_3d.h index d0eaead3f1..0a00d769c3 100644 --- a/scene/3d/navigation_agent_3d.h +++ b/scene/3d/navigation_agent_3d.h @@ -47,6 +47,7 @@ class NavigationAgent3D : public Node { bool avoidance_enabled = false; uint32_t navigation_layers = 1; + real_t path_desired_distance = 1.0; real_t target_desired_distance = 1.0; real_t radius = 0.0; real_t navigation_height_offset = 0.0; @@ -90,9 +91,17 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; + void set_navigation_map(RID p_navigation_map); RID get_navigation_map() const; + void set_path_desired_distance(real_t p_dd); + real_t get_path_desired_distance() const { + return path_desired_distance; + } + void set_target_desired_distance(real_t p_dd); real_t get_target_desired_distance() const { return target_desired_distance; diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index 7ef16fbc0a..2a8149c6f6 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -73,6 +73,24 @@ uint32_t NavigationRegion3D::get_navigation_layers() const { return NavigationServer3D::get_singleton()->region_get_navigation_layers(region); } +void NavigationRegion3D::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool NavigationRegion3D::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void NavigationRegion3D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); enter_cost = MAX(p_enter_cost, 0.0); @@ -242,6 +260,9 @@ void NavigationRegion3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationRegion3D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationRegion3D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationRegion3D::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationRegion3D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_region_rid"), &NavigationRegion3D::get_region_rid); ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationRegion3D::set_enter_cost); diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index 92474d1429..aaaf5dd3b8 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -60,6 +60,9 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; + RID get_region_rid() const; void set_enter_cost(real_t p_enter_cost); diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index ba2029788e..fbd5f31dd5 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -326,13 +326,11 @@ void Skeleton3D::_notification(int p_what) { case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { // This is active only if the skeleton animates the physical bones // and the state of the bone is not active. - if (Engine::get_singleton()->is_editor_hint()) { - if (animate_physical_bones) { - for (int i = 0; i < bones.size(); i += 1) { - if (bones[i].physical_bone) { - if (bones[i].physical_bone->is_simulating_physics() == false) { - bones[i].physical_bone->reset_to_rest_position(); - } + if (animate_physical_bones) { + for (int i = 0; i < bones.size(); i += 1) { + if (bones[i].physical_bone) { + if (bones[i].physical_bone->is_simulating_physics() == false) { + bones[i].physical_bone->reset_to_rest_position(); } } } diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 8edfaa5853..5d471c9e84 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -1909,7 +1909,7 @@ NodePath AnimationPlayer::get_root() const { void AnimationPlayer::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { String pf = p_function; - if (p_idx == 0 && (p_function == "play" || p_function == "play_backwards" || p_function == "remove_animation" || p_function == "has_animation" || p_function == "queue")) { + if (p_idx == 0 && (p_function == "play" || p_function == "play_backwards" || p_function == "has_animation" || p_function == "queue")) { List<StringName> al; get_animation_list(&al); for (const StringName &name : al) { diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index 7e4bda14e5..d3eb37a345 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -155,8 +155,8 @@ private: static uint32_t hash(const TrackNodeCacheKey &p_key) { uint32_t h = hash_one_uint64(p_key.id); - h = hash_djb2_one_32(p_key.bone_idx, h); - return hash_djb2_one_32(p_key.blend_shape_idx, h); + h = hash_murmur3_one_32(p_key.bone_idx, h); + return hash_fmix32(hash_murmur3_one_32(p_key.blend_shape_idx, h)); } inline bool operator==(const TrackNodeCacheKey &p_right) const { diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index d34e8db093..136285c4dc 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -919,7 +919,6 @@ void AnimationTree::_process_graph(double p_delta) { state.valid = true; state.invalid_reasons = ""; state.animation_states.clear(); //will need to be re-created - state.valid = true; state.player = player; state.last_pass = process_pass; state.tree = this; diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 20f3f82a4e..3dc358a6c2 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -239,7 +239,7 @@ void CanvasItem::_enter_canvas() { get_viewport()->gui_reset_canvas_sort_index(); } - get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE, group, SNAME("_top_level_raise_self")); + get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE | SceneTree::GROUP_CALL_DEFERRED, group, SNAME("_top_level_raise_self")); } else { CanvasItem *parent = get_parent_item(); @@ -320,7 +320,7 @@ void CanvasItem::_notification(int p_what) { } if (group != StringName()) { - get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE, group, "_top_level_raise_self"); + get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE | SceneTree::GROUP_CALL_DEFERRED, group, "_top_level_raise_self"); } else { CanvasItem *p = get_parent_item(); ERR_FAIL_COND(!p); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 27f240164c..b5caec3fc3 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -300,7 +300,7 @@ void Node::_propagate_exit_tree() { if (data.parent) { Variant c = this; const Variant *cptr = &c; - data.parent->emit_signalp(SNAME("child_exited_tree"), &cptr, 1); + data.parent->emit_signalp(SNAME("child_exiting_tree"), &cptr, 1); } // exit groups @@ -2973,7 +2973,7 @@ void Node::_bind_methods() { ADD_SIGNAL(MethodInfo("tree_exiting")); ADD_SIGNAL(MethodInfo("tree_exited")); ADD_SIGNAL(MethodInfo("child_entered_tree", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node"))); - ADD_SIGNAL(MethodInfo("child_exited_tree", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node"))); + ADD_SIGNAL(MethodInfo("child_exiting_tree", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Node"))); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_name", "get_name"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "unique_name_in_owner", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_unique_name_in_owner", "is_unique_name_in_owner"); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index f8abda35d2..dd77877c7d 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -386,7 +386,7 @@ void SceneTree::set_group_flags(uint32_t p_call_flags, const StringName &p_group } void SceneTree::notify_group(const StringName &p_group, int p_notification) { - notify_group_flags(0, p_group, p_notification); + notify_group_flags(GROUP_CALL_DEFAULT, p_group, p_notification); } void SceneTree::set_group(const StringName &p_group, const String &p_name, const Variant &p_value) { diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 1d697a2176..69fb5fdf07 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -111,31 +111,19 @@ Size2i Window::get_real_size() const { void Window::set_max_size(const Size2i &p_max_size) { max_size = p_max_size; - if (window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_max_size(max_size, window_id); - } _update_window_size(); } Size2i Window::get_max_size() const { - if (window_id != DisplayServer::INVALID_WINDOW_ID) { - max_size = DisplayServer::get_singleton()->window_get_max_size(window_id); - } return max_size; } void Window::set_min_size(const Size2i &p_min_size) { min_size = p_min_size; - if (!wrap_controls && window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_min_size(min_size, window_id); - } _update_window_size(); } Size2i Window::get_min_size() const { - if (window_id != DisplayServer::INVALID_WINDOW_ID) { - min_size = DisplayServer::get_singleton()->window_get_min_size(window_id); - } return min_size; } @@ -166,7 +154,7 @@ void Window::set_flag(Flags p_flag, bool p_enabled) { } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { #ifdef TOOLS_ENABLED - if ((p_flag != FLAG_POPUP) || !(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if ((p_flag != FLAG_POPUP) || !(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { DisplayServer::get_singleton()->window_set_flag(DisplayServer::WindowFlags(p_flag), p_enabled, window_id); } #else @@ -179,7 +167,7 @@ bool Window::get_flag(Flags p_flag) const { ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); if (window_id != DisplayServer::INVALID_WINDOW_ID) { #ifdef TOOLS_ENABLED - if ((p_flag != FLAG_POPUP) || !(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if ((p_flag != FLAG_POPUP) || !(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { flags[p_flag] = DisplayServer::get_singleton()->window_get_flag(DisplayServer::WindowFlags(p_flag), window_id); } #else @@ -268,7 +256,7 @@ void Window::_make_window() { DisplayServer::get_singleton()->window_set_title(tr_title, window_id); DisplayServer::get_singleton()->window_attach_instance_id(get_instance_id(), window_id); #ifdef TOOLS_ENABLED - if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { DisplayServer::get_singleton()->window_set_exclusive(window_id, exclusive); } else { DisplayServer::get_singleton()->window_set_exclusive(window_id, false); @@ -457,7 +445,7 @@ void Window::set_visible(bool p_visible) { if (transient_parent) { if (exclusive && visible) { #ifdef TOOLS_ENABLED - if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { ERR_FAIL_COND_MSG(transient_parent->exclusive_child && transient_parent->exclusive_child != this, "Transient parent has another exclusive child."); transient_parent->exclusive_child = this; } @@ -511,7 +499,7 @@ void Window::_make_transient() { if (is_inside_tree() && is_visible() && exclusive) { if (transient_parent->exclusive_child == nullptr) { #ifdef TOOLS_ENABLED - if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { transient_parent->exclusive_child = this; } #else @@ -560,7 +548,7 @@ void Window::set_exclusive(bool p_exclusive) { if (!embedder && window_id != DisplayServer::INVALID_WINDOW_ID) { #ifdef TOOLS_ENABLED - if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { DisplayServer::get_singleton()->window_set_exclusive(window_id, exclusive); } else { DisplayServer::get_singleton()->window_set_exclusive(window_id, false); @@ -574,7 +562,7 @@ void Window::set_exclusive(bool p_exclusive) { if (p_exclusive && is_inside_tree() && is_visible()) { ERR_FAIL_COND_MSG(transient_parent->exclusive_child && transient_parent->exclusive_child != this, "Transient parent has another exclusive child."); #ifdef TOOLS_ENABLED - if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_ancestor_of(this))) { + if (!(Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root()->is_ancestor_of(this) || get_tree()->get_edited_scene_root() == this))) { transient_parent->exclusive_child = this; } #else @@ -621,6 +609,7 @@ void Window::_update_window_size() { } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { DisplayServer::get_singleton()->window_set_size(size, window_id); DisplayServer::get_singleton()->window_set_min_size(size_limit, window_id); + DisplayServer::get_singleton()->window_set_max_size(max_size, window_id); } //update the viewport @@ -1153,7 +1142,7 @@ void Window::popup(const Rect2i &p_screen_rect) { // Send a focus-out notification when opening a Window Manager Popup. SceneTree *scene_tree = get_tree(); if (scene_tree) { - scene_tree->notify_group("_viewports", NOTIFICATION_WM_WINDOW_FOCUS_OUT); + scene_tree->notify_group_flags(SceneTree::GROUP_CALL_DEFERRED, "_viewports", NOTIFICATION_WM_WINDOW_FOCUS_OUT); } } diff --git a/scene/resources/canvas_item_material.h b/scene/resources/canvas_item_material.h index 7c44c125a8..160c67d6b1 100644 --- a/scene/resources/canvas_item_material.h +++ b/scene/resources/canvas_item_material.h @@ -64,7 +64,7 @@ private: uint32_t key = 0; static uint32_t hash(const MaterialKey &p_key) { - return hash_djb2_one_32(p_key.key); + return hash_murmur3_one_32(p_key.key); } bool operator==(const MaterialKey &p_key) const { return key == p_key.key; diff --git a/scene/resources/concave_polygon_shape_3d.h b/scene/resources/concave_polygon_shape_3d.h index 4711e38468..a265590edd 100644 --- a/scene/resources/concave_polygon_shape_3d.h +++ b/scene/resources/concave_polygon_shape_3d.h @@ -43,8 +43,8 @@ class ConcavePolygonShape3D : public Shape3D { Vector3 a; Vector3 b; static uint32_t hash(const DrawEdge &p_edge) { - uint32_t h = hash_djb2_one_32(HashMapHasherDefault::hash(p_edge.a)); - return hash_djb2_one_32(HashMapHasherDefault::hash(p_edge.b), h); + uint32_t h = hash_murmur3_one_32(HashMapHasherDefault::hash(p_edge.a)); + return hash_murmur3_one_32(HashMapHasherDefault::hash(p_edge.b), h); } bool operator==(const DrawEdge &p_edge) const { return (a == p_edge.a && b == p_edge.b); diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 8a353f4b49..46f23424dd 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -2273,7 +2273,7 @@ Size2 Font::get_string_size(const String &p_text, int p_size, HorizontalAlignmen uint64_t hash = p_text.hash64(); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { - hash = hash_djb2_one_64(hash_djb2_one_float(p_width), hash); + hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); hash = hash_djb2_one_64(p_flags, hash); } hash = hash_djb2_one_64(p_size, hash); @@ -2297,7 +2297,7 @@ Size2 Font::get_multiline_string_size(const String &p_text, float p_width, int p } uint64_t hash = p_text.hash64(); - uint64_t wrp_hash = hash_djb2_one_64(hash_djb2_one_float(p_width), hash); + uint64_t wrp_hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); wrp_hash = hash_djb2_one_64(p_flags, wrp_hash); wrp_hash = hash_djb2_one_64(p_size, wrp_hash); @@ -2335,7 +2335,7 @@ void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_t uint64_t hash = p_text.hash64(); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { - hash = hash_djb2_one_64(hash_djb2_one_float(p_width), hash); + hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); hash = hash_djb2_one_64(p_flags, hash); } hash = hash_djb2_one_64(p_size, hash); @@ -2374,7 +2374,7 @@ void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const S } uint64_t hash = p_text.hash64(); - uint64_t wrp_hash = hash_djb2_one_64(hash_djb2_one_float(p_width), hash); + uint64_t wrp_hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); wrp_hash = hash_djb2_one_64(p_flags, wrp_hash); wrp_hash = hash_djb2_one_64(p_size, wrp_hash); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index fc207d358e..b7a3b677f5 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -2209,7 +2209,7 @@ Ref<Material> BaseMaterial3D::get_material_for_2d(bool p_shaded, bool p_transpar if (p_fixed_size) { hash |= 1 << 9; } - hash = hash_djb2_one_64(p_filter, hash); + hash = hash_murmur3_one_64(p_filter, hash); if (materials_for_2d.has(hash)) { if (r_shader_rid) { diff --git a/scene/resources/particles_material.cpp b/scene/resources/particles_material.cpp index c4b15df6bb..7a49b9b515 100644 --- a/scene/resources/particles_material.cpp +++ b/scene/resources/particles_material.cpp @@ -488,6 +488,12 @@ void ParticlesMaterial::_update_shader() { code += " float degree_to_rad = pi / 180.0;\n"; code += "\n"; + if (emission_shape == EMISSION_SHAPE_POINTS || emission_shape == EMISSION_SHAPE_DIRECTED_POINTS) { + code += " int point = min(emission_texture_point_count - 1, int(rand_from_seed(alt_seed) * float(emission_texture_point_count)));\n"; + code += " ivec2 emission_tex_size = textureSize(emission_texture_points, 0);\n"; + code += " ivec2 emission_tex_ofs = ivec2(point % emission_tex_size.x, point / emission_tex_size.x);\n"; + } + code += " CUSTOM.y += DELTA / LIFETIME;\n"; code += " float tv = CUSTOM.y / CUSTOM.w;\n"; if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { diff --git a/scene/resources/particles_material.h b/scene/resources/particles_material.h index 24341d964d..af45593f38 100644 --- a/scene/resources/particles_material.h +++ b/scene/resources/particles_material.h @@ -110,7 +110,7 @@ private: uint32_t key = 0; static uint32_t hash(const MaterialKey &p_key) { - return hash_djb2_one_32(p_key.key); + return hash_murmur3_one_32(p_key.key); } bool operator==(const MaterialKey &p_key) const { diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index f8fb51ae42..b2fd8eb895 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -2435,7 +2435,7 @@ void TextMesh::_create_mesh_array(Array &p_arr) const { } if (glyphs[i].font_rid != RID()) { uint32_t hash = hash_one_uint64(glyphs[i].font_rid.get_id()); - hash = hash_djb2_one_32(glyphs[i].index, hash); + hash = hash_murmur3_one_32(glyphs[i].index, hash); _generate_glyph_mesh_data(hash, glyphs[i]); GlyphMeshData &gl_data = cache[hash]; @@ -2494,7 +2494,7 @@ void TextMesh::_create_mesh_array(Array &p_arr) const { } if (glyphs[i].font_rid != RID()) { uint32_t hash = hash_one_uint64(glyphs[i].font_rid.get_id()); - hash = hash_djb2_one_32(glyphs[i].index, hash); + hash = hash_murmur3_one_32(glyphs[i].index, hash); const GlyphMeshData &gl_data = cache[hash]; diff --git a/scene/resources/scene_replication_config.cpp b/scene/resources/scene_replication_config.cpp index 4aea04bf87..6789f9f7d5 100644 --- a/scene/resources/scene_replication_config.cpp +++ b/scene/resources/scene_replication_config.cpp @@ -52,11 +52,19 @@ bool SceneReplicationConfig::_set(const StringName &p_name, const Variant &p_val ReplicationProperty &prop = properties[idx]; if (what == "sync") { prop.sync = p_value; - sync_props.push_back(prop.name); + if (prop.sync) { + sync_props.push_back(prop.name); + } else { + sync_props.erase(prop.name); + } return true; } else if (what == "spawn") { prop.spawn = p_value; - spawn_props.push_back(prop.name); + if (prop.spawn) { + spawn_props.push_back(prop.name); + } else { + spawn_props.erase(prop.name); + } return true; } } diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index 77d6e3c6f9..9829c7e86b 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -141,7 +141,8 @@ uint32_t SurfaceTool::VertexHasher::hash(const Vertex &p_vtx) { h = hash_djb2_buffer((const uint8_t *)p_vtx.bones.ptr(), p_vtx.bones.size() * sizeof(int), h); h = hash_djb2_buffer((const uint8_t *)p_vtx.weights.ptr(), p_vtx.weights.size() * sizeof(float), h); h = hash_djb2_buffer((const uint8_t *)&p_vtx.custom[0], sizeof(Color) * RS::ARRAY_CUSTOM_COUNT, h); - h = hash_djb2_one_32(p_vtx.smooth_group, h); + h = hash_murmur3_one_32(p_vtx.smooth_group, h); + h = hash_fmix32(h); return h; } diff --git a/servers/audio/effects/audio_effect_record.cpp b/servers/audio/effects/audio_effect_record.cpp index d68522e5b9..a6553e1431 100644 --- a/servers/audio/effects/audio_effect_record.cpp +++ b/servers/audio/effects/audio_effect_record.cpp @@ -71,8 +71,6 @@ bool AudioEffectRecordInstance::process_silence() const { } void AudioEffectRecordInstance::_io_thread_process() { - thread_active = true; - while (is_recording) { //Check: The current recording has been requested to stop if (!base->recording_active) { @@ -86,8 +84,6 @@ void AudioEffectRecordInstance::_io_thread_process() { OS::get_singleton()->delay_usec(500); } } - - thread_active = false; } void AudioEffectRecordInstance::_io_store_buffer() { diff --git a/servers/audio/effects/audio_effect_record.h b/servers/audio/effects/audio_effect_record.h index 305484d1cb..8a6247e27a 100644 --- a/servers/audio/effects/audio_effect_record.h +++ b/servers/audio/effects/audio_effect_record.h @@ -48,7 +48,6 @@ class AudioEffectRecordInstance : public AudioEffectInstance { bool is_recording; Thread io_thread; - bool thread_active = false; Vector<AudioFrame> ring_buffer; Vector<float> recording_data; diff --git a/servers/physics_2d/godot_area_2d.h b/servers/physics_2d/godot_area_2d.h index 35dad9d2c3..221982cf78 100644 --- a/servers/physics_2d/godot_area_2d.h +++ b/servers/physics_2d/godot_area_2d.h @@ -70,9 +70,9 @@ class GodotArea2D : public GodotCollisionObject2D { static uint32_t hash(const BodyKey &p_key) { uint32_t h = hash_one_uint64(p_key.rid.get_id()); - h = hash_djb2_one_64(p_key.instance_id, h); - h = hash_djb2_one_32(p_key.area_shape, h); - return hash_djb2_one_32(p_key.body_shape, h); + h = hash_murmur3_one_64(p_key.instance_id, h); + h = hash_murmur3_one_32(p_key.area_shape, h); + return hash_fmix32(hash_murmur3_one_32(p_key.body_shape, h)); } _FORCE_INLINE_ bool operator==(const BodyKey &p_key) const { diff --git a/servers/physics_3d/godot_area_3d.h b/servers/physics_3d/godot_area_3d.h index a00451f602..51b435eb00 100644 --- a/servers/physics_3d/godot_area_3d.h +++ b/servers/physics_3d/godot_area_3d.h @@ -74,9 +74,9 @@ class GodotArea3D : public GodotCollisionObject3D { static uint32_t hash(const BodyKey &p_key) { uint32_t h = hash_one_uint64(p_key.rid.get_id()); - h = hash_djb2_one_64(p_key.instance_id, h); - h = hash_djb2_one_32(p_key.area_shape, h); - return hash_djb2_one_32(p_key.body_shape, h); + h = hash_murmur3_one_64(p_key.instance_id, h); + h = hash_murmur3_one_32(p_key.area_shape, h); + return hash_fmix32(hash_murmur3_one_32(p_key.body_shape, h)); } _FORCE_INLINE_ bool operator==(const BodyKey &p_key) const { 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 2d3998bd90..d390614e53 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -692,6 +692,11 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat projection = correction * p_render_data->view_projection[v]; RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); RendererStorageRD::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.taa_jitter[0] = p_render_data->taa_jitter.x; 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 6ad42bf0ec..97f39164a4 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -237,6 +237,7 @@ class RenderForwardClustered : public RendererSceneRenderRD { 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]; 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 b2e0af06cd..eae5685dd1 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -1542,6 +1542,11 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data, projection = correction * p_render_data->view_projection[v]; RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); RendererStorageRD::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; 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 fc6f32ecb0..1b2df0ab9f 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -260,6 +260,7 @@ protected: 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]; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index ef959bc3c6..a50a05d905 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -5115,12 +5115,12 @@ void RendererSceneRenderRD::render_scene(RID p_render_buffers, const CameraData // 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.view_projection[0] = p_camera_data->main_projection; render_data.cam_orthogonal = p_camera_data->is_orthogonal; render_data.taa_jitter = p_camera_data->taa_jitter; render_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]; } diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index 1b1df6469e..a90c165d83 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -58,6 +58,7 @@ struct RenderDataRD { // For stereo rendering uint32_t view_count = 1; + Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; CameraMatrix view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; Transform3D prev_cam_transform; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl index 92c4fc3d67..b992e948c3 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl @@ -634,7 +634,11 @@ void fragment_shader(in SceneData scene_data) { //lay out everything, whatever is unused is optimized away anyway vec3 vertex = vertex_interp; +#ifdef USE_MULTIVIEW + vec3 view = -normalize(vertex_interp - scene_data.eye_offset[ViewIndex].xyz); +#else vec3 view = -normalize(vertex_interp); +#endif vec3 albedo = vec3(1.0); vec3 backlight = vec3(0.0); vec4 transmittance_color = vec4(0.0, 0.0, 0.0, 1.0); @@ -1191,7 +1195,7 @@ void fragment_shader(in SceneData scene_data) { if (sc_use_forward_gi && bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_VOXEL_GI)) { // process voxel_gi_instances uint index1 = instances.data[instance_index].gi_offset & 0xFFFF; - vec3 ref_vec = normalize(reflect(normalize(vertex), normal)); + vec3 ref_vec = normalize(reflect(-view, normal)); //find arbitrary tangent and bitangent, then build a matrix vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0); vec3 tangent = normalize(cross(v0, normal)); @@ -1309,7 +1313,7 @@ void fragment_shader(in SceneData scene_data) { #else vec3 bent_normal = normal; #endif - reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); + reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); } } diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl index b700e21543..32ea83397a 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl @@ -180,6 +180,7 @@ struct SceneData { // 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; @@ -250,7 +251,7 @@ struct SceneData { bool pancake_shadows; vec2 taa_jitter; - uvec2 pad; + uvec2 pad2; }; layout(set = 1, binding = 0, std140) uniform SceneDataBlock { 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 5a308bbd02..c92b29b14a 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -869,7 +869,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v diffuse_light, specular_light); } -void reflection_process(uint ref_index, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) { +void reflection_process(uint ref_index, vec3 view, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) { vec3 box_extents = reflections.data[ref_index].box_extents; vec3 local_pos = (reflections.data[ref_index].local_matrix * vec4(vertex, 1.0)).xyz; @@ -877,7 +877,7 @@ void reflection_process(uint ref_index, vec3 vertex, vec3 normal, float roughnes return; } - vec3 ref_vec = normalize(reflect(vertex, normal)); + vec3 ref_vec = normalize(reflect(-view, normal)); vec3 inner_pos = abs(local_pos / box_extents); float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z)); diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl index e15ebbfc91..cd94908c31 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl @@ -586,7 +586,11 @@ void main() { //lay out everything, whatever is unused is optimized away anyway vec3 vertex = vertex_interp; +#ifdef USE_MULTIVIEW + vec3 view = -normalize(vertex_interp - scene_data.eye_offset[ViewIndex].xyz); +#else vec3 view = -normalize(vertex_interp); +#endif vec3 albedo = vec3(1.0); vec3 backlight = vec3(0.0); vec4 transmittance_color = vec4(0.0); @@ -1051,7 +1055,7 @@ void main() { #else vec3 bent_normal = normal; #endif - reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); + reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); } if (reflection_accum.a > 0.0) { diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl index dd14a15837..7413d8730a 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl @@ -134,6 +134,7 @@ struct SceneData { // 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; diff --git a/servers/rendering/renderer_rd/uniform_set_cache_rd.h b/servers/rendering/renderer_rd/uniform_set_cache_rd.h index e49cf4dafa..af22a48716 100644 --- a/servers/rendering/renderer_rd/uniform_set_cache_rd.h +++ b/servers/rendering/renderer_rd/uniform_set_cache_rd.h @@ -57,13 +57,13 @@ class UniformSetCacheRD : public Object { Cache *hash_table[HASH_TABLE_SIZE] = {}; static _FORCE_INLINE_ uint32_t _hash_uniform(const RD::Uniform &u, uint32_t h) { - h = hash_djb2_one_32(u.uniform_type, h); - h = hash_djb2_one_32(u.binding, h); + h = hash_murmur3_one_32(u.uniform_type, h); + h = hash_murmur3_one_32(u.binding, h); uint32_t rsize = u.get_id_count(); for (uint32_t j = 0; j < rsize; j++) { - h = hash_djb2_one_64(u.get_id(j).get_id(), h); + h = hash_murmur3_one_64(u.get_id(j).get_id(), h); } - return h; + return hash_fmix32(h); } static _FORCE_INLINE_ bool _compare_uniform(const RD::Uniform &a, const RD::Uniform &b) { @@ -154,8 +154,8 @@ class UniformSetCacheRD : public Object { public: template <typename... Args> RID get_cache(RID p_shader, uint32_t p_set, Args... args) { - uint32_t h = hash_djb2_one_64(p_shader.get_id()); - h = hash_djb2_one_32(p_set, h); + uint32_t h = hash_murmur3_one_64(p_shader.get_id()); + h = hash_murmur3_one_32(p_set, h); h = _hash_args(h, args...); uint32_t table_idx = h % HASH_TABLE_SIZE; @@ -180,12 +180,14 @@ public: template <typename... Args> RID get_cache_vec(RID p_shader, uint32_t p_set, const Vector<RD::Uniform> &p_uniforms) { - uint32_t h = hash_djb2_one_64(p_shader.get_id()); - h = hash_djb2_one_32(p_set, h); + uint32_t h = hash_murmur3_one_64(p_shader.get_id()); + h = hash_murmur3_one_32(p_set, h); for (int i = 0; i < p_uniforms.size(); i++) { h = _hash_uniform(p_uniforms[i], h); } + h = hash_fmix32(h); + uint32_t table_idx = h % HASH_TABLE_SIZE; { const Cache *c = hash_table[table_idx]; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 26ab8b659e..9b407043fc 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2934,10 +2934,10 @@ void RenderingServer::init() { ProjectSettings::get_singleton()->set_custom_property_info("rendering/anti_aliasing/screen_space_roughness_limiter/amount", PropertyInfo(Variant::FLOAT, "rendering/anti_aliasing/screen_space_roughness_limiter/amount", PROPERTY_HINT_RANGE, "0.01,4.0,0.01")); ProjectSettings::get_singleton()->set_custom_property_info("rendering/anti_aliasing/screen_space_roughness_limiter/limit", PropertyInfo(Variant::FLOAT, "rendering/anti_aliasing/screen_space_roughness_limiter/limit", PROPERTY_HINT_RANGE, "0.01,1.0,0.01")); - GLOBAL_DEF_RST("rendering/scaling_3d/mode", 0); - GLOBAL_DEF_RST("rendering/scaling_3d/scale", 1.0); - GLOBAL_DEF_RST("rendering/scaling_3d/fsr_sharpness", 0.2f); - GLOBAL_DEF_RST("rendering/scaling_3d/fsr_mipmap_bias", 0.0f); + GLOBAL_DEF("rendering/scaling_3d/mode", 0); + GLOBAL_DEF("rendering/scaling_3d/scale", 1.0); + GLOBAL_DEF("rendering/scaling_3d/fsr_sharpness", 0.2f); + GLOBAL_DEF("rendering/scaling_3d/fsr_mipmap_bias", 0.0f); ProjectSettings::get_singleton()->set_custom_property_info("rendering/scaling_3d/mode", PropertyInfo(Variant::INT, "rendering/scaling_3d/mode", diff --git a/tests/core/object/test_class_db.h b/tests/core/object/test_class_db.h index 8aaca69d13..7ea9e16ff1 100644 --- a/tests/core/object/test_class_db.h +++ b/tests/core/object/test_class_db.h @@ -46,7 +46,7 @@ struct TypeReference { struct ConstantData { String name; - int value = 0; + int64_t value = 0; }; struct EnumData { @@ -743,7 +743,7 @@ void add_exposed_classes(Context &r_context) { TEST_FAIL_COND(String(constant_name).find("::") != -1, "Enum constant contains '::', check bindings to remove the scope: '", String(class_name), ".", String(enum_.name), ".", String(constant_name), "'."); - int *value = class_info->constant_map.getptr(constant_name); + int64_t *value = class_info->constant_map.getptr(constant_name); TEST_FAIL_COND(!value, "Missing enum constant value: '", String(class_name), ".", String(enum_.name), ".", String(constant_name), "'."); constants.erase(constant_name); @@ -765,7 +765,7 @@ void add_exposed_classes(Context &r_context) { TEST_FAIL_COND(constant_name.find("::") != -1, "Constant contains '::', check bindings to remove the scope: '", String(class_name), ".", constant_name, "'."); - int *value = class_info->constant_map.getptr(StringName(E)); + int64_t *value = class_info->constant_map.getptr(StringName(E)); TEST_FAIL_COND(!value, "Missing constant value: '", String(class_name), ".", String(constant_name), "'."); ConstantData constant; diff --git a/thirdparty/README.md b/thirdparty/README.md index daa074c15e..f56a97d25b 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -62,7 +62,7 @@ Files extracted from upstream source: ## doctest - Upstream: https://github.com/onqtam/doctest -- Version: 2.4.8 (7b9885133108ae301ddd16e2651320f54cafeba7, 2022) +- Version: 2.4.9 (b7c21ec5ceeadb4951b00396fc1e4642dd347e5f, 2022) - License: MIT Files extracted from upstream source: diff --git a/thirdparty/doctest/doctest.h b/thirdparty/doctest/doctest.h index d25f526827..aa2724c738 100644 --- a/thirdparty/doctest/doctest.h +++ b/thirdparty/doctest/doctest.h @@ -48,7 +48,7 @@ #define DOCTEST_VERSION_MAJOR 2 #define DOCTEST_VERSION_MINOR 4 -#define DOCTEST_VERSION_PATCH 8 +#define DOCTEST_VERSION_PATCH 9 // util we need here #define DOCTEST_TOSTR_IMPL(x) #x @@ -68,6 +68,12 @@ // ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect +#ifdef _MSC_VER +#define DOCTEST_CPLUSPLUS _MSVC_LANG +#else +#define DOCTEST_CPLUSPLUS __cplusplus +#endif + #define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH)) // GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl... @@ -153,7 +159,6 @@ DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables") \ DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded") \ DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes") \ - DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef") \ DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat") \ DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic") \ \ @@ -164,7 +169,6 @@ DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") \ DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing") \ DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations") \ - DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs") \ DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast") \ DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") \ \ @@ -231,7 +235,8 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define DOCTEST_MSVC_SUPPRESS_WARNING(4623) /* default constructor was implicitly deleted */ \ DOCTEST_MSVC_SUPPRESS_WARNING(5039) /* pointer to pot. throwing function passed to extern C */ \ DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \ - DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */ + DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */ \ + DOCTEST_MSVC_SUPPRESS_WARNING(4738) /* storing float result in memory, loss of performance */ #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP @@ -266,7 +271,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #endif // DOCTEST_CONFIG_NO_WINDOWS_SEH #if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && \ - !defined(__EMSCRIPTEN__) + !defined(__EMSCRIPTEN__) && !defined(__wasi__) #define DOCTEST_CONFIG_POSIX_SIGNALS #endif // _WIN32 #if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS) @@ -274,7 +279,8 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS -#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) +#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) \ + || defined(__wasi__) #define DOCTEST_CONFIG_NO_EXCEPTIONS #endif // no exceptions #endif // DOCTEST_CONFIG_NO_EXCEPTIONS @@ -289,6 +295,10 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS #endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS +#ifdef __wasi__ +#define DOCTEST_CONFIG_NO_MULTITHREADING +#endif + #if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT) #define DOCTEST_CONFIG_IMPLEMENT #endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN @@ -316,6 +326,16 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #define DOCTEST_INTERFACE #endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL +// needed for extern template instantiations +// see https://github.com/fmtlib/fmt/issues/2228 +#if DOCTEST_MSVC +#define DOCTEST_INTERFACE_DECL +#define DOCTEST_INTERFACE_DEF DOCTEST_INTERFACE +#else // DOCTEST_MSVC +#define DOCTEST_INTERFACE_DECL DOCTEST_INTERFACE +#define DOCTEST_INTERFACE_DEF +#endif // DOCTEST_MSVC + #define DOCTEST_EMPTY #if DOCTEST_MSVC @@ -351,8 +371,10 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #ifndef DOCTEST_CONSTEXPR #if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0)) #define DOCTEST_CONSTEXPR const +#define DOCTEST_CONSTEXPR_FUNC inline #else // DOCTEST_MSVC #define DOCTEST_CONSTEXPR constexpr +#define DOCTEST_CONSTEXPR_FUNC constexpr #endif // DOCTEST_MSVC #endif // DOCTEST_CONSTEXPR @@ -360,6 +382,17 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define // == FEATURE DETECTION END ======================================================================== // ================================================================================================= +#define DOCTEST_DECLARE_INTERFACE(name) \ + virtual ~name(); \ + name() = default; \ + name(const name&) = delete; \ + name(name&&) = delete; \ + name& operator=(const name&) = delete; \ + name& operator=(name&&) = delete; + +#define DOCTEST_DEFINE_INTERFACE(name) \ + name::~name() = default; + // internal macros for string concatenation and anonymous variable name generation #define DOCTEST_CAT_IMPL(s1, s2) s1##s2 #define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2) @@ -382,17 +415,19 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #define DOCTEST_PLATFORM_IPHONE #elif defined(_WIN32) #define DOCTEST_PLATFORM_WINDOWS +#elif defined(__wasi__) +#define DOCTEST_PLATFORM_WASI #else // DOCTEST_PLATFORM #define DOCTEST_PLATFORM_LINUX #endif // DOCTEST_PLATFORM namespace doctest { namespace detail { - static DOCTEST_CONSTEXPR int consume(const int*, int) { return 0; } + static DOCTEST_CONSTEXPR int consume(const int*, int) noexcept { return 0; } }} -#define DOCTEST_GLOBAL_NO_WARNINGS(var, ...) \ - DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \ - static const int var = doctest::detail::consume(&var, __VA_ARGS__); \ +#define DOCTEST_GLOBAL_NO_WARNINGS(var, ...) \ + DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \ + static const int var = doctest::detail::consume(&var, __VA_ARGS__); \ DOCTEST_CLANG_SUPPRESS_WARNING_POP #ifndef DOCTEST_BREAK_INTO_DEBUGGER @@ -400,16 +435,19 @@ namespace doctest { namespace detail { #ifdef DOCTEST_PLATFORM_LINUX #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) // Break at the location of the failing check if possible -#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT (hicpp-no-assembler) +#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler) #else #include <signal.h> #define DOCTEST_BREAK_INTO_DEBUGGER() raise(SIGTRAP) #endif #elif defined(DOCTEST_PLATFORM_MAC) #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__i386) -#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT (hicpp-no-assembler) +#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler) +#elif defined(__ppc__) || defined(__ppc64__) +// https://www.cocoawithlove.com/2008/03/break-into-debugger.html +#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n": : : "memory","r0","r3","r4") // NOLINT(hicpp-no-assembler) #else -#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("brk #0"); // NOLINT (hicpp-no-assembler) +#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("brk #0"); // NOLINT(hicpp-no-assembler) #endif #elif DOCTEST_MSVC #define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak() @@ -425,7 +463,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP // this is kept here for backwards compatibility since the config option was changed #ifdef DOCTEST_CONFIG_USE_IOSFWD +#ifndef DOCTEST_CONFIG_USE_STD_HEADERS #define DOCTEST_CONFIG_USE_STD_HEADERS +#endif #endif // DOCTEST_CONFIG_USE_IOSFWD // for clang - always include ciso646 (which drags some std stuff) because @@ -436,7 +476,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP #if DOCTEST_CLANG #include <ciso646> #ifdef _LIBCPP_VERSION +#ifndef DOCTEST_CONFIG_USE_STD_HEADERS #define DOCTEST_CONFIG_USE_STD_HEADERS +#endif #endif // _LIBCPP_VERSION #endif // clang @@ -444,26 +486,32 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP #ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS +DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN #include <cstddef> #include <ostream> #include <istream> +DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END #else // DOCTEST_CONFIG_USE_STD_HEADERS // Forward declaring 'X' in namespace std is not permitted by the C++ Standard. DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643) -namespace std { // NOLINT (cert-dcl58-cpp) -typedef decltype(nullptr) nullptr_t; +namespace std { // NOLINT(cert-dcl58-cpp) +typedef decltype(nullptr) nullptr_t; // NOLINT(modernize-use-using) +typedef decltype(sizeof(void*)) size_t; // NOLINT(modernize-use-using) template <class charT> struct char_traits; template <> struct char_traits<char>; template <class charT, class traits> -class basic_ostream; -typedef basic_ostream<char, char_traits<char>> ostream; +class basic_ostream; // NOLINT(fuchsia-virtual-inheritance) +typedef basic_ostream<char, char_traits<char>> ostream; // NOLINT(modernize-use-using) +template<class traits> +// NOLINTNEXTLINE +basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char*); template <class charT, class traits> class basic_istream; -typedef basic_istream<char, char_traits<char>> istream; +typedef basic_istream<char, char_traits<char>> istream; // NOLINT(modernize-use-using) template <class... Types> class tuple; #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) @@ -486,8 +534,14 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP namespace doctest { +using std::size_t; + DOCTEST_INTERFACE extern bool is_running_in_test; +#ifndef DOCTEST_CONFIG_STRING_SIZE_TYPE +#define DOCTEST_CONFIG_STRING_SIZE_TYPE unsigned +#endif + // A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length // of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for: // - "is small" bit - the highest bit - if "0" then it is small - otherwise its "1" (128) @@ -500,7 +554,6 @@ DOCTEST_INTERFACE extern bool is_running_in_test; // TODO: // - optimizations - like not deleting memory unnecessarily in operator= and etc. // - resize/reserve/clear -// - substr // - replace // - back/front // - iterator stuff @@ -510,64 +563,80 @@ DOCTEST_INTERFACE extern bool is_running_in_test; // - relational operators as free functions - taking const char* as one of the params class DOCTEST_INTERFACE String { - static const unsigned len = 24; //!OCLINT avoid private static members - static const unsigned last = len - 1; //!OCLINT avoid private static members +public: + using size_type = DOCTEST_CONFIG_STRING_SIZE_TYPE; + +private: + static DOCTEST_CONSTEXPR size_type len = 24; //!OCLINT avoid private static members + static DOCTEST_CONSTEXPR size_type last = len - 1; //!OCLINT avoid private static members struct view // len should be more than sizeof(view) - because of the final byte for flags { char* ptr; - unsigned size; - unsigned capacity; + size_type size; + size_type capacity; }; union { - char buf[len]; + char buf[len]; // NOLINT(*-avoid-c-arrays) view data; }; - char* allocate(unsigned sz); + char* allocate(size_type sz); - bool isOnStack() const { return (buf[last] & 128) == 0; } - void setOnHeap(); - void setLast(unsigned in = last); + bool isOnStack() const noexcept { return (buf[last] & 128) == 0; } + void setOnHeap() noexcept; + void setLast(size_type in = last) noexcept; + void setSize(size_type sz) noexcept; void copy(const String& other); public: - String(); + static DOCTEST_CONSTEXPR size_type npos = static_cast<size_type>(-1); + + String() noexcept; ~String(); // cppcheck-suppress noExplicitConstructor String(const char* in); - String(const char* in, unsigned in_size); + String(const char* in, size_type in_size); - String(std::istream& in, unsigned in_size); + String(std::istream& in, size_type in_size); String(const String& other); String& operator=(const String& other); String& operator+=(const String& other); - String(String&& other); - String& operator=(String&& other); + String(String&& other) noexcept; + String& operator=(String&& other) noexcept; - char operator[](unsigned i) const; - char& operator[](unsigned i); + char operator[](size_type i) const; + char& operator[](size_type i); // the only functions I'm willing to leave in the interface - available for inlining const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT char* c_str() { - if(isOnStack()) + if (isOnStack()) { return reinterpret_cast<char*>(buf); + } return data.ptr; } - unsigned size() const; - unsigned capacity() const; + size_type size() const; + size_type capacity() const; + + String substr(size_type pos, size_type cnt = npos) &&; + String substr(size_type pos, size_type cnt = npos) const &; + + size_type find(char ch, size_type pos = 0) const; + size_type rfind(char ch, size_type pos = npos) const; int compare(const char* other, bool no_case = false) const; int compare(const String& other, bool no_case = false) const; + +friend DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in); }; DOCTEST_INTERFACE String operator+(const String& lhs, const String& rhs); @@ -579,7 +648,21 @@ DOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs); DOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs); DOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs); -DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in); +class DOCTEST_INTERFACE Contains { +public: + explicit Contains(const String& string); + + bool checkWith(const String& other) const; + + String string; +}; + +DOCTEST_INTERFACE String toString(const Contains& in); + +DOCTEST_INTERFACE bool operator==(const String& lhs, const Contains& rhs); +DOCTEST_INTERFACE bool operator==(const Contains& lhs, const String& rhs); +DOCTEST_INTERFACE bool operator!=(const String& lhs, const Contains& rhs); +DOCTEST_INTERFACE bool operator!=(const Contains& lhs, const String& rhs); namespace Color { enum Enum @@ -652,7 +735,7 @@ namespace assertType { DT_WARN_THROWS_WITH = is_throws_with | is_warn, DT_CHECK_THROWS_WITH = is_throws_with | is_check, DT_REQUIRE_THROWS_WITH = is_throws_with | is_require, - + DT_WARN_THROWS_WITH_AS = is_throws_with | is_throws_as | is_warn, DT_CHECK_THROWS_WITH_AS = is_throws_with | is_throws_as | is_check, DT_REQUIRE_THROWS_WITH_AS = is_throws_with | is_throws_as | is_require, @@ -733,9 +816,27 @@ struct DOCTEST_INTERFACE AssertData String m_decomp; // for specific exception-related asserts - bool m_threw_as; - const char* m_exception_type; - const char* m_exception_string; + bool m_threw_as; + const char* m_exception_type; + + class DOCTEST_INTERFACE StringContains { + private: + Contains content; + bool isContains; + + public: + StringContains(const String& str) : content(str), isContains(false) { } + StringContains(Contains cntn) : content(static_cast<Contains&&>(cntn)), isContains(true) { } + + bool check(const String& str) { return isContains ? (content == str) : (content.string == str); } + + operator const String&() const { return content.string; } + + const char* c_str() const { return content.string.c_str(); } + } m_exception_string; + + AssertData(assertType::Enum at, const char* file, int line, const char* expr, + const char* exception_type, const StringContains& exception_string); }; struct DOCTEST_INTERFACE MessageData @@ -752,13 +853,13 @@ struct DOCTEST_INTERFACE SubcaseSignature const char* m_file; int m_line; + bool operator==(const SubcaseSignature& other) const; bool operator<(const SubcaseSignature& other) const; }; struct DOCTEST_INTERFACE IContextScope { - IContextScope(); - virtual ~IContextScope(); + DOCTEST_DECLARE_INTERFACE(IContextScope) virtual void stringify(std::ostream*) const = 0; }; @@ -815,200 +916,184 @@ struct ContextOptions //!OCLINT too many fields }; namespace detail { - template <bool CONDITION, typename TYPE = void> - struct enable_if - {}; + namespace types { +#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS + using namespace std; +#else + template <bool COND, typename T = void> + struct enable_if { }; + + template <typename T> + struct enable_if<true, T> { using type = T; }; - template <typename TYPE> - struct enable_if<true, TYPE> - { typedef TYPE type; }; + struct true_type { static DOCTEST_CONSTEXPR bool value = true; }; + struct false_type { static DOCTEST_CONSTEXPR bool value = false; }; - // clang-format off - template<class T> struct remove_reference { typedef T type; }; - template<class T> struct remove_reference<T&> { typedef T type; }; - template<class T> struct remove_reference<T&&> { typedef T type; }; + template <typename T> struct remove_reference { using type = T; }; + template <typename T> struct remove_reference<T&> { using type = T; }; + template <typename T> struct remove_reference<T&&> { using type = T; }; - template<typename T, typename U = T&&> U declval(int); + template <typename T> struct is_rvalue_reference : false_type { }; + template <typename T> struct is_rvalue_reference<T&&> : true_type { }; - template<typename T> T declval(long); + template<typename T> struct remove_const { using type = T; }; + template <typename T> struct remove_const<const T> { using type = T; }; - template<typename T> auto declval() DOCTEST_NOEXCEPT -> decltype(declval<T>(0)) ; + // Compiler intrinsics + template <typename T> struct is_enum { static DOCTEST_CONSTEXPR bool value = __is_enum(T); }; + template <typename T> struct underlying_type { using type = __underlying_type(T); }; - template<class T> struct is_lvalue_reference { const static bool value=false; }; - template<class T> struct is_lvalue_reference<T&> { const static bool value=true; }; + template <typename T> struct is_pointer : false_type { }; + template <typename T> struct is_pointer<T*> : true_type { }; + + template <typename T> struct is_array : false_type { }; + // NOLINTNEXTLINE(*-avoid-c-arrays) + template <typename T, size_t SIZE> struct is_array<T[SIZE]> : true_type { }; +#endif + } - template<class T> struct is_rvalue_reference { const static bool value=false; }; - template<class T> struct is_rvalue_reference<T&&> { const static bool value=true; }; + // <utility> + template <typename T> + T&& declval(); template <class T> - inline T&& forward(typename remove_reference<T>::type& t) DOCTEST_NOEXCEPT - { + DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type& t) DOCTEST_NOEXCEPT { return static_cast<T&&>(t); } template <class T> - inline T&& forward(typename remove_reference<T>::type&& t) DOCTEST_NOEXCEPT - { - static_assert(!is_lvalue_reference<T>::value, - "Can not forward an rvalue as an lvalue."); + DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type&& t) DOCTEST_NOEXCEPT { return static_cast<T&&>(t); } - template<class T> struct remove_const { typedef T type; }; - template<class T> struct remove_const<const T> { typedef T type; }; -#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS - template<class T> struct is_enum : public std::is_enum<T> {}; - template<class T> struct underlying_type : public std::underlying_type<T> {}; -#else - // Use compiler intrinsics - template<class T> struct is_enum { DOCTEST_CONSTEXPR static bool value = __is_enum(T); }; - template<class T> struct underlying_type { typedef __underlying_type(T) type; }; -#endif - // clang-format on + template <typename T> + struct deferred_false : types::false_type { }; + +// MSVS 2015 :( +#if defined(_MSC_VER) && _MSC_VER <= 1900 + template <typename T, typename = void> + struct has_global_insertion_operator : types::false_type { }; template <typename T> - struct deferred_false - // cppcheck-suppress unusedStructMember - { static const bool value = false; }; - - namespace has_insertion_operator_impl { - std::ostream &os(); - template<class T> - DOCTEST_REF_WRAP(T) val(); - - template<class, class = void> - struct check { - static DOCTEST_CONSTEXPR bool value = false; - }; + struct has_global_insertion_operator<T, decltype(::operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { }; - template<class T> - struct check<T, decltype(os() << val<T>(), void())> { - static DOCTEST_CONSTEXPR bool value = true; - }; - } // namespace has_insertion_operator_impl + template <typename T, typename = void> + struct has_insertion_operator { static DOCTEST_CONSTEXPR bool value = has_global_insertion_operator<T>::value; }; + + template <typename T, bool global> + struct insert_hack; + + template <typename T> + struct insert_hack<T, true> { + static void insert(std::ostream& os, const T& t) { ::operator<<(os, t); } + }; - template<class T> - using has_insertion_operator = has_insertion_operator_impl::check<const T>; + template <typename T> + struct insert_hack<T, false> { + static void insert(std::ostream& os, const T& t) { operator<<(os, t); } + }; + + template <typename T> + using insert_hack_t = insert_hack<T, has_global_insertion_operator<T>::value>; +#else + template <typename T, typename = void> + struct has_insertion_operator : types::false_type { }; +#endif + +template <typename T> +struct has_insertion_operator<T, decltype(operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { }; DOCTEST_INTERFACE std::ostream* tlssPush(); DOCTEST_INTERFACE String tlssPop(); - template <bool C> - struct StringMakerBase - { + struct StringMakerBase { template <typename T> static String convert(const DOCTEST_REF_WRAP(T)) { +#ifdef DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES + static_assert(deferred_false<T>::value, "No stringification detected for type T. See string conversion manual"); +#endif return "{?}"; } }; - // Vector<int> and various type other than pointer or array. - template<typename T> - struct filldata - { - static void fill(std::ostream* stream, const T &in) { - *stream << in; - } - }; - - template<typename T,unsigned long N> - struct filldata<T[N]> - { - static void fill(std::ostream* stream, const T (&in)[N]) { - for (unsigned long i = 0; i < N; i++) { - *stream << in[i]; - } - } - }; - - // Specialized since we don't want the terminating null byte! - template<unsigned long N> - struct filldata<const char[N]> - { - static void fill(std::ostream* stream, const char(&in)[N]) { - *stream << in; - } - }; + template <typename T> + struct filldata; - template<typename T> + template <typename T> void filloss(std::ostream* stream, const T& in) { filldata<T>::fill(stream, in); } - template<typename T,unsigned long N> - void filloss(std::ostream* stream, const T (&in)[N]) { + template <typename T, size_t N> + void filloss(std::ostream* stream, const T (&in)[N]) { // NOLINT(*-avoid-c-arrays) // T[N], T(&)[N], T(&&)[N] have same behaviour. // Hence remove reference. - filldata<typename remove_reference<decltype(in)>::type>::fill(stream, in); + filloss<typename types::remove_reference<decltype(in)>::type>(stream, in); + } + + template <typename T> + String toStream(const T& in) { + std::ostream* stream = tlssPush(); + filloss(stream, in); + return tlssPop(); } template <> - struct StringMakerBase<true> - { + struct StringMakerBase<true> { template <typename T> static String convert(const DOCTEST_REF_WRAP(T) in) { - /* When parameter "in" is a null terminated const char* it works. - * When parameter "in" is a T arr[N] without '\0' we can fill the - * stringstream with N objects (T=char).If in is char pointer * - * without '\0' , it would cause segfault - * stepping over unaccessible memory. - */ - - std::ostream* stream = tlssPush(); - filloss(stream, in); - return tlssPop(); + return toStream(in); } }; - - DOCTEST_INTERFACE String rawMemoryToString(const void* object, unsigned size); - - template <typename T> - String rawMemoryToString(const DOCTEST_REF_WRAP(T) object) { - return rawMemoryToString(&object, sizeof(object)); - } - - template <typename T> - const char* type_to_string() { - return "<>"; - } } // namespace detail template <typename T> -struct StringMaker : public detail::StringMakerBase<detail::has_insertion_operator<T>::value> +struct StringMaker : public detail::StringMakerBase< + detail::has_insertion_operator<T>::value || detail::types::is_pointer<T>::value || detail::types::is_array<T>::value> {}; -template <typename T> -struct StringMaker<T*> -{ - template <typename U> - static String convert(U* p) { - if(p) - return detail::rawMemoryToString(p); - return "NULL"; - } -}; +#ifndef DOCTEST_STRINGIFY +#ifdef DOCTEST_CONFIG_DOUBLE_STRINGIFY +#define DOCTEST_STRINGIFY(...) toString(toString(__VA_ARGS__)) +#else +#define DOCTEST_STRINGIFY(...) toString(__VA_ARGS__) +#endif +#endif -template <typename R, typename C> -struct StringMaker<R C::*> -{ - static String convert(R C::*p) { - if(p) - return detail::rawMemoryToString(p); - return "NULL"; - } -}; +template <typename T> +String toString() { +#if DOCTEST_MSVC >= 0 && DOCTEST_CLANG == 0 && DOCTEST_GCC == 0 + String ret = __FUNCSIG__; // class doctest::String __cdecl doctest::toString<TYPE>(void) + String::size_type beginPos = ret.find('<'); + return ret.substr(beginPos + 1, ret.size() - beginPos - static_cast<String::size_type>(sizeof(">(void)"))); +#else + String ret = __PRETTY_FUNCTION__; // doctest::String toString() [with T = TYPE] + String::size_type begin = ret.find('=') + 2; + return ret.substr(begin, ret.size() - begin - 1); +#endif +} -template <typename T, typename detail::enable_if<!detail::is_enum<T>::value, bool>::type = true> +template <typename T, typename detail::types::enable_if<!detail::types::is_enum<T>::value, bool>::type = true> String toString(const DOCTEST_REF_WRAP(T) value) { return StringMaker<T>::convert(value); } #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING -DOCTEST_INTERFACE String toString(char* in); DOCTEST_INTERFACE String toString(const char* in); #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING + +#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) +// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183 +DOCTEST_INTERFACE String toString(const std::string& in); +#endif // VS 2019 + +DOCTEST_INTERFACE String toString(String in); + +DOCTEST_INTERFACE String toString(std::nullptr_t); + DOCTEST_INTERFACE String toString(bool in); + DOCTEST_INTERFACE String toString(float in); DOCTEST_INTERFACE String toString(double in); DOCTEST_INTERFACE String toString(double long in); @@ -1016,40 +1101,85 @@ DOCTEST_INTERFACE String toString(double long in); DOCTEST_INTERFACE String toString(char in); DOCTEST_INTERFACE String toString(char signed in); DOCTEST_INTERFACE String toString(char unsigned in); -DOCTEST_INTERFACE String toString(int short in); -DOCTEST_INTERFACE String toString(int short unsigned in); -DOCTEST_INTERFACE String toString(int in); -DOCTEST_INTERFACE String toString(int unsigned in); -DOCTEST_INTERFACE String toString(int long in); -DOCTEST_INTERFACE String toString(int long unsigned in); -DOCTEST_INTERFACE String toString(int long long in); -DOCTEST_INTERFACE String toString(int long long unsigned in); -DOCTEST_INTERFACE String toString(std::nullptr_t in); - -template <typename T, typename detail::enable_if<detail::is_enum<T>::value, bool>::type = true> +DOCTEST_INTERFACE String toString(short in); +DOCTEST_INTERFACE String toString(short unsigned in); +DOCTEST_INTERFACE String toString(signed in); +DOCTEST_INTERFACE String toString(unsigned in); +DOCTEST_INTERFACE String toString(long in); +DOCTEST_INTERFACE String toString(long unsigned in); +DOCTEST_INTERFACE String toString(long long in); +DOCTEST_INTERFACE String toString(long long unsigned in); + +template <typename T, typename detail::types::enable_if<detail::types::is_enum<T>::value, bool>::type = true> String toString(const DOCTEST_REF_WRAP(T) value) { - typedef typename detail::underlying_type<T>::type UT; - return toString(static_cast<UT>(value)); + using UT = typename detail::types::underlying_type<T>::type; + return (DOCTEST_STRINGIFY(static_cast<UT>(value))); } -#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) -// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183 -DOCTEST_INTERFACE String toString(const std::string& in); -#endif // VS 2019 +namespace detail { + template <typename T> + struct filldata + { + static void fill(std::ostream* stream, const T& in) { +#if defined(_MSC_VER) && _MSC_VER <= 1900 + insert_hack_t<T>::insert(*stream, in); +#else + operator<<(*stream, in); +#endif + } + }; + +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866) +// NOLINTBEGIN(*-avoid-c-arrays) + template <typename T, size_t N> + struct filldata<T[N]> { + static void fill(std::ostream* stream, const T(&in)[N]) { + *stream << "["; + for (size_t i = 0; i < N; i++) { + if (i != 0) { *stream << ", "; } + *stream << (DOCTEST_STRINGIFY(in[i])); + } + *stream << "]"; + } + }; +// NOLINTEND(*-avoid-c-arrays) +DOCTEST_MSVC_SUPPRESS_WARNING_POP -class DOCTEST_INTERFACE Approx + // Specialized since we don't want the terminating null byte! +// NOLINTBEGIN(*-avoid-c-arrays) + template <size_t N> + struct filldata<const char[N]> { + static void fill(std::ostream* stream, const char (&in)[N]) { + *stream << String(in, in[N - 1] ? N : N - 1); + } // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks) + }; +// NOLINTEND(*-avoid-c-arrays) + + template <> + struct filldata<const void*> { + static void fill(std::ostream* stream, const void* in); + }; + + template <typename T> + struct filldata<T*> { + static void fill(std::ostream* stream, const T* in) { + filldata<const void*>::fill(stream, in); + } + }; +} + +struct DOCTEST_INTERFACE Approx { -public: - explicit Approx(double value); + Approx(double value); Approx operator()(double value) const; #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS template <typename T> explicit Approx(const T& value, - typename detail::enable_if<std::is_constructible<double, T>::value>::type* = + typename detail::types::enable_if<std::is_constructible<double, T>::value>::type* = static_cast<T*>(nullptr)) { - *this = Approx(static_cast<double>(value)); + *this = static_cast<double>(value); } #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS @@ -1057,7 +1187,7 @@ public: #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS template <typename T> - typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon( + typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon( const T& newEpsilon) { m_epsilon = static_cast<double>(newEpsilon); return *this; @@ -1068,7 +1198,7 @@ public: #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS template <typename T> - typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale( + typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale( const T& newScale) { m_scale = static_cast<double>(newScale); return *this; @@ -1089,30 +1219,27 @@ public: DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs); DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs); - DOCTEST_INTERFACE friend String toString(const Approx& in); - #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #define DOCTEST_APPROX_PREFIX \ - template <typename T> friend typename detail::enable_if<std::is_constructible<double, T>::value, bool>::type + template <typename T> friend typename std::enable_if<std::is_constructible<double, T>::value, bool>::type - DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(double(lhs), rhs); } + DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(static_cast<double>(lhs), rhs); } DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); } DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); } DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); } - DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value || lhs == rhs; } - DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) || lhs == rhs; } - DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value || lhs == rhs; } - DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) || lhs == rhs; } - DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value && lhs != rhs; } - DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) && lhs != rhs; } - DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value && lhs != rhs; } - DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) && lhs != rhs; } + DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; } + DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; } + DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; } + DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) || lhs == rhs; } + DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value && lhs != rhs; } + DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) && lhs != rhs; } + DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value && lhs != rhs; } + DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) && lhs != rhs; } #undef DOCTEST_APPROX_PREFIX #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS // clang-format on -private: double m_epsilon; double m_scale; double m_value; @@ -1122,18 +1249,35 @@ DOCTEST_INTERFACE String toString(const Approx& in); DOCTEST_INTERFACE const ContextOptions* getContextOptions(); -#if !defined(DOCTEST_CONFIG_DISABLE) +template <typename F> +struct DOCTEST_INTERFACE_DECL IsNaN +{ + F value; bool flipped; + IsNaN(F f, bool flip = false) : value(f), flipped(flip) { } + IsNaN<F> operator!() const { return { value, !flipped }; } + operator bool() const; +}; +#ifndef __MINGW32__ +extern template struct DOCTEST_INTERFACE_DECL IsNaN<float>; +extern template struct DOCTEST_INTERFACE_DECL IsNaN<double>; +extern template struct DOCTEST_INTERFACE_DECL IsNaN<long double>; +#endif +DOCTEST_INTERFACE String toString(IsNaN<float> in); +DOCTEST_INTERFACE String toString(IsNaN<double> in); +DOCTEST_INTERFACE String toString(IsNaN<double long> in); + +#ifndef DOCTEST_CONFIG_DISABLE namespace detail { // clang-format off #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING - template<class T> struct decay_array { typedef T type; }; - template<class T, unsigned N> struct decay_array<T[N]> { typedef T* type; }; - template<class T> struct decay_array<T[]> { typedef T* type; }; + template<class T> struct decay_array { using type = T; }; + template<class T, unsigned N> struct decay_array<T[N]> { using type = T*; }; + template<class T> struct decay_array<T[]> { using type = T*; }; - template<class T> struct not_char_pointer { enum { value = 1 }; }; - template<> struct not_char_pointer<char*> { enum { value = 0 }; }; - template<> struct not_char_pointer<const char*> { enum { value = 0 }; }; + template<class T> struct not_char_pointer { static DOCTEST_CONSTEXPR value = 1; }; + template<> struct not_char_pointer<char*> { static DOCTEST_CONSTEXPR value = 0; }; + template<> struct not_char_pointer<const char*> { static DOCTEST_CONSTEXPR value = 0; }; template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {}; #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING @@ -1156,16 +1300,22 @@ namespace detail { bool m_entered = false; Subcase(const String& name, const char* file, int line); + Subcase(const Subcase&) = delete; + Subcase(Subcase&&) = delete; + Subcase& operator=(const Subcase&) = delete; + Subcase& operator=(Subcase&&) = delete; ~Subcase(); operator bool() const; + + private: + bool checkFilters(); }; template <typename L, typename R> String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op, const DOCTEST_REF_WRAP(R) rhs) { - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) - return toString(lhs) + op + toString(rhs); + return (DOCTEST_STRINGIFY(lhs)) + op + (DOCTEST_STRINGIFY(rhs)); } #if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0) @@ -1180,17 +1330,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") #define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \ template <typename R> \ - DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(const R&& rhs) { \ - bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<const R>(rhs)); \ - if(m_at & assertType::is_false) \ - res = !res; \ - if(!res || doctest::getContextOptions()->success) \ - return Result(res, stringifyBinaryExpr(lhs, op_str, rhs)); \ - return Result(res); \ - } \ - template <typename R ,typename enable_if<!doctest::detail::is_rvalue_reference<R>::value, void >::type* = nullptr> \ - DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(const R& rhs) { \ - bool res = op_macro(doctest::detail::forward<const L>(lhs), rhs); \ + DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(R&& rhs) { \ + bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<R>(rhs)); \ if(m_at & assertType::is_false) \ res = !res; \ if(!res || doctest::getContextOptions()->success) \ @@ -1209,12 +1350,12 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") return *this; \ } - struct DOCTEST_INTERFACE Result + struct DOCTEST_INTERFACE Result // NOLINT(*-member-init) { bool m_passed; String m_decomp; - Result() = default; + Result() = default; // TODO: Why do we need this? (To remove NOLINT) Result(bool passed, const String& decomposition = String()); // forbidding some expressions based on this table: https://en.cppreference.com/w/cpp/language/operator_precedence @@ -1271,8 +1412,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") #ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING #define DOCTEST_COMPARISON_RETURN_TYPE bool #else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING -#define DOCTEST_COMPARISON_RETURN_TYPE typename enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) +#define DOCTEST_COMPARISON_RETURN_TYPE typename types::enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); } inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); } inline bool lt(const char* lhs, const char* rhs) { return String(lhs) < String(rhs); } @@ -1320,7 +1460,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") assertType::Enum m_at; explicit Expression_lhs(L&& in, assertType::Enum at) - : lhs(doctest::detail::forward<L>(in)) + : lhs(static_cast<L&&>(in)) , m_at(at) {} DOCTEST_NOINLINE operator Result() { @@ -1328,12 +1468,14 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4800) // 'int': forcing value to bool bool res = static_cast<bool>(lhs); DOCTEST_MSVC_SUPPRESS_WARNING_POP - if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional + if(m_at & assertType::is_false) { //!OCLINT bitwise operator in conditional res = !res; + } - if(!res || getContextOptions()->success) - return Result(res, toString(lhs)); - return Result(res); + if(!res || getContextOptions()->success) { + return { res, (DOCTEST_STRINGIFY(lhs)) }; + } + return { res }; } /* This is required for user-defined conversions from Expression_lhs to L */ @@ -1394,11 +1536,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP // https://github.com/catchorg/Catch2/issues/870 // https://github.com/catchorg/Catch2/issues/565 template <typename L> - Expression_lhs<const L> operator<<(const L &&operand) { - return Expression_lhs<const L>(doctest::detail::forward<const L>(operand), m_at); + Expression_lhs<L> operator<<(L&& operand) { + return Expression_lhs<L>(static_cast<L&&>(operand), m_at); } - template <typename L,typename enable_if<!doctest::detail::is_rvalue_reference<L>::value,void >::type* = nullptr> + template <typename L,typename types::enable_if<!doctest::detail::types::is_rvalue_reference<L>::value,void >::type* = nullptr> Expression_lhs<const L&> operator<<(const L &operand) { return Expression_lhs<const L&>(operand, m_at); } @@ -1425,25 +1567,28 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP } }; - typedef void (*funcType)(); + using funcType = void (*)(); struct DOCTEST_INTERFACE TestCase : public TestCaseData { funcType m_test; // a function pointer to the test case - const char* m_type; // for templated test cases - gets appended to the real name + String m_type; // for templated test cases - gets appended to the real name int m_template_id; // an ID used to distinguish between the different versions of a templated test case String m_full_name; // contains the name (only for templated test cases!) + the template type TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite, - const char* type = "", int template_id = -1); + const String& type = String(), int template_id = -1); TestCase(const TestCase& other); + TestCase(TestCase&&) = delete; DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function TestCase& operator=(const TestCase& other); DOCTEST_MSVC_SUPPRESS_WARNING_POP + TestCase& operator=(TestCase&&) = delete; + TestCase& operator*(const char* in); template <typename T> @@ -1453,6 +1598,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP } bool operator<(const TestCase& other) const; + + ~TestCase() = default; }; // forward declarations of functions used by the macros @@ -1492,7 +1639,10 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP struct DOCTEST_INTERFACE ResultBuilder : public AssertData { ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr, - const char* exception_type = "", const char* exception_string = ""); + const char* exception_type = "", const String& exception_string = ""); + + ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr, + const char* exception_type, const Contains& exception_string); void setResult(const Result& res); @@ -1500,8 +1650,9 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_NOINLINE bool binary_assert(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) { m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs); - if(m_failed || getContextOptions()->success) + if (m_failed || getContextOptions()->success) { m_decomp = stringifyBinaryExpr(lhs, ", ", rhs); + } return !m_failed; } @@ -1509,11 +1660,13 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val) { m_failed = !val; - if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional + if (m_at & assertType::is_false) { //!OCLINT bitwise operator in conditional m_failed = !m_failed; + } - if(m_failed || getContextOptions()->success) - m_decomp = toString(val); + if (m_failed || getContextOptions()->success) { + m_decomp = (DOCTEST_STRINGIFY(val)); + } return !m_failed; } @@ -1536,7 +1689,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad); DOCTEST_INTERFACE bool decomp_assert(assertType::Enum at, const char* file, int line, - const char* expr, Result result); + const char* expr, const Result& result); #define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \ do { \ @@ -1592,15 +1745,14 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED // ################################################################################### - DOCTEST_ASSERT_OUT_OF_TESTS(toString(val)); - DOCTEST_ASSERT_IN_TESTS(toString(val)); + DOCTEST_ASSERT_OUT_OF_TESTS((DOCTEST_STRINGIFY(val))); + DOCTEST_ASSERT_IN_TESTS((DOCTEST_STRINGIFY(val))); return !failed; } struct DOCTEST_INTERFACE IExceptionTranslator { - IExceptionTranslator(); - virtual ~IExceptionTranslator(); + DOCTEST_DECLARE_INTERFACE(IExceptionTranslator) virtual bool translate(String&) const = 0; }; @@ -1616,7 +1768,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP try { throw; // lgtm [cpp/rethrow-no-exception] // cppcheck-suppress catchExceptionByValue - } catch(T ex) { // NOLINT + } catch(const T& ex) { res = m_translateFunction(ex); //!OCLINT parameter reassignment return true; } catch(...) {} //!OCLINT - empty catch statement @@ -1631,64 +1783,19 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et); - template <bool C> - struct StringStreamBase - { - template <typename T> - static void convert(std::ostream* s, const T& in) { - *s << toString(in); - } - - // always treat char* as a string in this context - no matter - // if DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING is defined - static void convert(std::ostream* s, const char* in) { *s << String(in); } - }; - - template <> - struct StringStreamBase<true> - { - template <typename T> - static void convert(std::ostream* s, const T& in) { - *s << in; - } - }; + // ContextScope base class used to allow implementing methods of ContextScope + // that don't depend on the template parameter in doctest.cpp. + struct DOCTEST_INTERFACE ContextScopeBase : public IContextScope { + ContextScopeBase(const ContextScopeBase&) = delete; - template <typename T> - struct StringStream : public StringStreamBase<has_insertion_operator<T>::value> - {}; + ContextScopeBase& operator=(const ContextScopeBase&) = delete; + ContextScopeBase& operator=(ContextScopeBase&&) = delete; - template <typename T> - void toStream(std::ostream* s, const T& value) { - StringStream<T>::convert(s, value); - } + ~ContextScopeBase() override = default; -#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING - DOCTEST_INTERFACE void toStream(std::ostream* s, char* in); - DOCTEST_INTERFACE void toStream(std::ostream* s, const char* in); -#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING - DOCTEST_INTERFACE void toStream(std::ostream* s, bool in); - DOCTEST_INTERFACE void toStream(std::ostream* s, float in); - DOCTEST_INTERFACE void toStream(std::ostream* s, double in); - DOCTEST_INTERFACE void toStream(std::ostream* s, double long in); - - DOCTEST_INTERFACE void toStream(std::ostream* s, char in); - DOCTEST_INTERFACE void toStream(std::ostream* s, char signed in); - DOCTEST_INTERFACE void toStream(std::ostream* s, char unsigned in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int short in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int short unsigned in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int unsigned in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int long in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int long unsigned in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int long long in); - DOCTEST_INTERFACE void toStream(std::ostream* s, int long long unsigned in); - - // ContextScope base class used to allow implementing methods of ContextScope - // that don't depend on the template parameter in doctest.cpp. - class DOCTEST_INTERFACE ContextScopeBase : public IContextScope { protected: ContextScopeBase(); - ContextScopeBase(ContextScopeBase&& other); + ContextScopeBase(ContextScopeBase&& other) noexcept; void destroy(); bool need_to_destroy{true}; @@ -1696,12 +1803,17 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP template <typename L> class ContextScope : public ContextScopeBase { - const L lambda_; + L lambda_; public: explicit ContextScope(const L &lambda) : lambda_(lambda) {} + explicit ContextScope(L&& lambda) : lambda_(static_cast<L&&>(lambda)) { } - ContextScope(ContextScope &&other) : ContextScopeBase(static_cast<ContextScopeBase&&>(other)), lambda_(other.lambda_) {} + ContextScope(const ContextScope&) = delete; + ContextScope(ContextScope&&) noexcept = default; + + ContextScope& operator=(const ContextScope&) = delete; + ContextScope& operator=(ContextScope&&) = delete; void stringify(std::ostream* s) const override { lambda_(s); } @@ -1718,15 +1830,23 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP bool logged = false; MessageBuilder(const char* file, int line, assertType::Enum severity); - MessageBuilder() = delete; + + MessageBuilder(const MessageBuilder&) = delete; + MessageBuilder(MessageBuilder&&) = delete; + + MessageBuilder& operator=(const MessageBuilder&) = delete; + MessageBuilder& operator=(MessageBuilder&&) = delete; + ~MessageBuilder(); // the preferred way of chaining parameters for stringification +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866) template <typename T> MessageBuilder& operator,(const T& in) { - toStream(m_stream, in); + *m_stream << (DOCTEST_STRINGIFY(in)); return *this; } +DOCTEST_MSVC_SUPPRESS_WARNING_POP // kept here just for backwards-compatibility - the comma operator should be preferred now template <typename T> @@ -1742,7 +1862,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP bool log(); void react(); }; - + template <typename L> ContextScope<L> MakeContextScope(const L &lambda) { return ContextScope<L>(lambda); @@ -1795,7 +1915,7 @@ int registerExceptionTranslator(String (*)(T)) { #endif // DOCTEST_CONFIG_DISABLE namespace detail { - typedef void (*assert_handler)(const AssertData&); + using assert_handler = void (*)(const AssertData&); struct ContextState; } // namespace detail @@ -1808,7 +1928,13 @@ class DOCTEST_INTERFACE Context public: explicit Context(int argc = 0, const char* const* argv = nullptr); - ~Context(); + Context(const Context&) = delete; + Context(Context&&) = delete; + + Context& operator=(const Context&) = delete; + Context& operator=(Context&&) = delete; + + ~Context(); // NOLINT(performance-trivially-destructible) void applyCommandLine(int argc, const char* const* argv); @@ -1916,8 +2042,7 @@ struct DOCTEST_INTERFACE IReporter // or isn't in the execution range (between first and last) (safe to cache a pointer to the input) virtual void test_case_skipped(const TestCaseData&) = 0; - // doctest will not be managing the lifetimes of reporters given to it but this would still be nice to have - virtual ~IReporter(); + DOCTEST_DECLARE_INTERFACE(IReporter) // can obtain all currently active contexts and stringify them if one wishes to do so static int get_num_active_contexts(); @@ -1929,7 +2054,7 @@ struct DOCTEST_INTERFACE IReporter }; namespace detail { - typedef IReporter* (*reporterCreatorFunc)(const ContextOptions&); + using reporterCreatorFunc = IReporter* (*)(const ContextOptions&); DOCTEST_INTERFACE void registerReporterImpl(const char* name, int prio, reporterCreatorFunc c, bool isReporter); @@ -1946,15 +2071,30 @@ int registerReporter(const char* name, int priority, bool isReporter) { } } // namespace doctest +#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES +#define DOCTEST_FUNC_EMPTY [] { return false; }() +#else +#define DOCTEST_FUNC_EMPTY (void)0 +#endif + // if registering is not disabled -#if !defined(DOCTEST_CONFIG_DISABLE) +#ifndef DOCTEST_CONFIG_DISABLE + +#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES +#define DOCTEST_FUNC_SCOPE_BEGIN [&] +#define DOCTEST_FUNC_SCOPE_END () +#define DOCTEST_FUNC_SCOPE_RET(v) return v +#else +#define DOCTEST_FUNC_SCOPE_BEGIN do +#define DOCTEST_FUNC_SCOPE_END while(false) +#define DOCTEST_FUNC_SCOPE_RET(v) (void)0 +#endif // common code in asserts - for convenience #define DOCTEST_ASSERT_LOG_REACT_RETURN(b) \ - if(b.log()) \ - DOCTEST_BREAK_INTO_DEBUGGER(); \ - b.react(); \ - return !b.m_failed + if(b.log()) DOCTEST_BREAK_INTO_DEBUGGER(); \ + b.react(); \ + DOCTEST_FUNC_SCOPE_RET(!b.m_failed) #ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS #define DOCTEST_WRAP_IN_TRY(x) x; @@ -1976,7 +2116,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { // registers the test by initializing a dummy var with a function #define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators) \ - global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \ + global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT */ \ doctest::detail::regTest( \ doctest::detail::TestCase( \ f, __FILE__, __LINE__, \ @@ -1984,18 +2124,18 @@ int registerReporter(const char* name, int priority, bool isReporter) { decorators)) #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators) \ - namespace { \ + namespace { /* NOLINT */ \ struct der : public base \ { \ void f(); \ }; \ - static void func() { \ + static inline DOCTEST_NOINLINE void func() { \ der v; \ v.f(); \ } \ DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \ } \ - inline DOCTEST_NOINLINE void der::f() + inline DOCTEST_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers) #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \ static void f(); \ @@ -2004,7 +2144,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators) \ static doctest::detail::funcType proxy() { return f; } \ - DOCTEST_REGISTER_FUNCTION(inline, proxy(), decorators) \ + DOCTEST_REGISTER_FUNCTION(inline, proxy(), decorators) \ static void f() // for registering tests @@ -2012,7 +2152,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators) // for registering tests in classes - requires C++17 for inline variables! -#if __cplusplus >= 201703L || (DOCTEST_MSVC >= DOCTEST_COMPILER(19, 12, 0) && _MSVC_LANG >= 201703L) +#if DOCTEST_CPLUSPLUS >= 201703L #define DOCTEST_TEST_CASE_CLASS(decorators) \ DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), \ DOCTEST_ANONYMOUS(DOCTEST_ANON_PROXY_), \ @@ -2028,22 +2168,21 @@ int registerReporter(const char* name, int priority, bool isReporter) { DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators) // for converting types to strings without the <typeinfo> header and demangling -#define DOCTEST_TYPE_TO_STRING_IMPL(...) \ - template <> \ - inline const char* type_to_string<__VA_ARGS__>() { \ - return "<" #__VA_ARGS__ ">"; \ - } -#define DOCTEST_TYPE_TO_STRING(...) \ - namespace doctest { namespace detail { \ - DOCTEST_TYPE_TO_STRING_IMPL(__VA_ARGS__) \ +#define DOCTEST_TYPE_TO_STRING_AS(str, ...) \ + namespace doctest { \ + template <> \ + inline String toString<__VA_ARGS__>() { \ + return str; \ } \ } \ static_assert(true, "") +#define DOCTEST_TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING_AS(#__VA_ARGS__, __VA_ARGS__) + #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func) \ template <typename T> \ static void func(); \ - namespace { \ + namespace { /* NOLINT */ \ template <typename Tuple> \ struct iter; \ template <typename Type, typename... Rest> \ @@ -2052,7 +2191,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { iter(const char* file, unsigned line, int index) { \ doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line, \ doctest_detail_test_suite_ns::getCurrentTestSuite(), \ - doctest::detail::type_to_string<Type>(), \ + doctest::toString<Type>(), \ int(line) * 1000 + index) \ * dec); \ iter<std::tuple<Rest...>>(file, line, index + 1); \ @@ -2072,7 +2211,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)) #define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...) \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY), /* NOLINT(cert-err58-cpp, fuchsia-statically-constructed-objects) */ \ doctest::detail::instantiationHelper( \ DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0))) @@ -2101,7 +2240,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { // for grouping tests in test suites by using code blocks #define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name) \ namespace ns_name { namespace doctest_detail_test_suite_ns { \ - static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() { \ + static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() noexcept { \ DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640) \ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors") \ DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmissing-field-initializers") \ @@ -2125,20 +2264,20 @@ int registerReporter(const char* name, int priority, bool isReporter) { // for starting a testsuite block #define DOCTEST_TEST_SUITE_BEGIN(decorators) \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \ doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators)) \ static_assert(true, "") // for ending a testsuite block #define DOCTEST_TEST_SUITE_END \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \ doctest::detail::setTestSuite(doctest::detail::TestSuite() * "")) \ - typedef int DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) + using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int // for registering exception translators #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature) \ inline doctest::String translatorName(signature); \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), /* NOLINT(cert-err58-cpp) */ \ doctest::registerExceptionTranslator(translatorName)) \ doctest::String translatorName(signature) @@ -2148,13 +2287,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { // for registering reporters #define DOCTEST_REGISTER_REPORTER(name, priority, reporter) \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \ doctest::registerReporter<reporter>(name, priority, true)) \ static_assert(true, "") // for registering listeners #define DOCTEST_REGISTER_LISTENER(name, priority, reporter) \ - DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), \ + DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \ doctest::registerReporter<reporter>(name, priority, false)) \ static_assert(true, "") @@ -2177,13 +2316,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x) #define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \ - [&] { \ + DOCTEST_FUNC_SCOPE_BEGIN { \ doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \ mb * __VA_ARGS__; \ if(mb.log()) \ DOCTEST_BREAK_INTO_DEBUGGER(); \ mb.react(); \ - }() + } DOCTEST_FUNC_SCOPE_END // clang-format off #define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__) @@ -2201,18 +2340,37 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...) \ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \ + /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ __LINE__, #__VA_ARGS__); \ DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \ doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \ - << __VA_ARGS__)) \ + << __VA_ARGS__)) /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB) \ DOCTEST_CLANG_SUPPRESS_WARNING_POP #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \ - [&] { \ + DOCTEST_FUNC_SCOPE_BEGIN { \ DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \ - }() + } DOCTEST_FUNC_SCOPE_END // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks) + +#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \ + DOCTEST_FUNC_SCOPE_BEGIN { \ + doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ + __LINE__, #__VA_ARGS__); \ + DOCTEST_WRAP_IN_TRY( \ + DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \ + __VA_ARGS__)) \ + DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ + } DOCTEST_FUNC_SCOPE_END + +#define DOCTEST_UNARY_ASSERT(assert_type, ...) \ + DOCTEST_FUNC_SCOPE_BEGIN { \ + doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ + __LINE__, #__VA_ARGS__); \ + DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \ + DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ + } DOCTEST_FUNC_SCOPE_END #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS @@ -2226,6 +2384,14 @@ int registerReporter(const char* name, int priority, bool isReporter) { doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \ << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP +#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \ + doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \ + doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__) + +#define DOCTEST_UNARY_ASSERT(assert_type, ...) \ + doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \ + #__VA_ARGS__, __VA_ARGS__) + #endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS #define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__) @@ -2236,34 +2402,62 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__) // clang-format off -#define DOCTEST_WARN_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); }() -#define DOCTEST_CHECK_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); }() -#define DOCTEST_REQUIRE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); }() -#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); }() -#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); }() -#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); }() +#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } DOCTEST_FUNC_SCOPE_END // clang-format on +#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__) +#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__) +#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__) +#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__) +#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__) +#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__) +#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__) +#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__) +#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__) +#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__) +#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__) +#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__) +#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__) +#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__) +#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__) +#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__) +#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__) +#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__) + +#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__) +#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__) +#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__) +#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__) +#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__) +#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__) + +#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS + #define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \ - [&] { \ + DOCTEST_FUNC_SCOPE_BEGIN { \ if(!doctest::getContextOptions()->no_throw) { \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ __LINE__, #expr, #__VA_ARGS__, message); \ try { \ DOCTEST_CAST_TO_VOID(expr) \ - } catch(const typename doctest::detail::remove_const< \ - typename doctest::detail::remove_reference<__VA_ARGS__>::type>::type&) { \ + } catch(const typename doctest::detail::types::remove_const< \ + typename doctest::detail::types::remove_reference<__VA_ARGS__>::type>::type&) {\ DOCTEST_RB.translateException(); \ DOCTEST_RB.m_threw_as = true; \ } catch(...) { DOCTEST_RB.translateException(); } \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ - } else { \ - return false; \ + } else { /* NOLINT(*-else-after-return) */ \ + DOCTEST_FUNC_SCOPE_RET(false); \ } \ - }() + } DOCTEST_FUNC_SCOPE_END #define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \ - [&] { \ + DOCTEST_FUNC_SCOPE_BEGIN { \ if(!doctest::getContextOptions()->no_throw) { \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ __LINE__, expr_str, "", __VA_ARGS__); \ @@ -2271,20 +2465,20 @@ int registerReporter(const char* name, int priority, bool isReporter) { DOCTEST_CAST_TO_VOID(expr) \ } catch(...) { DOCTEST_RB.translateException(); } \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ - } else { \ - return false; \ + } else { /* NOLINT(*-else-after-return) */ \ + DOCTEST_FUNC_SCOPE_RET(false); \ } \ - }() + } DOCTEST_FUNC_SCOPE_END #define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \ - [&] { \ + DOCTEST_FUNC_SCOPE_BEGIN { \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ __LINE__, #__VA_ARGS__); \ try { \ DOCTEST_CAST_TO_VOID(__VA_ARGS__) \ } catch(...) { DOCTEST_RB.translateException(); } \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ - }() + } DOCTEST_FUNC_SCOPE_END // clang-format off #define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "") @@ -2307,166 +2501,23 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__) #define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__) -#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); }() -#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); }() -#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); }() -#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); }() -#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); }() -#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); }() -#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); }() -#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); }() -#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); }() -#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); }() -#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); }() -#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); }() -#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); }() -#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); }() -#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); }() +#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END +#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END // clang-format on -#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS - -#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \ - [&] { \ - doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ - __LINE__, #__VA_ARGS__); \ - DOCTEST_WRAP_IN_TRY( \ - DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \ - __VA_ARGS__)) \ - DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ - }() - -#define DOCTEST_UNARY_ASSERT(assert_type, ...) \ - [&] { \ - doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ - __LINE__, #__VA_ARGS__); \ - DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \ - DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \ - }() - -#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS - -#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \ - doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \ - doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__) - -#define DOCTEST_UNARY_ASSERT(assert_type, ...) \ - doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \ - #__VA_ARGS__, __VA_ARGS__) - -#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS - -#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__) -#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__) -#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__) -#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__) -#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__) -#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__) -#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__) -#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__) -#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__) -#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__) -#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__) -#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__) -#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__) -#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__) -#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__) -#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__) -#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__) -#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__) - -#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__) -#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__) -#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__) -#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__) -#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__) -#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__) - -#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS - -#undef DOCTEST_WARN_THROWS -#undef DOCTEST_CHECK_THROWS -#undef DOCTEST_REQUIRE_THROWS -#undef DOCTEST_WARN_THROWS_AS -#undef DOCTEST_CHECK_THROWS_AS -#undef DOCTEST_REQUIRE_THROWS_AS -#undef DOCTEST_WARN_THROWS_WITH -#undef DOCTEST_CHECK_THROWS_WITH -#undef DOCTEST_REQUIRE_THROWS_WITH -#undef DOCTEST_WARN_THROWS_WITH_AS -#undef DOCTEST_CHECK_THROWS_WITH_AS -#undef DOCTEST_REQUIRE_THROWS_WITH_AS -#undef DOCTEST_WARN_NOTHROW -#undef DOCTEST_CHECK_NOTHROW -#undef DOCTEST_REQUIRE_NOTHROW - -#undef DOCTEST_WARN_THROWS_MESSAGE -#undef DOCTEST_CHECK_THROWS_MESSAGE -#undef DOCTEST_REQUIRE_THROWS_MESSAGE -#undef DOCTEST_WARN_THROWS_AS_MESSAGE -#undef DOCTEST_CHECK_THROWS_AS_MESSAGE -#undef DOCTEST_REQUIRE_THROWS_AS_MESSAGE -#undef DOCTEST_WARN_THROWS_WITH_MESSAGE -#undef DOCTEST_CHECK_THROWS_WITH_MESSAGE -#undef DOCTEST_REQUIRE_THROWS_WITH_MESSAGE -#undef DOCTEST_WARN_THROWS_WITH_AS_MESSAGE -#undef DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE -#undef DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE -#undef DOCTEST_WARN_NOTHROW_MESSAGE -#undef DOCTEST_CHECK_NOTHROW_MESSAGE -#undef DOCTEST_REQUIRE_NOTHROW_MESSAGE - -#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS - -#define DOCTEST_WARN_THROWS(...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS(...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS(...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_WARN_NOTHROW(...) ([] { return false; }) -#define DOCTEST_CHECK_NOTHROW(...) ([] { return false; }) -#define DOCTEST_REQUIRE_NOTHROW(...) ([] { return false; }) - -#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) - -#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS - -#undef DOCTEST_REQUIRE -#undef DOCTEST_REQUIRE_FALSE -#undef DOCTEST_REQUIRE_MESSAGE -#undef DOCTEST_REQUIRE_FALSE_MESSAGE -#undef DOCTEST_REQUIRE_EQ -#undef DOCTEST_REQUIRE_NE -#undef DOCTEST_REQUIRE_GT -#undef DOCTEST_REQUIRE_LT -#undef DOCTEST_REQUIRE_GE -#undef DOCTEST_REQUIRE_LE -#undef DOCTEST_REQUIRE_UNARY -#undef DOCTEST_REQUIRE_UNARY_FALSE - -#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS - #endif // DOCTEST_CONFIG_NO_EXCEPTIONS // ================================================================================================= @@ -2476,7 +2527,7 @@ int registerReporter(const char* name, int priority, bool isReporter) { #else // DOCTEST_CONFIG_DISABLE #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name) \ - namespace { \ + namespace /* NOLINT */ { \ template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ struct der : public base \ { void f(); }; \ @@ -2502,8 +2553,8 @@ int registerReporter(const char* name, int priority, bool isReporter) { DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name) // for converting types to strings without the <typeinfo> header and demangling +#define DOCTEST_TYPE_TO_STRING_AS(str, ...) static_assert(true, "") #define DOCTEST_TYPE_TO_STRING(...) static_assert(true, "") -#define DOCTEST_TYPE_TO_STRING_IMPL(...) // for typed tests #define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...) \ @@ -2521,13 +2572,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_SUBCASE(name) // for a testsuite block -#define DOCTEST_TEST_SUITE(name) namespace +#define DOCTEST_TEST_SUITE(name) namespace // NOLINT // for starting a testsuite block #define DOCTEST_TEST_SUITE_BEGIN(name) static_assert(true, "") // for ending a testsuite block -#define DOCTEST_TEST_SUITE_END typedef int DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) +#define DOCTEST_TEST_SUITE_END using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \ template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ @@ -2545,7 +2596,8 @@ int registerReporter(const char* name, int priority, bool isReporter) { #define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0)) #define DOCTEST_FAIL(...) (static_cast<void>(0)) -#ifdef DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED +#if defined(DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED) \ + && defined(DOCTEST_CONFIG_ASSERTS_RETURN_VALUES) #define DOCTEST_WARN(...) [&] { return __VA_ARGS__; }() #define DOCTEST_CHECK(...) [&] { return __VA_ARGS__; }() @@ -2601,85 +2653,196 @@ namespace detail { #define DOCTEST_CHECK_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }() #define DOCTEST_REQUIRE_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }() +#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS + +#define DOCTEST_WARN_THROWS_WITH(expr, with, ...) [] { static_assert(false, "Exception translation is not available when doctest is disabled."); return false; }() +#define DOCTEST_CHECK_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_REQUIRE_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) + +#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) +#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,) + +#define DOCTEST_WARN_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_CHECK_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_REQUIRE_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_WARN_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_CHECK_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_WARN_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() +#define DOCTEST_CHECK_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() +#define DOCTEST_REQUIRE_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() + +#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }() +#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }() +#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() +#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() +#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }() + +#endif // DOCTEST_CONFIG_NO_EXCEPTIONS + #else // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED -#define DOCTEST_WARN(...) ([] { return false; }) -#define DOCTEST_CHECK(...) ([] { return false; }) -#define DOCTEST_REQUIRE(...) ([] { return false; }) -#define DOCTEST_WARN_FALSE(...) ([] { return false; }) -#define DOCTEST_CHECK_FALSE(...) ([] { return false; }) -#define DOCTEST_REQUIRE_FALSE(...) ([] { return false; }) - -#define DOCTEST_WARN_MESSAGE(cond, ...) ([] { return false; }) -#define DOCTEST_CHECK_MESSAGE(cond, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_MESSAGE(cond, ...) ([] { return false; }) -#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) ([] { return false; }) -#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) ([] { return false; }) - -#define DOCTEST_WARN_EQ(...) ([] { return false; }) -#define DOCTEST_CHECK_EQ(...) ([] { return false; }) -#define DOCTEST_REQUIRE_EQ(...) ([] { return false; }) -#define DOCTEST_WARN_NE(...) ([] { return false; }) -#define DOCTEST_CHECK_NE(...) ([] { return false; }) -#define DOCTEST_REQUIRE_NE(...) ([] { return false; }) -#define DOCTEST_WARN_GT(...) ([] { return false; }) -#define DOCTEST_CHECK_GT(...) ([] { return false; }) -#define DOCTEST_REQUIRE_GT(...) ([] { return false; }) -#define DOCTEST_WARN_LT(...) ([] { return false; }) -#define DOCTEST_CHECK_LT(...) ([] { return false; }) -#define DOCTEST_REQUIRE_LT(...) ([] { return false; }) -#define DOCTEST_WARN_GE(...) ([] { return false; }) -#define DOCTEST_CHECK_GE(...) ([] { return false; }) -#define DOCTEST_REQUIRE_GE(...) ([] { return false; }) -#define DOCTEST_WARN_LE(...) ([] { return false; }) -#define DOCTEST_CHECK_LE(...) ([] { return false; }) -#define DOCTEST_REQUIRE_LE(...) ([] { return false; }) - -#define DOCTEST_WARN_UNARY(...) ([] { return false; }) -#define DOCTEST_CHECK_UNARY(...) ([] { return false; }) -#define DOCTEST_REQUIRE_UNARY(...) ([] { return false; }) -#define DOCTEST_WARN_UNARY_FALSE(...) ([] { return false; }) -#define DOCTEST_CHECK_UNARY_FALSE(...) ([] { return false; }) -#define DOCTEST_REQUIRE_UNARY_FALSE(...) ([] { return false; }) +#define DOCTEST_WARN(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_FALSE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_FALSE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_FUNC_EMPTY + +#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY + +#define DOCTEST_WARN_EQ(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_EQ(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_EQ(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_NE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_NE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_NE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_GT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_GT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_GT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_LT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_LT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_LT(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_GE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_GE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_GE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_LE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_LE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_LE(...) DOCTEST_FUNC_EMPTY + +#define DOCTEST_WARN_UNARY(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_UNARY(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY -#endif // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED +#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS -// TODO: think about if these also need to work properly even when doctest is disabled -#define DOCTEST_WARN_THROWS(...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS(...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS(...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ([] { return false; }) -#define DOCTEST_WARN_NOTHROW(...) ([] { return false; }) -#define DOCTEST_CHECK_NOTHROW(...) ([] { return false; }) -#define DOCTEST_REQUIRE_NOTHROW(...) ([] { return false; }) - -#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; }) -#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; }) -#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) -#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) ([] { return false; }) +#define DOCTEST_WARN_THROWS(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_NOTHROW(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_FUNC_EMPTY + +#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY +#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY + +#endif // DOCTEST_CONFIG_NO_EXCEPTIONS + +#endif // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED #endif // DOCTEST_CONFIG_DISABLE +#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS + +#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS +#define DOCTEST_EXCEPTION_EMPTY_FUNC DOCTEST_FUNC_EMPTY +#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS +#define DOCTEST_EXCEPTION_EMPTY_FUNC [] { static_assert(false, "Exceptions are disabled! " \ + "Use DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS if you want to compile with exceptions disabled."); return false; }() + +#undef DOCTEST_REQUIRE +#undef DOCTEST_REQUIRE_FALSE +#undef DOCTEST_REQUIRE_MESSAGE +#undef DOCTEST_REQUIRE_FALSE_MESSAGE +#undef DOCTEST_REQUIRE_EQ +#undef DOCTEST_REQUIRE_NE +#undef DOCTEST_REQUIRE_GT +#undef DOCTEST_REQUIRE_LT +#undef DOCTEST_REQUIRE_GE +#undef DOCTEST_REQUIRE_LE +#undef DOCTEST_REQUIRE_UNARY +#undef DOCTEST_REQUIRE_UNARY_FALSE + +#define DOCTEST_REQUIRE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_FALSE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_EQ DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_NE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_GT DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_LT DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_GE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_LE DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_UNARY DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_UNARY_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC + +#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS + +#define DOCTEST_WARN_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC + +#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC +#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC + +#endif // DOCTEST_CONFIG_NO_EXCEPTIONS + // clang-format off // KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS #define DOCTEST_FAST_WARN_EQ DOCTEST_WARN_EQ @@ -2726,11 +2889,12 @@ namespace detail { // clang-format on // == SHORT VERSIONS OF THE MACROS -#if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES) +#ifndef DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES #define TEST_CASE(name) DOCTEST_TEST_CASE(name) #define TEST_CASE_CLASS(name) DOCTEST_TEST_CASE_CLASS(name) #define TEST_CASE_FIXTURE(x, name) DOCTEST_TEST_CASE_FIXTURE(x, name) +#define TYPE_TO_STRING_AS(str, ...) DOCTEST_TYPE_TO_STRING_AS(str, __VA_ARGS__) #define TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING(__VA_ARGS__) #define TEST_CASE_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(name, T, __VA_ARGS__) #define TEST_CASE_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, T, id) @@ -2863,33 +3027,11 @@ namespace detail { #endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES -#if !defined(DOCTEST_CONFIG_DISABLE) +#ifndef DOCTEST_CONFIG_DISABLE // this is here to clear the 'current test suite' for the current translation unit - at the top DOCTEST_TEST_SUITE_END(); -// add stringification for primitive/fundamental types -namespace doctest { namespace detail { - DOCTEST_TYPE_TO_STRING_IMPL(bool) - DOCTEST_TYPE_TO_STRING_IMPL(float) - DOCTEST_TYPE_TO_STRING_IMPL(double) - DOCTEST_TYPE_TO_STRING_IMPL(long double) - DOCTEST_TYPE_TO_STRING_IMPL(char) - DOCTEST_TYPE_TO_STRING_IMPL(signed char) - DOCTEST_TYPE_TO_STRING_IMPL(unsigned char) -#if !DOCTEST_MSVC || defined(_NATIVE_WCHAR_T_DEFINED) - DOCTEST_TYPE_TO_STRING_IMPL(wchar_t) -#endif // not MSVC or wchar_t support enabled - DOCTEST_TYPE_TO_STRING_IMPL(short int) - DOCTEST_TYPE_TO_STRING_IMPL(unsigned short int) - DOCTEST_TYPE_TO_STRING_IMPL(int) - DOCTEST_TYPE_TO_STRING_IMPL(unsigned int) - DOCTEST_TYPE_TO_STRING_IMPL(long int) - DOCTEST_TYPE_TO_STRING_IMPL(unsigned long int) - DOCTEST_TYPE_TO_STRING_IMPL(long long int) - DOCTEST_TYPE_TO_STRING_IMPL(unsigned long long int) -}} // namespace doctest::detail - #endif // DOCTEST_CONFIG_DISABLE DOCTEST_CLANG_SUPPRESS_WARNING_POP @@ -2981,16 +3123,27 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN #include <algorithm> #include <iomanip> #include <vector> +#ifndef DOCTEST_CONFIG_NO_MULTITHREADING #include <atomic> #include <mutex> +#define DOCTEST_DECLARE_MUTEX(name) std::mutex name; +#define DOCTEST_DECLARE_STATIC_MUTEX(name) static DOCTEST_DECLARE_MUTEX(name) +#define DOCTEST_LOCK_MUTEX(name) std::lock_guard<std::mutex> DOCTEST_ANONYMOUS(DOCTEST_ANON_LOCK_)(name); +#else // DOCTEST_CONFIG_NO_MULTITHREADING +#define DOCTEST_DECLARE_MUTEX(name) +#define DOCTEST_DECLARE_STATIC_MUTEX(name) +#define DOCTEST_LOCK_MUTEX(name) +#endif // DOCTEST_CONFIG_NO_MULTITHREADING #include <set> #include <map> +#include <unordered_set> #include <exception> #include <stdexcept> #include <csignal> #include <cfloat> #include <cctype> #include <cstdint> +#include <string> #ifdef DOCTEST_PLATFORM_MAC #include <sys/types.h> @@ -3045,7 +3198,7 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END #endif #ifndef DOCTEST_THREAD_LOCAL -#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0)) +#if defined(DOCTEST_CONFIG_NO_MULTITHREADING) || DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0)) #define DOCTEST_THREAD_LOCAL #else // DOCTEST_MSVC #define DOCTEST_THREAD_LOCAL thread_local @@ -3107,20 +3260,6 @@ namespace { } } - template <typename T> - String fpToString(T value, int precision) { - std::ostringstream oss; - oss << std::setprecision(precision) << std::fixed << value; - std::string d = oss.str(); - size_t i = d.find_last_not_of('0'); - if(i != std::string::npos && i != d.size() - 1) { - if(d[i] == '.') - i++; - d = d.substr(0, i + 1); - } - return d.c_str(); - } - struct Endianness { enum Arch @@ -3141,22 +3280,6 @@ namespace { } // namespace namespace detail { - String rawMemoryToString(const void* object, unsigned size) { - // Reverse order for little endian architectures - int i = 0, end = static_cast<int>(size), inc = 1; - if(Endianness::which() == Endianness::Little) { - i = end - 1; - end = inc = -1; - } - - unsigned const char* bytes = static_cast<unsigned const char*>(object); - std::ostream* oss = tlssPush(); - *oss << "0x" << std::setfill('0') << std::hex; - for(; i != end; i += inc) - *oss << std::setw(2) << static_cast<unsigned>(bytes[i]); - return tlssPop(); - } - DOCTEST_THREAD_LOCAL class { std::vector<std::streampos> stack; @@ -3194,19 +3317,19 @@ namespace timer_large_integer { #if defined(DOCTEST_PLATFORM_WINDOWS) - typedef ULONGLONG type; + using type = ULONGLONG; #else // DOCTEST_PLATFORM_WINDOWS - typedef std::uint64_t type; + using type = std::uint64_t; #endif // DOCTEST_PLATFORM_WINDOWS } -typedef timer_large_integer::type ticks_t; +using ticks_t = timer_large_integer::type; #ifdef DOCTEST_CONFIG_GETCURRENTTICKS ticks_t getCurrentTicks() { return DOCTEST_CONFIG_GETCURRENTTICKS(); } #elif defined(DOCTEST_PLATFORM_WINDOWS) ticks_t getCurrentTicks() { - static LARGE_INTEGER hz = {0}, hzo = {0}; + static LARGE_INTEGER hz = { {0} }, hzo = { {0} }; if(!hz.QuadPart) { QueryPerformanceFrequency(&hz); QueryPerformanceCounter(&hzo); @@ -3238,9 +3361,17 @@ typedef timer_large_integer::type ticks_t; ticks_t m_ticks = 0; }; -#ifdef DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS +#ifdef DOCTEST_CONFIG_NO_MULTITHREADING + template <typename T> + using Atomic = T; +#else // DOCTEST_CONFIG_NO_MULTITHREADING template <typename T> - using AtomicOrMultiLaneAtomic = std::atomic<T>; + using Atomic = std::atomic<T>; +#endif // DOCTEST_CONFIG_NO_MULTITHREADING + +#if defined(DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS) || defined(DOCTEST_CONFIG_NO_MULTITHREADING) + template <typename T> + using MultiLaneAtomic = Atomic<T>; #else // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS // Provides a multilane implementation of an atomic variable that supports add, sub, load, // store. Instead of using a single atomic variable, this splits up into multiple ones, @@ -3257,8 +3388,8 @@ typedef timer_large_integer::type ticks_t; { struct CacheLineAlignedAtomic { - std::atomic<T> atomic{}; - char padding[DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE - sizeof(std::atomic<T>)]; + Atomic<T> atomic{}; + char padding[DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE - sizeof(Atomic<T>)]; }; CacheLineAlignedAtomic m_atomics[DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES]; @@ -3314,24 +3445,21 @@ typedef timer_large_integer::type ticks_t; // assigned in a round-robin fashion. // 3. This tlsLaneIdx is stored in the thread local data, so it is directly available with // little overhead. - std::atomic<T>& myAtomic() DOCTEST_NOEXCEPT { - static std::atomic<size_t> laneCounter; + Atomic<T>& myAtomic() DOCTEST_NOEXCEPT { + static Atomic<size_t> laneCounter; DOCTEST_THREAD_LOCAL size_t tlsLaneIdx = laneCounter++ % DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES; return m_atomics[tlsLaneIdx].atomic; } }; - - template <typename T> - using AtomicOrMultiLaneAtomic = MultiLaneAtomic<T>; #endif // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS // this holds both parameters from the command line and runtime data for tests struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats { - AtomicOrMultiLaneAtomic<int> numAssertsCurrentTest_atomic; - AtomicOrMultiLaneAtomic<int> numAssertsFailedCurrentTest_atomic; + MultiLaneAtomic<int> numAssertsCurrentTest_atomic; + MultiLaneAtomic<int> numAssertsFailedCurrentTest_atomic; std::vector<std::vector<String>> filters = decltype(filters)(9); // 9 different filters @@ -3344,11 +3472,12 @@ typedef timer_large_integer::type ticks_t; std::vector<String> stringifiedContexts; // logging from INFO() due to an exception // stuff for subcases - std::vector<SubcaseSignature> subcasesStack; - std::set<decltype(subcasesStack)> subcasesPassed; - int subcasesCurrentMaxLevel; - bool should_reenter; - std::atomic<bool> shouldLogCurrentException; + bool reachedLeaf; + std::vector<SubcaseSignature> subcaseStack; + std::vector<SubcaseSignature> nextSubcaseStack; + std::unordered_set<unsigned long long> fullyTraversedSubcases; + size_t currentSubcaseDepth; + Atomic<bool> shouldLogCurrentException; void resetRunData() { numTestCases = 0; @@ -3414,7 +3543,7 @@ typedef timer_large_integer::type ticks_t; #endif // DOCTEST_CONFIG_DISABLE } // namespace detail -char* String::allocate(unsigned sz) { +char* String::allocate(size_type sz) { if (sz <= last) { buf[sz] = '\0'; setLast(last - sz); @@ -3429,8 +3558,12 @@ char* String::allocate(unsigned sz) { } } -void String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; } -void String::setLast(unsigned in) { buf[last] = char(in); } +void String::setOnHeap() noexcept { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; } +void String::setLast(size_type in) noexcept { buf[last] = char(in); } +void String::setSize(size_type sz) noexcept { + if (isOnStack()) { buf[sz] = '\0'; setLast(last - sz); } + else { data.ptr[sz] = '\0'; data.size = sz; } +} void String::copy(const String& other) { if(other.isOnStack()) { @@ -3440,7 +3573,7 @@ void String::copy(const String& other) { } } -String::String() { +String::String() noexcept { buf[0] = '\0'; setLast(); } @@ -3448,17 +3581,16 @@ String::String() { String::~String() { if(!isOnStack()) delete[] data.ptr; - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) -} +} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks) String::String(const char* in) : String(in, strlen(in)) {} -String::String(const char* in, unsigned in_size) { +String::String(const char* in, size_type in_size) { memcpy(allocate(in_size), in, in_size); } -String::String(std::istream& in, unsigned in_size) { +String::String(std::istream& in, size_type in_size) { in.read(allocate(in_size), in_size); } @@ -3476,9 +3608,9 @@ String& String::operator=(const String& other) { } String& String::operator+=(const String& other) { - const unsigned my_old_size = size(); - const unsigned other_size = other.size(); - const unsigned total_size = my_old_size + other_size; + const size_type my_old_size = size(); + const size_type other_size = other.size(); + const size_type total_size = my_old_size + other_size; if(isOnStack()) { if(total_size < len) { // append to the current stack space @@ -3525,13 +3657,13 @@ String& String::operator+=(const String& other) { return *this; } -String::String(String&& other) { +String::String(String&& other) noexcept { memcpy(buf, other.buf, len); other.buf[0] = '\0'; other.setLast(); } -String& String::operator=(String&& other) { +String& String::operator=(String&& other) noexcept { if(this != &other) { if(!isOnStack()) delete[] data.ptr; @@ -3542,30 +3674,60 @@ String& String::operator=(String&& other) { return *this; } -char String::operator[](unsigned i) const { - return const_cast<String*>(this)->operator[](i); // NOLINT +char String::operator[](size_type i) const { + return const_cast<String*>(this)->operator[](i); } -char& String::operator[](unsigned i) { +char& String::operator[](size_type i) { if(isOnStack()) return reinterpret_cast<char*>(buf)[i]; return data.ptr[i]; } DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmaybe-uninitialized") -unsigned String::size() const { +String::size_type String::size() const { if(isOnStack()) - return last - (unsigned(buf[last]) & 31); // using "last" would work only if "len" is 32 + return last - (size_type(buf[last]) & 31); // using "last" would work only if "len" is 32 return data.size; } DOCTEST_GCC_SUPPRESS_WARNING_POP -unsigned String::capacity() const { +String::size_type String::capacity() const { if(isOnStack()) return len; return data.capacity; } +String String::substr(size_type pos, size_type cnt) && { + cnt = std::min(cnt, size() - 1 - pos); + char* cptr = c_str(); + memmove(cptr, cptr + pos, cnt); + setSize(cnt); + return std::move(*this); +} + +String String::substr(size_type pos, size_type cnt) const & { + cnt = std::min(cnt, size() - 1 - pos); + return String{ c_str() + pos, cnt }; +} + +String::size_type String::find(char ch, size_type pos) const { + const char* begin = c_str(); + const char* end = begin + size(); + const char* it = begin + pos; + for (; it < end && *it != ch; it++); + if (it < end) { return static_cast<size_type>(it - begin); } + else { return npos; } +} + +String::size_type String::rfind(char ch, size_type pos) const { + const char* begin = c_str(); + const char* it = begin + std::min(pos, size() - 1); + for (; it >= begin && *it != ch; it--); + if (it >= begin) { return static_cast<size_type>(it - begin); } + else { return npos; } +} + int String::compare(const char* other, bool no_case) const { if(no_case) return doctest::stricmp(c_str(), other); @@ -3576,20 +3738,32 @@ int String::compare(const String& other, bool no_case) const { return compare(other.c_str(), no_case); } -// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) String operator+(const String& lhs, const String& rhs) { return String(lhs) += rhs; } -// clang-format off bool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; } bool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; } bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; } bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; } bool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; } bool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; } -// clang-format on std::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); } +Contains::Contains(const String& str) : string(str) { } + +bool Contains::checkWith(const String& other) const { + return strstr(other.c_str(), string.c_str()) != nullptr; +} + +String toString(const Contains& in) { + return "Contains( " + in.string + " )"; +} + +bool operator==(const String& lhs, const Contains& rhs) { return rhs.checkWith(lhs); } +bool operator==(const Contains& lhs, const String& rhs) { return lhs.checkWith(rhs); } +bool operator!=(const String& lhs, const Contains& rhs) { return !rhs.checkWith(lhs); } +bool operator!=(const Contains& lhs, const String& rhs) { return !lhs.checkWith(rhs); } + namespace { void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;) } // namespace @@ -3603,64 +3777,42 @@ namespace Color { // clang-format off const char* assertString(assertType::Enum at) { - DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4062) // enum 'x' in switch of enum 'y' is not handled - switch(at) { //!OCLINT missing default in switch statements - case assertType::DT_WARN : return "WARN"; - case assertType::DT_CHECK : return "CHECK"; - case assertType::DT_REQUIRE : return "REQUIRE"; - - case assertType::DT_WARN_FALSE : return "WARN_FALSE"; - case assertType::DT_CHECK_FALSE : return "CHECK_FALSE"; - case assertType::DT_REQUIRE_FALSE : return "REQUIRE_FALSE"; - - case assertType::DT_WARN_THROWS : return "WARN_THROWS"; - case assertType::DT_CHECK_THROWS : return "CHECK_THROWS"; - case assertType::DT_REQUIRE_THROWS : return "REQUIRE_THROWS"; - - case assertType::DT_WARN_THROWS_AS : return "WARN_THROWS_AS"; - case assertType::DT_CHECK_THROWS_AS : return "CHECK_THROWS_AS"; - case assertType::DT_REQUIRE_THROWS_AS : return "REQUIRE_THROWS_AS"; - - case assertType::DT_WARN_THROWS_WITH : return "WARN_THROWS_WITH"; - case assertType::DT_CHECK_THROWS_WITH : return "CHECK_THROWS_WITH"; - case assertType::DT_REQUIRE_THROWS_WITH : return "REQUIRE_THROWS_WITH"; - - case assertType::DT_WARN_THROWS_WITH_AS : return "WARN_THROWS_WITH_AS"; - case assertType::DT_CHECK_THROWS_WITH_AS : return "CHECK_THROWS_WITH_AS"; - case assertType::DT_REQUIRE_THROWS_WITH_AS : return "REQUIRE_THROWS_WITH_AS"; - - case assertType::DT_WARN_NOTHROW : return "WARN_NOTHROW"; - case assertType::DT_CHECK_NOTHROW : return "CHECK_NOTHROW"; - case assertType::DT_REQUIRE_NOTHROW : return "REQUIRE_NOTHROW"; - - case assertType::DT_WARN_EQ : return "WARN_EQ"; - case assertType::DT_CHECK_EQ : return "CHECK_EQ"; - case assertType::DT_REQUIRE_EQ : return "REQUIRE_EQ"; - case assertType::DT_WARN_NE : return "WARN_NE"; - case assertType::DT_CHECK_NE : return "CHECK_NE"; - case assertType::DT_REQUIRE_NE : return "REQUIRE_NE"; - case assertType::DT_WARN_GT : return "WARN_GT"; - case assertType::DT_CHECK_GT : return "CHECK_GT"; - case assertType::DT_REQUIRE_GT : return "REQUIRE_GT"; - case assertType::DT_WARN_LT : return "WARN_LT"; - case assertType::DT_CHECK_LT : return "CHECK_LT"; - case assertType::DT_REQUIRE_LT : return "REQUIRE_LT"; - case assertType::DT_WARN_GE : return "WARN_GE"; - case assertType::DT_CHECK_GE : return "CHECK_GE"; - case assertType::DT_REQUIRE_GE : return "REQUIRE_GE"; - case assertType::DT_WARN_LE : return "WARN_LE"; - case assertType::DT_CHECK_LE : return "CHECK_LE"; - case assertType::DT_REQUIRE_LE : return "REQUIRE_LE"; - - case assertType::DT_WARN_UNARY : return "WARN_UNARY"; - case assertType::DT_CHECK_UNARY : return "CHECK_UNARY"; - case assertType::DT_REQUIRE_UNARY : return "REQUIRE_UNARY"; - case assertType::DT_WARN_UNARY_FALSE : return "WARN_UNARY_FALSE"; - case assertType::DT_CHECK_UNARY_FALSE : return "CHECK_UNARY_FALSE"; - case assertType::DT_REQUIRE_UNARY_FALSE : return "REQUIRE_UNARY_FALSE"; + DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4061) // enum 'x' in switch of enum 'y' is not explicitely handled + #define DOCTEST_GENERATE_ASSERT_TYPE_CASE(assert_type) case assertType::DT_ ## assert_type: return #assert_type + #define DOCTEST_GENERATE_ASSERT_TYPE_CASES(assert_type) \ + DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN_ ## assert_type); \ + DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK_ ## assert_type); \ + DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE_ ## assert_type) + switch(at) { + DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN); + DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK); + DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(FALSE); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_AS); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH_AS); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(NOTHROW); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(EQ); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(NE); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(GT); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(LT); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(GE); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(LE); + + DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY); + DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY_FALSE); + + default: DOCTEST_INTERNAL_ERROR("Tried stringifying invalid assert type!"); } DOCTEST_MSVC_SUPPRESS_WARNING_POP - return ""; } // clang-format on @@ -3694,6 +3846,12 @@ const char* skipPathFromFilename(const char* file) { DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_GCC_SUPPRESS_WARNING_POP +bool SubcaseSignature::operator==(const SubcaseSignature& other) const { + return m_line == other.m_line + && std::strcmp(m_file, other.m_file) == 0 + && m_name == other.m_name; +} + bool SubcaseSignature::operator<(const SubcaseSignature& other) const { if(m_line != other.m_line) return m_line < other.m_line; @@ -3702,45 +3860,53 @@ bool SubcaseSignature::operator<(const SubcaseSignature& other) const { return m_name.compare(other.m_name) < 0; } -IContextScope::IContextScope() = default; -IContextScope::~IContextScope() = default; +DOCTEST_DEFINE_INTERFACE(IContextScope) -#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING -String toString(char* in) { return toString(static_cast<const char*>(in)); } -// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) -String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; } -#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING -String toString(bool in) { return in ? "true" : "false"; } -String toString(float in) { return fpToString(in, 5) + "f"; } -String toString(double in) { return fpToString(in, 10); } -String toString(double long in) { return fpToString(in, 15); } - -#define DOCTEST_TO_STRING_OVERLOAD(type, fmt) \ - String toString(type in) { \ - char buf[64]; \ - std::sprintf(buf, fmt, in); \ - return buf; \ +namespace detail { + void filldata<const void*>::fill(std::ostream* stream, const void* in) { + if (in) { *stream << in; } + else { *stream << "nullptr"; } } -DOCTEST_TO_STRING_OVERLOAD(char, "%d") -DOCTEST_TO_STRING_OVERLOAD(char signed, "%d") -DOCTEST_TO_STRING_OVERLOAD(char unsigned, "%u") -DOCTEST_TO_STRING_OVERLOAD(int short, "%d") -DOCTEST_TO_STRING_OVERLOAD(int short unsigned, "%u") -DOCTEST_TO_STRING_OVERLOAD(int, "%d") -DOCTEST_TO_STRING_OVERLOAD(unsigned, "%u") -DOCTEST_TO_STRING_OVERLOAD(int long, "%ld") -DOCTEST_TO_STRING_OVERLOAD(int long unsigned, "%lu") -DOCTEST_TO_STRING_OVERLOAD(int long long, "%lld") -DOCTEST_TO_STRING_OVERLOAD(int long long unsigned, "%llu") + template <typename T> + String toStreamLit(T t) { + std::ostream* os = tlssPush(); + os->operator<<(t); + return tlssPop(); + } +} -String toString(std::nullptr_t) { return "NULL"; } +#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING +String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; } +#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) // see this issue on why this is needed: https://github.com/doctest/doctest/issues/183 String toString(const std::string& in) { return in.c_str(); } #endif // VS 2019 +String toString(String in) { return in; } + +String toString(std::nullptr_t) { return "nullptr"; } + +String toString(bool in) { return in ? "true" : "false"; } + +String toString(float in) { return toStreamLit(in); } +String toString(double in) { return toStreamLit(in); } +String toString(double long in) { return toStreamLit(in); } + +String toString(char in) { return toStreamLit(static_cast<signed>(in)); } +String toString(char signed in) { return toStreamLit(static_cast<signed>(in)); } +String toString(char unsigned in) { return toStreamLit(static_cast<unsigned>(in)); } +String toString(short in) { return toStreamLit(in); } +String toString(short unsigned in) { return toStreamLit(in); } +String toString(signed in) { return toStreamLit(in); } +String toString(unsigned in) { return toStreamLit(in); } +String toString(long in) { return toStreamLit(in); } +String toString(long unsigned in) { return toStreamLit(in); } +String toString(long long in) { return toStreamLit(in); } +String toString(long long unsigned in) { return toStreamLit(in); } + Approx::Approx(double value) : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100) , m_scale(1.0) @@ -3780,11 +3946,25 @@ bool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs bool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; } String toString(const Approx& in) { - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) return "Approx( " + doctest::toString(in.m_value) + " )"; } const ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); } +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4738) +template <typename F> +IsNaN<F>::operator bool() const { + return std::isnan(value) ^ flipped; +} +DOCTEST_MSVC_SUPPRESS_WARNING_POP +template struct DOCTEST_INTERFACE_DEF IsNaN<float>; +template struct DOCTEST_INTERFACE_DEF IsNaN<double>; +template struct DOCTEST_INTERFACE_DEF IsNaN<long double>; +template <typename F> +String toString(IsNaN<F> in) { return String(in.flipped ? "! " : "") + "IsNaN( " + doctest::toString(in.value) + " )"; } +String toString(IsNaN<float> in) { return toString<float>(in); } +String toString(IsNaN<double> in) { return toString<double>(in); } +String toString(IsNaN<double long> in) { return toString<double long>(in); } + } // namespace doctest #ifdef DOCTEST_CONFIG_DISABLE @@ -3800,11 +3980,9 @@ void Context::setOption(const char*, const char*) {} bool Context::shouldExit() { return false; } void Context::setAsDefaultForAssertsOutOfTestCases() {} void Context::setAssertHandler(detail::assert_handler) {} -void Context::setCout(std::ostream* out) {} +void Context::setCout(std::ostream*) {} int Context::run() { return 0; } -IReporter::~IReporter() = default; - int IReporter::get_num_active_contexts() { return 0; } const IContextScope* const* IReporter::get_active_contexts() { return nullptr; } int IReporter::get_num_stringified_contexts() { return 0; } @@ -3837,7 +4015,7 @@ namespace doctest { namespace { // the int (priority) is part of the key for automatic sorting - sadly one can register a // reporter with a duplicate name and a different priority but hopefully that won't happen often :| - typedef std::map<std::pair<int, String>, reporterCreatorFunc> reporterMap; + using reporterMap = std::map<std::pair<int, String>, reporterCreatorFunc>; reporterMap& getReporters() { static reporterMap data; @@ -3869,8 +4047,8 @@ namespace detail { #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS DOCTEST_NORETURN void throwException() { g_cs->shouldLogCurrentException = false; - throw TestFailureException(); - } // NOLINT(cert-err60-cpp) + throw TestFailureException(); // NOLINT(hicpp-exception-baseclass) + } #else // DOCTEST_CONFIG_NO_EXCEPTIONS void throwException() {} #endif // DOCTEST_CONFIG_NO_EXCEPTIONS @@ -3916,59 +4094,92 @@ namespace { return !*wild; } - //// C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html - //unsigned hashStr(unsigned const char* str) { - // unsigned long hash = 5381; - // char c; - // while((c = *str++)) - // hash = ((hash << 5) + hash) + c; // hash * 33 + c - // return hash; - //} - // checks if the name matches any of the filters (and can be configured what to do when empty) bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty, - bool caseSensitive) { - if(filters.empty() && matchEmpty) + bool caseSensitive) { + if (filters.empty() && matchEmpty) return true; - for(auto& curr : filters) - if(wildcmp(name, curr.c_str(), caseSensitive)) + for (auto& curr : filters) + if (wildcmp(name, curr.c_str(), caseSensitive)) return true; return false; } -} // namespace -namespace detail { - Subcase::Subcase(const String& name, const char* file, int line) - : m_signature({name, file, line}) { - auto* s = g_cs; + unsigned long long hash(unsigned long long a, unsigned long long b) { + return (a << 5) + b; + } - // check subcase filters - if(s->subcasesStack.size() < size_t(s->subcase_filter_levels)) { - if(!matchesAny(m_signature.m_name.c_str(), s->filters[6], true, s->case_sensitive)) - return; - if(matchesAny(m_signature.m_name.c_str(), s->filters[7], false, s->case_sensitive)) - return; - } - - // if a Subcase on the same level has already been entered - if(s->subcasesStack.size() < size_t(s->subcasesCurrentMaxLevel)) { - s->should_reenter = true; - return; - } + // C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html + unsigned long long hash(const char* str) { + unsigned long long hash = 5381; + char c; + while ((c = *str++)) + hash = ((hash << 5) + hash) + c; // hash * 33 + c + return hash; + } - // push the current signature to the stack so we can check if the - // current stack + the current new subcase have been traversed - s->subcasesStack.push_back(m_signature); - if(s->subcasesPassed.count(s->subcasesStack) != 0) { - // pop - revert to previous stack since we've already passed this - s->subcasesStack.pop_back(); - return; + unsigned long long hash(const SubcaseSignature& sig) { + return hash(hash(hash(sig.m_file), hash(sig.m_name.c_str())), sig.m_line); + } + + unsigned long long hash(const std::vector<SubcaseSignature>& sigs, size_t count) { + unsigned long long running = 0; + auto end = sigs.begin() + count; + for (auto it = sigs.begin(); it != end; it++) { + running = hash(running, hash(*it)); } + return running; + } - s->subcasesCurrentMaxLevel = s->subcasesStack.size(); - m_entered = true; + unsigned long long hash(const std::vector<SubcaseSignature>& sigs) { + unsigned long long running = 0; + for (const SubcaseSignature& sig : sigs) { + running = hash(running, hash(sig)); + } + return running; + } +} // namespace +namespace detail { + bool Subcase::checkFilters() { + if (g_cs->subcaseStack.size() < size_t(g_cs->subcase_filter_levels)) { + if (!matchesAny(m_signature.m_name.c_str(), g_cs->filters[6], true, g_cs->case_sensitive)) + return true; + if (matchesAny(m_signature.m_name.c_str(), g_cs->filters[7], false, g_cs->case_sensitive)) + return true; + } + return false; + } - DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature); + Subcase::Subcase(const String& name, const char* file, int line) + : m_signature({name, file, line}) { + if (!g_cs->reachedLeaf) { + if (g_cs->nextSubcaseStack.size() <= g_cs->subcaseStack.size() + || g_cs->nextSubcaseStack[g_cs->subcaseStack.size()] == m_signature) { + // Going down. + if (checkFilters()) { return; } + + g_cs->subcaseStack.push_back(m_signature); + g_cs->currentSubcaseDepth++; + m_entered = true; + DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature); + } + } else { + if (g_cs->subcaseStack[g_cs->currentSubcaseDepth] == m_signature) { + // This subcase is reentered via control flow. + g_cs->currentSubcaseDepth++; + m_entered = true; + DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature); + } else if (g_cs->nextSubcaseStack.size() <= g_cs->currentSubcaseDepth + && g_cs->fullyTraversedSubcases.find(hash(hash(g_cs->subcaseStack, g_cs->currentSubcaseDepth), hash(m_signature))) + == g_cs->fullyTraversedSubcases.end()) { + if (checkFilters()) { return; } + // This subcase is part of the one to be executed next. + g_cs->nextSubcaseStack.clear(); + g_cs->nextSubcaseStack.insert(g_cs->nextSubcaseStack.end(), + g_cs->subcaseStack.begin(), g_cs->subcaseStack.begin() + g_cs->currentSubcaseDepth); + g_cs->nextSubcaseStack.push_back(m_signature); + } + } } DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17 @@ -3976,25 +4187,33 @@ namespace detail { DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations") Subcase::~Subcase() { - if(m_entered) { - // only mark the subcase stack as passed if no subcases have been skipped - if(g_cs->should_reenter == false) - g_cs->subcasesPassed.insert(g_cs->subcasesStack); - g_cs->subcasesStack.pop_back(); + if (m_entered) { + g_cs->currentSubcaseDepth--; + + if (!g_cs->reachedLeaf) { + // Leaf. + g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack)); + g_cs->nextSubcaseStack.clear(); + g_cs->reachedLeaf = true; + } else if (g_cs->nextSubcaseStack.empty()) { + // All children are finished. + g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack)); + } #if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) if(std::uncaught_exceptions() > 0 #else if(std::uncaught_exception() #endif - && g_cs->shouldLogCurrentException) { + && g_cs->shouldLogCurrentException) { DOCTEST_ITERATE_THROUGH_REPORTERS( test_case_exception, {"exception thrown in subcase - will translate later " - "when the whole test case has been exited (cannot " - "translate while there is an active exception)", - false}); + "when the whole test case has been exited (cannot " + "translate while there is an active exception)", + false}); g_cs->shouldLogCurrentException = false; } + DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY); } } @@ -4018,7 +4237,7 @@ namespace detail { } TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite, - const char* type, int template_id) { + const String& type, int template_id) { m_file = file; m_line = line; m_name = nullptr; // will be later overridden in operator* @@ -4043,10 +4262,8 @@ namespace detail { } DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function - DOCTEST_MSVC_SUPPRESS_WARNING(26437) // Do not slice TestCase& TestCase::operator=(const TestCase& other) { - static_cast<TestCaseData&>(*this) = static_cast<const TestCaseData&>(other); - + TestCaseData::operator=(other); m_test = other.m_test; m_type = other.m_type; m_template_id = other.m_template_id; @@ -4062,7 +4279,7 @@ namespace detail { m_name = in; // make a new name with an appended type for templated test case if(m_template_id != -1) { - m_full_name = String(m_name) + m_type; + m_full_name = String(m_name) + "<" + m_type + ">"; // redirect the name to point to the newly constructed full name m_name = m_full_name.c_str(); } @@ -4304,34 +4521,13 @@ namespace detail { getExceptionTranslators().push_back(et); } -#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING - void toStream(std::ostream* s, char* in) { *s << in; } - void toStream(std::ostream* s, const char* in) { *s << in; } -#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING - void toStream(std::ostream* s, bool in) { *s << std::boolalpha << in << std::noboolalpha; } - void toStream(std::ostream* s, float in) { *s << in; } - void toStream(std::ostream* s, double in) { *s << in; } - void toStream(std::ostream* s, double long in) { *s << in; } - - void toStream(std::ostream* s, char in) { *s << in; } - void toStream(std::ostream* s, char signed in) { *s << in; } - void toStream(std::ostream* s, char unsigned in) { *s << in; } - void toStream(std::ostream* s, int short in) { *s << in; } - void toStream(std::ostream* s, int short unsigned in) { *s << in; } - void toStream(std::ostream* s, int in) { *s << in; } - void toStream(std::ostream* s, int unsigned in) { *s << in; } - void toStream(std::ostream* s, int long in) { *s << in; } - void toStream(std::ostream* s, int long unsigned in) { *s << in; } - void toStream(std::ostream* s, int long long in) { *s << in; } - void toStream(std::ostream* s, int long long unsigned in) { *s << in; } - DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO() ContextScopeBase::ContextScopeBase() { g_infoContexts.push_back(this); } - ContextScopeBase::ContextScopeBase(ContextScopeBase&& other) { + ContextScopeBase::ContextScopeBase(ContextScopeBase&& other) noexcept { if (other.need_to_destroy) { other.destroy(); } @@ -4401,10 +4597,10 @@ namespace { static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) { // Multiple threads may enter this filter/handler at once. We want the error message to be printed on the // console just once no matter how many threads have crashed. - static std::mutex mutex; + DOCTEST_DECLARE_STATIC_MUTEX(mutex) static bool execute = true; { - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) if(execute) { bool reported = false; for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) { @@ -4577,7 +4773,7 @@ namespace { sigStack.ss_flags = 0; sigaltstack(&sigStack, &oldSigStack); struct sigaction sa = {}; - sa.sa_handler = handleSignal; // NOLINT + sa.sa_handler = handleSignal; sa.sa_flags = SA_ONSTACK; for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) { sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); @@ -4616,7 +4812,7 @@ namespace { #define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text) #else // TODO: integration with XCode and other IDEs -#define DOCTEST_OUTPUT_DEBUG_STRING(text) // NOLINT(clang-diagnostic-unused-macros) +#define DOCTEST_OUTPUT_DEBUG_STRING(text) #endif // Platform void addAssert(assertType::Enum at) { @@ -4635,8 +4831,8 @@ namespace { DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(), true}); - while(g_cs->subcasesStack.size()) { - g_cs->subcasesStack.pop_back(); + while (g_cs->subcaseStack.size()) { + g_cs->subcaseStack.pop_back(); DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY); } @@ -4648,25 +4844,26 @@ namespace { } #endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH } // namespace -namespace detail { - ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr, - const char* exception_type, const char* exception_string) { - m_test_case = g_cs->currentTest; - m_at = at; - m_file = file; - m_line = line; - m_expr = expr; - m_failed = true; - m_threw = false; - m_threw_as = false; - m_exception_type = exception_type; - m_exception_string = exception_string; +AssertData::AssertData(assertType::Enum at, const char* file, int line, const char* expr, + const char* exception_type, const StringContains& exception_string) + : m_test_case(g_cs->currentTest), m_at(at), m_file(file), m_line(line), m_expr(expr), + m_failed(true), m_threw(false), m_threw_as(false), m_exception_type(exception_type), + m_exception_string(exception_string) { #if DOCTEST_MSVC - if(m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC - ++m_expr; + if (m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC + ++m_expr; #endif // MSVC - } +} + +namespace detail { + ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr, + const char* exception_type, const String& exception_string) + : AssertData(at, file, line, expr, exception_type, exception_string) { } + + ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr, + const char* exception_type, const Contains& exception_string) + : AssertData(at, file, line, expr, exception_type, exception_string) { } void ResultBuilder::setResult(const Result& res) { m_decomp = res.m_decomp; @@ -4682,11 +4879,11 @@ namespace detail { if(m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional m_failed = !m_threw; } else if((m_at & assertType::is_throws_as) && (m_at & assertType::is_throws_with)) { //!OCLINT - m_failed = !m_threw_as || (m_exception != m_exception_string); + m_failed = !m_threw_as || !m_exception_string.check(m_exception); } else if(m_at & assertType::is_throws_as) { //!OCLINT bitwise operator in conditional m_failed = !m_threw_as; } else if(m_at & assertType::is_throws_with) { //!OCLINT bitwise operator in conditional - m_failed = m_exception != m_exception_string; + m_failed = !m_exception_string.check(m_exception); } else if(m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional m_failed = m_threw; } @@ -4721,7 +4918,7 @@ namespace detail { } bool decomp_assert(assertType::Enum at, const char* file, int line, const char* expr, - Result result) { + const Result& result) { bool failed = !result.m_passed; // ################################################################################### @@ -4730,7 +4927,6 @@ namespace detail { // ################################################################################### DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp); DOCTEST_ASSERT_IN_TESTS(result.m_decomp); - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) return !failed; } @@ -4746,8 +4942,7 @@ namespace detail { tlssPop(); } - IExceptionTranslator::IExceptionTranslator() = default; - IExceptionTranslator::~IExceptionTranslator() = default; + DOCTEST_DEFINE_INTERFACE(IExceptionTranslator) bool MessageBuilder::log() { if (!logged) { @@ -4858,10 +5053,10 @@ namespace { void ensureTagClosed(); - private: - void writeDeclaration(); + private: + void newlineIfNecessary(); bool m_tagIsOpen = false; @@ -5050,7 +5245,7 @@ namespace { XmlWriter::XmlWriter( std::ostream& os ) : m_os( os ) { - writeDeclaration(); + // writeDeclaration(); // called explicitly by the reporters that use the writer class - see issue #627 } XmlWriter::~XmlWriter() { @@ -5161,8 +5356,8 @@ namespace { struct XmlReporter : public IReporter { - XmlWriter xml; - std::mutex mutex; + XmlWriter xml; + DOCTEST_DECLARE_MUTEX(mutex) // caching pointers/references to objects of these types - safe to do const ContextOptions& opt; @@ -5256,6 +5451,8 @@ namespace { } void test_run_start() override { + xml.writeDeclaration(); + // remove .exe extension - mainly to have the same output on UNIX and Windows std::string binary_name = skipPathFromFilename(opt.binary_name.c_str()); #ifdef DOCTEST_PLATFORM_WINDOWS @@ -5322,7 +5519,7 @@ namespace { } void test_case_exception(const TestCaseException& e) override { - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) xml.scopedElement("Exception") .writeAttribute("crash", e.is_crash) @@ -5343,7 +5540,7 @@ namespace { if(!rb.m_failed && !opt.success) return; - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) xml.startElement("Expression") .writeAttribute("success", !rb.m_failed) @@ -5359,7 +5556,7 @@ namespace { if(rb.m_at & assertType::is_throws_as) xml.scopedElement("ExpectedException").writeText(rb.m_exception_type); if(rb.m_at & assertType::is_throws_with) - xml.scopedElement("ExpectedExceptionString").writeText(rb.m_exception_string); + xml.scopedElement("ExpectedExceptionString").writeText(rb.m_exception_string.c_str()); if((rb.m_at & assertType::is_normal) && !rb.m_threw) xml.scopedElement("Expanded").writeText(rb.m_decomp.c_str()); @@ -5369,7 +5566,7 @@ namespace { } void log_message(const MessageData& mb) override { - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) xml.startElement("Message") .writeAttribute("type", failureString(mb.m_severity)) @@ -5405,7 +5602,8 @@ namespace { } else if((rb.m_at & assertType::is_throws_as) && (rb.m_at & assertType::is_throws_with)) { //!OCLINT s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \"" - << rb.m_exception_string << "\", " << rb.m_exception_type << " ) " << Color::None; + << rb.m_exception_string.c_str() + << "\", " << rb.m_exception_type << " ) " << Color::None; if(rb.m_threw) { if(!rb.m_failed) { s << "threw as expected!\n"; @@ -5426,7 +5624,8 @@ namespace { } else if(rb.m_at & assertType::is_throws_with) { //!OCLINT bitwise operator in conditional s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \"" - << rb.m_exception_string << "\" ) " << Color::None + << rb.m_exception_string.c_str() + << "\" ) " << Color::None << (rb.m_threw ? (!rb.m_failed ? "threw as expected!" : "threw a DIFFERENT exception: ") : "did NOT throw at all!") @@ -5451,8 +5650,8 @@ namespace { // - more attributes in tags struct JUnitReporter : public IReporter { - XmlWriter xml; - std::mutex mutex; + XmlWriter xml; + DOCTEST_DECLARE_MUTEX(mutex) Timer timer; std::vector<String> deepestSubcaseStackNames; @@ -5548,9 +5747,13 @@ namespace { // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE // ========================================================================================= - void report_query(const QueryData&) override {} + void report_query(const QueryData&) override { + xml.writeDeclaration(); + } - void test_run_start() override {} + void test_run_start() override { + xml.writeDeclaration(); + } void test_run_end(const TestRunStats& p) override { // remove .exe extension - mainly to have the same output on UNIX and Windows @@ -5620,7 +5823,7 @@ namespace { } void test_case_exception(const TestCaseException& e) override { - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) testCaseData.addError("exception", e.error_string.c_str()); } @@ -5634,7 +5837,7 @@ namespace { if(!rb.m_failed) // report only failures & ignore the `success` option return; - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) std::ostringstream os; os << skipPathFromFilename(rb.m_file) << (opt.gnu_file_line ? ":" : "(") @@ -5685,7 +5888,7 @@ namespace { bool hasLoggedCurrentTestStart; std::vector<SubcaseSignature> subcasesStack; size_t currentSubcaseLevel; - std::mutex mutex; + DOCTEST_DECLARE_MUTEX(mutex) // caching pointers/references to objects of these types - safe to do const ContextOptions& opt; @@ -6031,7 +6234,7 @@ namespace { // log the preamble of the test case only if there is something // else to print - something other than that an assert has failed if(opt.duration || - (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure)) + (st.failure_flags && st.failure_flags != static_cast<int>(TestCaseFailureReason::AssertFailure))) logTestStart(); if(opt.duration) @@ -6062,7 +6265,7 @@ namespace { } void test_case_exception(const TestCaseException& e) override { - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) if(tc->m_no_output) return; @@ -6101,7 +6304,7 @@ namespace { if((!rb.m_failed && !opt.success) || tc->m_no_output) return; - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) logTestStart(); @@ -6117,7 +6320,7 @@ namespace { if(tc->m_no_output) return; - std::lock_guard<std::mutex> lock(mutex); + DOCTEST_LOCK_MUTEX(mutex) logTestStart(); @@ -6245,8 +6448,8 @@ namespace { char character = *current++; if(seenBackslash) { seenBackslash = false; - if(character == ',') { - s.put(','); + if(character == ',' || character == '\\') { + s.put(character); continue; } s.put('\\'); @@ -6282,30 +6485,30 @@ namespace { if(!parseOption(argc, argv, pattern, &parsedValue)) return false; - if(type == 0) { + if(type) { + // integer + // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse... + int theInt = std::atoi(parsedValue.c_str()); + if (theInt != 0) { + res = theInt; //!OCLINT parameter reassignment + return true; + } + } else { // boolean - const char positive[][5] = {"1", "true", "on", "yes"}; // 5 - strlen("true") + 1 - const char negative[][6] = {"0", "false", "off", "no"}; // 6 - strlen("false") + 1 + const char positive[][5] = { "1", "true", "on", "yes" }; // 5 - strlen("true") + 1 + const char negative[][6] = { "0", "false", "off", "no" }; // 6 - strlen("false") + 1 // if the value matches any of the positive/negative possibilities - for(unsigned i = 0; i < 4; i++) { - if(parsedValue.compare(positive[i], true) == 0) { + for (unsigned i = 0; i < 4; i++) { + if (parsedValue.compare(positive[i], true) == 0) { res = 1; //!OCLINT parameter reassignment return true; } - if(parsedValue.compare(negative[i], true) == 0) { + if (parsedValue.compare(negative[i], true) == 0) { res = 0; //!OCLINT parameter reassignment return true; } } - } else { - // integer - // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse... - int theInt = std::atoi(parsedValue.c_str()); // NOLINT - if(theInt != 0) { - res = theInt; //!OCLINT parameter reassignment - return true; - } } return false; } @@ -6473,7 +6676,6 @@ void Context::setOption(const char* option, bool value) { // allows the user to override procedurally the int options from the command line void Context::setOption(const char* option, int value) { setOption(option, toString(value).c_str()); - // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) } // allows the user to override procedurally the string options from the command line @@ -6611,7 +6813,7 @@ int Context::run() { // random_shuffle implementation const auto first = &testArray[0]; for(size_t i = testArray.size() - 1; i > 0; --i) { - int idxToSwap = std::rand() % (i + 1); // NOLINT + int idxToSwap = std::rand() % (i + 1); const auto temp = first[i]; @@ -6698,7 +6900,7 @@ int Context::run() { p->numAssertsFailedCurrentTest_atomic = 0; p->numAssertsCurrentTest_atomic = 0; - p->subcasesPassed.clear(); + p->fullyTraversedSubcases.clear(); DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc); @@ -6708,9 +6910,10 @@ int Context::run() { do { // reset some of the fields for subcases (except for the set of fully passed ones) - p->should_reenter = false; - p->subcasesCurrentMaxLevel = 0; - p->subcasesStack.clear(); + p->reachedLeaf = false; + // May not be empty if previous subcase exited via exception. + p->subcaseStack.clear(); + p->currentSubcaseDepth = 0; p->shouldLogCurrentException = true; @@ -6744,9 +6947,9 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts; } - if(p->should_reenter && run_test) + if(!p->nextSubcaseStack.empty() && run_test) DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc); - if(!p->should_reenter) + if(p->nextSubcaseStack.empty()) run_test = false; } while(run_test); @@ -6775,7 +6978,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP return cleanup_and_return(); } -IReporter::~IReporter() = default; +DOCTEST_DEFINE_INTERFACE(IReporter) int IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); } const IContextScope* const* IReporter::get_active_contexts() { |