diff options
431 files changed, 15700 insertions, 6234 deletions
diff --git a/.gitignore b/.gitignore index 6acab19251..cd6785a8ec 100644 --- a/.gitignore +++ b/.gitignore @@ -8,13 +8,10 @@ doc/_build/ *.bc # Android specific -platform/android/java/build.gradle platform/android/java/.gradle platform/android/java/.gradletasknamecache platform/android/java/local.properties platform/android/java/project.properties -platform/android/java/build.gradle -platform/android/java/AndroidManifest.xml platform/android/java/libs/* platform/android/java/assets platform/android/java/.idea/* @@ -43,12 +40,14 @@ gmon.out *.swo *.swp -# QT project files +# Qt project files *.config *.creator *.creator.* *.files *.includes +*.cflags +*.cxxflags # Eclipse CDT files .cproject diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 3e2dc1538d..5431e2b403 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -185,8 +185,8 @@ License: BSD-3-clause Files: ./thirdparty/libpng/ Comment: libpng -Copyright: 1995-2018, The PNG Reference Library Authors. - 2018, Cosmin Truta. +Copyright: 1995-2019, The PNG Reference Library Authors. + 2018-2019, Cosmin Truta. 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. 1996-1997, Andreas Dilger. 1995-1996, Guy Eric Schalnat, Group 42, Inc. diff --git a/SConstruct b/SConstruct index 78d77d1b7a..e943f8dc04 100644 --- a/SConstruct +++ b/SConstruct @@ -66,20 +66,6 @@ if 'TERM' in os.environ: env_base['ENV']['TERM'] = os.environ['TERM'] env_base.AppendENVPath('PATH', os.getenv('PATH')) env_base.AppendENVPath('PKG_CONFIG_PATH', os.getenv('PKG_CONFIG_PATH')) -env_base.android_maven_repos = [] -env_base.android_flat_dirs = [] -env_base.android_dependencies = [] -env_base.android_gradle_plugins = [] -env_base.android_gradle_classpath = [] -env_base.android_java_dirs = [] -env_base.android_res_dirs = [] -env_base.android_asset_dirs = [] -env_base.android_aidl_dirs = [] -env_base.android_jni_dirs = [] -env_base.android_default_config = [] -env_base.android_manifest_chunk = "" -env_base.android_permission_chunk = "" -env_base.android_appattributes_chunk = "" env_base.disabled_modules = [] env_base.use_ptrcall = False env_base.split_drivers = False @@ -87,20 +73,6 @@ env_base.split_modules = False env_base.module_version_string = "" env_base.msvc = False -env_base.__class__.android_add_maven_repository = methods.android_add_maven_repository -env_base.__class__.android_add_flat_dir = methods.android_add_flat_dir -env_base.__class__.android_add_dependency = methods.android_add_dependency -env_base.__class__.android_add_java_dir = methods.android_add_java_dir -env_base.__class__.android_add_res_dir = methods.android_add_res_dir -env_base.__class__.android_add_asset_dir = methods.android_add_asset_dir -env_base.__class__.android_add_aidl_dir = methods.android_add_aidl_dir -env_base.__class__.android_add_jni_dir = methods.android_add_jni_dir -env_base.__class__.android_add_default_config = methods.android_add_default_config -env_base.__class__.android_add_to_manifest = methods.android_add_to_manifest -env_base.__class__.android_add_to_permissions = methods.android_add_to_permissions -env_base.__class__.android_add_to_attributes = methods.android_add_to_attributes -env_base.__class__.android_add_gradle_plugin = methods.android_add_gradle_plugin -env_base.__class__.android_add_gradle_classpath = methods.android_add_gradle_classpath env_base.__class__.disable_module = methods.disable_module env_base.__class__.add_module_version_string = methods.add_module_version_string @@ -189,8 +161,8 @@ opts.Add("CXX", "C++ compiler") opts.Add("CC", "C compiler") opts.Add("LINK", "Linker") opts.Add("CCFLAGS", "Custom flags for both the C and C++ compilers") -opts.Add("CXXFLAGS", "Custom flags for the C++ compiler") opts.Add("CFLAGS", "Custom flags for the C compiler") +opts.Add("CXXFLAGS", "Custom flags for the C++ compiler") opts.Add("LINKFLAGS", "Custom flags for the linker") # add platform specific options @@ -299,17 +271,18 @@ if selected_platform in platform_list: CCFLAGS = env.get('CCFLAGS', '') env['CCFLAGS'] = '' - env.Append(CCFLAGS=str(CCFLAGS).split()) CFLAGS = env.get('CFLAGS', '') env['CFLAGS'] = '' - env.Append(CFLAGS=str(CFLAGS).split()) + CXXFLAGS = env.get('CXXFLAGS', '') + env['CXXFLAGS'] = '' + env.Append(CXXFLAGS=str(CXXFLAGS).split()) + LINKFLAGS = env.get('LINKFLAGS', '') env['LINKFLAGS'] = '' - env.Append(LINKFLAGS=str(LINKFLAGS).split()) flag_list = platform_flags[selected_platform] @@ -347,11 +320,19 @@ if selected_platform in platform_list: if (env["warnings"] == 'extra'): # FIXME: enable -Wclobbered once #26351 is fixed + # FIXME: enable -Wlogical-op and -Wduplicated-branches once #27594 is merged # Note: enable -Wimplicit-fallthrough for Clang (already part of -Wextra for GCC) # once we switch to C++11 or later (necessary for our FALLTHROUGH macro). - env.Append(CCFLAGS=['-Wall', '-Wextra', '-Wno-unused-parameter'] + all_plus_warnings + shadow_local_warning) + env.Append(CCFLAGS=['-Wall', '-Wextra', '-Wno-unused-parameter'] + + all_plus_warnings + shadow_local_warning) + env.Append(CXXFLAGS=['-Wctor-dtor-privacy', '-Wnon-virtual-dtor']) if methods.using_gcc(env): - env['CCFLAGS'] += ['-Wno-clobbered'] + env.Append(CCFLAGS=['-Wno-clobbered', '-Walloc-zero', + '-Wduplicated-cond', '-Wstringop-overflow=4']) + env.Append(CXXFLAGS=['-Wnoexcept', '-Wplacement-new=1']) + version = methods.get_compiler_version(env) + if version != None and version[0] >= '9': + env.Append(CCFLAGS=['-Wattribute-alias=2']) elif (env["warnings"] == 'all'): env.Append(CCFLAGS=['-Wall'] + shadow_local_warning) elif (env["warnings"] == 'moderate'): diff --git a/core/SCsub b/core/SCsub index 00d0bcac24..d5be74a64f 100644 --- a/core/SCsub +++ b/core/SCsub @@ -129,10 +129,10 @@ if env['builtin_zstd']: thirdparty_zstd_sources = [thirdparty_zstd_dir + file for file in thirdparty_zstd_sources] env_thirdparty.Append(CPPPATH=[thirdparty_zstd_dir, thirdparty_zstd_dir + "common"]) - env_thirdparty.Append(CCFLAGS="-DZSTD_STATIC_LINKING_ONLY") + env_thirdparty.Append(CPPFLAGS="-DZSTD_STATIC_LINKING_ONLY") env.Append(CPPPATH=thirdparty_zstd_dir) # Also needed in main env includes will trigger warnings - env.Append(CCFLAGS="-DZSTD_STATIC_LINKING_ONLY") + env.Append(CPPFLAGS="-DZSTD_STATIC_LINKING_ONLY") env_thirdparty.add_source_files(env.core_sources, thirdparty_zstd_sources) diff --git a/core/error_macros.h b/core/error_macros.h index ca5ccd24cf..78e29551d4 100644 --- a/core/error_macros.h +++ b/core/error_macros.h @@ -86,7 +86,7 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li #define _FNL __FILE__ ":" -/** An index has failed if m_index<0 or m_index >=m_size, the function exists */ +/** An index has failed if m_index<0 or m_index >=m_size, the function exits */ extern bool _err_error_exists; @@ -140,7 +140,7 @@ extern bool _err_error_exists; _err_error_exists = false; \ } while (0); // (*) -/** An index has failed if m_index<0 or m_index >=m_size, the function exists. +/** An index has failed if m_index<0 or m_index >=m_size, the function exits. * This function returns an error value, if returning Error, please select the most * appropriate error condition from error_macros.h */ @@ -154,7 +154,7 @@ extern bool _err_error_exists; _err_error_exists = false; \ } while (0); // (*) -/** An index has failed if m_index >=m_size, the function exists. +/** An index has failed if m_index >=m_size, the function exits. * This function returns an error value, if returning Error, please select the most * appropriate error condition from error_macros.h */ diff --git a/core/io/file_access_buffered_fa.h b/core/io/file_access_buffered_fa.h index be960fbc25..24b40cbce8 100644 --- a/core/io/file_access_buffered_fa.h +++ b/core/io/file_access_buffered_fa.h @@ -143,6 +143,14 @@ public: return f._get_modified_time(p_file); } + virtual uint32_t _get_unix_permissions(const String &p_file) { + return f._get_unix_permissions(p_file); + } + + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { + return f._set_unix_permissions(p_file, p_permissions); + } + FileAccessBufferedFA(){ }; diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index b268d5c710..6c4310a572 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -373,6 +373,19 @@ uint64_t FileAccessCompressed::_get_modified_time(const String &p_file) { return 0; } +uint32_t FileAccessCompressed::_get_unix_permissions(const String &p_file) { + if (f) + return f->_get_unix_permissions(p_file); + return 0; +} + +Error FileAccessCompressed::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + if (f) { + return f->_set_unix_permissions(p_file, p_permissions); + } + return FAILED; +} + FileAccessCompressed::FileAccessCompressed() : cmode(Compression::MODE_ZSTD), writing(false), diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index f408b1bc29..773fed6a3a 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -91,6 +91,8 @@ public: virtual bool file_exists(const String &p_name); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file); + virtual uint32_t _get_unix_permissions(const String &p_file); + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); FileAccessCompressed(); virtual ~FileAccessCompressed(); diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index 6ad68dd74d..3cf6908961 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -301,6 +301,16 @@ uint64_t FileAccessEncrypted::_get_modified_time(const String &p_file) { return 0; } +uint32_t FileAccessEncrypted::_get_unix_permissions(const String &p_file) { + + return 0; +} + +Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + + return FAILED; +} + FileAccessEncrypted::FileAccessEncrypted() { file = NULL; diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index e77d62a9f4..d779a150ac 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -79,6 +79,8 @@ public: virtual bool file_exists(const String &p_name); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file); + virtual uint32_t _get_unix_permissions(const String &p_file); + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); FileAccessEncrypted(); ~FileAccessEncrypted(); diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index 73952133c1..4db7811aaa 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -70,6 +70,8 @@ public: virtual bool file_exists(const String &p_name); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file) { return 0; } + virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; } FileAccessMemory(); }; diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp index 501a21a50d..722e62c54e 100644 --- a/core/io/file_access_network.cpp +++ b/core/io/file_access_network.cpp @@ -497,6 +497,16 @@ uint64_t FileAccessNetwork::_get_modified_time(const String &p_file) { return exists_modtime; } +uint32_t FileAccessNetwork::_get_unix_permissions(const String &p_file) { + //could be implemented, not sure if worth it + return 0; +} + +Error FileAccessNetwork::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + + return FAILED; +} + void FileAccessNetwork::configure() { GLOBAL_DEF("network/remote_fs/page_size", 65536); diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h index 5bbf7588c7..073b75a37b 100644 --- a/core/io/file_access_network.h +++ b/core/io/file_access_network.h @@ -159,6 +159,8 @@ public: virtual bool file_exists(const String &p_path); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file); + virtual uint32_t _get_unix_permissions(const String &p_file); + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); static void configure(); diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index a90672ce26..a21dd7d22d 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -142,6 +142,8 @@ class FileAccessPack : public FileAccess { FileAccess *f; virtual Error _open(const String &p_path, int p_mode_flags); virtual uint64_t _get_modified_time(const String &p_file) { return 0; } + virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; } public: virtual void close(); diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index fc8f85c07b..217176c0af 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -112,6 +112,8 @@ public: virtual bool file_exists(const String &p_name); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file) { return 0; } // todo + virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; } FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file); ~FileAccessZip(); diff --git a/core/make_binders.py b/core/make_binders.py index 4c61b90d99..5c1c66cab6 100644 --- a/core/make_binders.py +++ b/core/make_binders.py @@ -9,6 +9,12 @@ public: $ifret R$ $ifnoret void$ (T::*method)($arg, P@$) $ifconst const$; #ifdef DEBUG_METHODS_ENABLED virtual Variant::Type _gen_argument_type(int p_arg) const { return _get_argument_type(p_arg); } + virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const { + $ifret if (p_arg==-1) return GetTypeInfo<R>::METADATA;$ + $arg if (p_arg==(@-1)) return GetTypeInfo<P@>::METADATA; + $ + return GodotTypeInfo::METADATA_NONE; + } Variant::Type _get_argument_type(int p_argument) const { $ifret if (p_argument==-1) return (Variant::Type)GetTypeInfo<R>::VARIANT_TYPE;$ $arg if (p_argument==(@-1)) return (Variant::Type)GetTypeInfo<P@>::VARIANT_TYPE; @@ -94,6 +100,12 @@ public: #ifdef DEBUG_METHODS_ENABLED virtual Variant::Type _gen_argument_type(int p_arg) const { return _get_argument_type(p_arg); } + virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const { + $ifret if (p_arg==-1) return GetTypeInfo<R>::METADATA;$ + $arg if (p_arg==(@-1)) return GetTypeInfo<P@>::METADATA; + $ + return GodotTypeInfo::METADATA_NONE; + } Variant::Type _get_argument_type(int p_argument) const { $ifret if (p_argument==-1) return (Variant::Type)GetTypeInfo<R>::VARIANT_TYPE;$ diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index caf08c7379..f615cc8c65 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -210,6 +210,14 @@ void CameraMatrix::set_frustum(real_t p_left, real_t p_right, real_t p_bottom, r te[15] = 0; } +void CameraMatrix::set_frustum(real_t p_size, real_t p_aspect, Vector2 p_offset, real_t p_near, real_t p_far, bool p_flip_fov) { + if (!p_flip_fov) { + p_size *= p_aspect; + } + + set_frustum(-p_size / 2 + p_offset.x, +p_size / 2 + p_offset.x, -p_size / p_aspect / 2 + p_offset.y, +p_size / p_aspect / 2 + p_offset.y, p_near, p_far); +} + real_t CameraMatrix::get_z_far() const { const real_t *matrix = (const real_t *)this->matrix; diff --git a/core/math/camera_matrix.h b/core/math/camera_matrix.h index 015588a8cb..3bcf48f5da 100644 --- a/core/math/camera_matrix.h +++ b/core/math/camera_matrix.h @@ -61,6 +61,7 @@ struct CameraMatrix { void set_orthogonal(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_znear, real_t p_zfar); void set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear, real_t p_zfar, bool p_flip_fov = false); void set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far); + void set_frustum(real_t p_size, real_t p_aspect, Vector2 p_offset, real_t p_near, real_t p_far, bool p_flip_fov = false); static real_t get_fovy(real_t p_fovx, real_t p_aspect) { diff --git a/core/math/delaunay.h b/core/math/delaunay.h index bd0cf97937..ed52c506db 100644 --- a/core/math/delaunay.h +++ b/core/math/delaunay.h @@ -80,11 +80,11 @@ public: } static bool edge_compare(const Vector<Vector2> &p_vertices, const Edge &p_a, const Edge &p_b) { - if (p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[0]]) < CMP_EPSILON && p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[1]]) < CMP_EPSILON) { + if (Math::is_zero_approx(p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[0]])) && Math::is_zero_approx(p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[1]]))) { return true; } - if (p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[1]]) < CMP_EPSILON && p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[0]]) < CMP_EPSILON) { + if (Math::is_zero_approx(p_vertices[p_a.edge[0]].distance_to(p_vertices[p_b.edge[1]])) && Math::is_zero_approx(p_vertices[p_a.edge[1]].distance_to(p_vertices[p_b.edge[0]]))) { return true; } diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp index a84b5a16c7..0ab8707d3a 100644 --- a/core/math/geometry.cpp +++ b/core/math/geometry.cpp @@ -836,7 +836,7 @@ Geometry::MeshData Geometry::build_convex_mesh(const PoolVector<Plane> &p_planes Vector3 rel = edge1_A - edge0_A; real_t den = clip.normal.dot(rel); - if (Math::abs(den) < CMP_EPSILON) + if (Math::is_zero_approx(den)) continue; // point too short real_t dist = -(clip.normal.dot(edge0_A) - clip.d) / den; diff --git a/core/math/geometry.h b/core/math/geometry.h index 7347cb742a..f3a671aa9a 100644 --- a/core/math/geometry.h +++ b/core/math/geometry.h @@ -181,8 +181,8 @@ public: } } // finally do the division to get sc and tc - sc = (Math::abs(sN) < CMP_EPSILON ? 0.0 : sN / sD); - tc = (Math::abs(tN) < CMP_EPSILON ? 0.0 : tN / tD); + sc = (Math::is_zero_approx(sN) ? 0.0 : sN / sD); + tc = (Math::is_zero_approx(tN) ? 0.0 : tN / tD); // get the difference of the two closest points Vector3 dP = w + (sc * u) - (tc * v); // = S1(sc) - S2(tc) @@ -195,7 +195,7 @@ public: Vector3 e2 = p_v2 - p_v0; Vector3 h = p_dir.cross(e2); real_t a = e1.dot(h); - if (a > -CMP_EPSILON && a < CMP_EPSILON) // parallel test + if (Math::is_zero_approx(a)) // parallel test return false; real_t f = 1.0 / a; @@ -233,7 +233,7 @@ public: Vector3 e2 = p_v2 - p_v0; Vector3 h = rel.cross(e2); real_t a = e1.dot(h); - if (a > -CMP_EPSILON && a < CMP_EPSILON) // parallel test + if (Math::is_zero_approx(a)) // parallel test return false; real_t f = 1.0 / a; @@ -535,7 +535,7 @@ public: // see http://paulbourke.net/geometry/pointlineplane/ const real_t denom = p_dir_b.y * p_dir_a.x - p_dir_b.x * p_dir_a.y; - if (Math::abs(denom) < CMP_EPSILON) { // parallel? + if (Math::is_zero_approx(denom)) { // parallel? return false; } diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 0d209402dd..a75f2fb4ab 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -272,13 +272,20 @@ public: return diff < epsilon; } - static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b, real_t epsilon = CMP_EPSILON) { - // TODO: Comparing floats for approximate-equality is non-trivial. - // Using epsilon should cover the typical cases in Godot (where a == b is used to compare two reals), such as matrix and vector comparison operators. - // A proper implementation in terms of ULPs should eventually replace the contents of this function. - // See https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ for details. + static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b) { + real_t tolerance = CMP_EPSILON * abs(a); + if (tolerance < CMP_EPSILON) { + tolerance = CMP_EPSILON; + } + return abs(a - b) < tolerance; + } + + static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b, real_t tolerance) { + return abs(a - b) < tolerance; + } - return abs(a - b) < epsilon; + static _ALWAYS_INLINE_ bool is_zero_approx(real_t s) { + return abs(s) < CMP_EPSILON; } static _ALWAYS_INLINE_ float absf(float g) { diff --git a/core/math/plane.cpp b/core/math/plane.cpp index cd3cbce300..b01853c4ac 100644 --- a/core/math/plane.cpp +++ b/core/math/plane.cpp @@ -110,7 +110,7 @@ bool Plane::intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 real_t den = normal.dot(segment); //printf("den is %i\n",den); - if (Math::abs(den) <= CMP_EPSILON) { + if (Math::is_zero_approx(den)) { return false; } @@ -135,7 +135,7 @@ bool Plane::intersects_segment(const Vector3 &p_begin, const Vector3 &p_end, Vec real_t den = normal.dot(segment); //printf("den is %i\n",den); - if (Math::abs(den) <= CMP_EPSILON) { + if (Math::is_zero_approx(den)) { return false; } diff --git a/core/math/plane.h b/core/math/plane.h index 1c6e4b816b..ec817edd2c 100644 --- a/core/math/plane.h +++ b/core/math/plane.h @@ -125,12 +125,12 @@ Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_ bool Plane::operator==(const Plane &p_plane) const { - return normal == p_plane.normal && d == p_plane.d; + return normal == p_plane.normal && Math::is_equal_approx(d, p_plane.d); } bool Plane::operator!=(const Plane &p_plane) const { - return normal != p_plane.normal || d != p_plane.d; + return normal != p_plane.normal || !Math::is_equal_approx(d, p_plane.d); } #endif // PLANE_H diff --git a/core/math/vector2.h b/core/math/vector2.h index 9a214ef9b5..a0c6024c9f 100644 --- a/core/math/vector2.h +++ b/core/math/vector2.h @@ -106,8 +106,8 @@ struct Vector2 { bool operator==(const Vector2 &p_vec2) const; bool operator!=(const Vector2 &p_vec2) const; - bool operator<(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y < p_vec2.y) : (x < p_vec2.x); } - bool operator<=(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y <= p_vec2.y) : (x <= p_vec2.x); } + bool operator<(const Vector2 &p_vec2) const { return (Math::is_equal_approx(x, p_vec2.x)) ? (y < p_vec2.y) : (x < p_vec2.x); } + bool operator<=(const Vector2 &p_vec2) const { return (Math::is_equal_approx(x, p_vec2.x)) ? (y <= p_vec2.y) : (x < p_vec2.x); } real_t angle() const; @@ -213,11 +213,11 @@ _FORCE_INLINE_ Vector2 Vector2::operator-() const { _FORCE_INLINE_ bool Vector2::operator==(const Vector2 &p_vec2) const { - return x == p_vec2.x && y == p_vec2.y; + return Math::is_equal_approx(x, p_vec2.x) && Math::is_equal_approx(y, p_vec2.y); } _FORCE_INLINE_ bool Vector2::operator!=(const Vector2 &p_vec2) const { - return x != p_vec2.x || y != p_vec2.y; + return !Math::is_equal_approx(x, p_vec2.x) || !Math::is_equal_approx(y, p_vec2.y); } Vector2 Vector2::linear_interpolate(const Vector2 &p_b, real_t p_t) const { diff --git a/core/math/vector3.h b/core/math/vector3.h index e9074c5bd4..21fc09653f 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -341,17 +341,17 @@ Vector3 Vector3::operator-() const { bool Vector3::operator==(const Vector3 &p_v) const { - return (x == p_v.x && y == p_v.y && z == p_v.z); + return (Math::is_equal_approx(x, p_v.x) && Math::is_equal_approx(y, p_v.y) && Math::is_equal_approx(z, p_v.z)); } bool Vector3::operator!=(const Vector3 &p_v) const { - return (x != p_v.x || y != p_v.y || z != p_v.z); + return (!Math::is_equal_approx(x, p_v.x) || !Math::is_equal_approx(y, p_v.y) || !Math::is_equal_approx(z, p_v.z)); } bool Vector3::operator<(const Vector3 &p_v) const { - if (x == p_v.x) { - if (y == p_v.y) + if (Math::is_equal_approx(x, p_v.x)) { + if (Math::is_equal_approx(y, p_v.y)) return z < p_v.z; else return y < p_v.y; @@ -362,8 +362,8 @@ bool Vector3::operator<(const Vector3 &p_v) const { bool Vector3::operator<=(const Vector3 &p_v) const { - if (x == p_v.x) { - if (y == p_v.y) + if (Math::is_equal_approx(x, p_v.x)) { + if (Math::is_equal_approx(y, p_v.y)) return z <= p_v.z; else return y < p_v.y; @@ -402,13 +402,14 @@ real_t Vector3::length_squared() const { void Vector3::normalize() { - real_t l = length(); - if (l == 0) { + real_t lengthsq = length_squared(); + if (lengthsq == 0) { x = y = z = 0; } else { - x /= l; - y /= l; - z /= l; + real_t length = Math::sqrt(lengthsq); + x /= length; + y /= length; + z /= length; } } diff --git a/core/method_bind.h b/core/method_bind.h index 5ea8adb7e0..1b0c3b27c0 100644 --- a/core/method_bind.h +++ b/core/method_bind.h @@ -273,6 +273,8 @@ public: void set_argument_names(const Vector<StringName> &p_names); //set by class, db, can't be inferred otherwise Vector<StringName> get_argument_names() const; + virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const = 0; + #endif void set_hint_flags(uint32_t p_hint) { hint_flags = p_hint; } uint32_t get_hint_flags() const { return hint_flags | (is_const() ? METHOD_FLAG_CONST : 0) | (is_vararg() ? METHOD_FLAG_VARARG : 0); } @@ -329,6 +331,10 @@ public: return _gen_argument_type_info(p_arg).type; } + virtual GodotTypeInfo::Metadata get_argument_meta(int) const { + return GodotTypeInfo::METADATA_NONE; + } + #else virtual Variant::Type _gen_argument_type(int p_arg) const { diff --git a/core/object.cpp b/core/object.cpp index 039f556c87..f860423a27 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -1059,6 +1059,10 @@ Variant Object::get_meta(const String &p_name) const { return metadata[p_name]; } +void Object::remove_meta(const String &p_name) { + metadata.erase(p_name); +} + Array Object::_get_property_list_bind() const { List<PropertyInfo> lpi; @@ -1691,6 +1695,7 @@ void Object::_bind_methods() { ClassDB::bind_method(D_METHOD("get_script"), &Object::get_script); ClassDB::bind_method(D_METHOD("set_meta", "name", "value"), &Object::set_meta); + ClassDB::bind_method(D_METHOD("remove_meta", "name"), &Object::remove_meta); ClassDB::bind_method(D_METHOD("get_meta", "name"), &Object::get_meta); ClassDB::bind_method(D_METHOD("has_meta", "name"), &Object::has_meta); ClassDB::bind_method(D_METHOD("get_meta_list"), &Object::_get_meta_list_bind); diff --git a/core/object.h b/core/object.h index 3730af1ad4..94abaacdcc 100644 --- a/core/object.h +++ b/core/object.h @@ -673,6 +673,7 @@ public: bool has_meta(const String &p_name) const; void set_meta(const String &p_name, const Variant &p_value); + void remove_meta(const String &p_name); Variant get_meta(const String &p_name) const; void get_meta_list(List<String> *p_list) const; diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index 2c1c655175..d81c30f33a 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -330,7 +330,7 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) { if (err == OK && p_chmod_flags != -1) { fdst->close(); - err = fdst->_chmod(p_to, p_chmod_flags); + err = FileAccess::set_unix_permissions(p_to, p_chmod_flags); // If running on a platform with no chmod support (i.e., Windows), don't fail if (err == ERR_UNAVAILABLE) err = OK; diff --git a/core/os/file_access.cpp b/core/os/file_access.cpp index 4be1364278..079f51bada 100644 --- a/core/os/file_access.cpp +++ b/core/os/file_access.cpp @@ -507,6 +507,29 @@ uint64_t FileAccess::get_modified_time(const String &p_file) { return mt; } +uint32_t FileAccess::get_unix_permissions(const String &p_file) { + + if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file)) + return 0; + + FileAccess *fa = create_for_path(p_file); + ERR_FAIL_COND_V(!fa, 0); + + uint32_t mt = fa->_get_unix_permissions(p_file); + memdelete(fa); + return mt; +} + +Error FileAccess::set_unix_permissions(const String &p_file, uint32_t p_permissions) { + + FileAccess *fa = create_for_path(p_file); + ERR_FAIL_COND_V(!fa, ERR_CANT_CREATE); + + Error err = fa->_set_unix_permissions(p_file, p_permissions); + memdelete(fa); + return err; +} + void FileAccess::store_string(const String &p_string) { if (p_string.length() == 0) diff --git a/core/os/file_access.h b/core/os/file_access.h index 9df2a5cade..4930eae35a 100644 --- a/core/os/file_access.h +++ b/core/os/file_access.h @@ -56,6 +56,9 @@ public: bool endian_swap; bool real_is_double; + virtual uint32_t _get_unix_permissions(const String &p_file) = 0; + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) = 0; + protected: String fix_path(const String &p_path) const; virtual Error _open(const String &p_path, int p_mode_flags) = 0; ///< open a file @@ -148,14 +151,14 @@ public: virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType - virtual Error _chmod(const String &p_path, int p_mod) { return ERR_UNAVAILABLE; } - static FileAccess *create(AccessType p_access); /// Create a file access (for the current platform) this is the only portable way of accessing files. static FileAccess *create_for_path(const String &p_path); static FileAccess *open(const String &p_path, int p_mode_flags, Error *r_error = NULL); /// Create a file access (for the current platform) this is the only portable way of accessing files. static CreateFunc get_create_func(AccessType p_access); static bool exists(const String &p_name); ///< return true if a file exists static uint64_t get_modified_time(const String &p_file); + static uint32_t get_unix_permissions(const String &p_file); + static Error set_unix_permissions(const String &p_file, uint32_t p_permissions); static void set_backup_save(bool p_enable) { backup_save = p_enable; }; static bool is_backup_save_enabled() { return backup_save; }; diff --git a/core/os/os.h b/core/os/os.h index 12012fba80..4ae8a354e5 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -45,6 +45,8 @@ @author Juan Linietsky <reduzio@gmail.com> */ +class Mutex; + class OS { static OS *singleton; @@ -260,7 +262,7 @@ public: virtual int get_low_processor_usage_mode_sleep_usec() const; virtual String get_executable_path() const; - virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false) = 0; + virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false, Mutex *p_pipe_mutex = NULL) = 0; virtual Error kill(const ProcessID &p_pid) = 0; virtual int get_process_id() const; diff --git a/core/reference.h b/core/reference.h index 9105dbbd58..8a19f846c7 100644 --- a/core/reference.h +++ b/core/reference.h @@ -375,7 +375,8 @@ struct PtrToArg<const RefPtr &> { template <class T> struct GetTypeInfo<Ref<T> > { - enum { VARIANT_TYPE = Variant::OBJECT }; + static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static()); @@ -384,7 +385,8 @@ struct GetTypeInfo<Ref<T> > { template <class T> struct GetTypeInfo<const Ref<T> &> { - enum { VARIANT_TYPE = Variant::OBJECT }; + static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static()); diff --git a/core/string_builder.h b/core/string_builder.h index 40d70e8f45..0c4985d230 100644 --- a/core/string_builder.h +++ b/core/string_builder.h @@ -70,6 +70,10 @@ public: return appended_strings.size(); } + _FORCE_INLINE_ uint32_t get_string_length() const { + return string_length; + } + String as_string() const; _FORCE_INLINE_ operator String() const { diff --git a/core/translation.cpp b/core/translation.cpp index 6921f1d9f1..afbc639eaa 100644 --- a/core/translation.cpp +++ b/core/translation.cpp @@ -968,6 +968,19 @@ String TranslationServer::get_locale_name(const String &p_locale) const { return locale_name_map[p_locale]; } +Array TranslationServer::get_loaded_locales() const { + Array locales; + for (const Set<Ref<Translation> >::Element *E = translations.front(); E; E = E->next()) { + + const Ref<Translation> &t = E->get(); + String l = t->get_locale(); + + locales.push_back(l); + } + + return locales; +} + Vector<String> TranslationServer::get_all_locales() { Vector<String> locales; @@ -1168,6 +1181,8 @@ void TranslationServer::_bind_methods() { ClassDB::bind_method(D_METHOD("remove_translation", "translation"), &TranslationServer::remove_translation); ClassDB::bind_method(D_METHOD("clear"), &TranslationServer::clear); + + ClassDB::bind_method(D_METHOD("get_loaded_locales"), &TranslationServer::get_loaded_locales); } void TranslationServer::load_translations() { diff --git a/core/translation.h b/core/translation.h index b12bad0d72..d172b9ecf2 100644 --- a/core/translation.h +++ b/core/translation.h @@ -94,6 +94,8 @@ public: String get_locale_name(const String &p_locale) const; + Array get_loaded_locales() const; + void add_translation(const Ref<Translation> &p_translation); void remove_translation(const Ref<Translation> &p_translation); diff --git a/core/type_info.h b/core/type_info.h index c38688fea1..d85a63ee42 100644 --- a/core/type_info.h +++ b/core/type_info.h @@ -67,43 +67,80 @@ struct TypeInherits { !TypesAreSame<B volatile const, void volatile const>::value; }; +namespace GodotTypeInfo { +enum Metadata { + METADATA_NONE, + METADATA_INT_IS_INT8, + METADATA_INT_IS_INT16, + METADATA_INT_IS_INT32, + METADATA_INT_IS_INT64, + METADATA_INT_IS_UINT8, + METADATA_INT_IS_UINT16, + METADATA_INT_IS_UINT32, + METADATA_INT_IS_UINT64, + METADATA_REAL_IS_FLOAT, + METADATA_REAL_IS_DOUBLE +}; +} + template <class T, typename = void> struct GetTypeInfo { static const Variant::Type VARIANT_TYPE = Variant::NIL; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { ERR_PRINT("GetTypeInfo fallback. Bug!"); return PropertyInfo(); // Not "Nil", this is an error } }; -#define MAKE_TYPE_INFO(m_type, m_var_type) \ - template <> \ - struct GetTypeInfo<m_type> { \ - static const Variant::Type VARIANT_TYPE = m_var_type; \ - static inline PropertyInfo get_class_info() { \ - return PropertyInfo(VARIANT_TYPE, String()); \ - } \ - }; \ - template <> \ - struct GetTypeInfo<const m_type &> { \ - static const Variant::Type VARIANT_TYPE = m_var_type; \ - static inline PropertyInfo get_class_info() { \ - return PropertyInfo(VARIANT_TYPE, String()); \ - } \ +#define MAKE_TYPE_INFO(m_type, m_var_type) \ + template <> \ + struct GetTypeInfo<m_type> { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ + }; \ + template <> \ + struct GetTypeInfo<const m_type &> { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ + }; + +#define MAKE_TYPE_INFO_WITH_META(m_type, m_var_type, m_metadata) \ + template <> \ + struct GetTypeInfo<m_type> { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = m_metadata; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ + }; \ + template <> \ + struct GetTypeInfo<const m_type &> { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = m_metadata; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ }; MAKE_TYPE_INFO(bool, Variant::BOOL) -MAKE_TYPE_INFO(uint8_t, Variant::INT) -MAKE_TYPE_INFO(int8_t, Variant::INT) -MAKE_TYPE_INFO(uint16_t, Variant::INT) -MAKE_TYPE_INFO(int16_t, Variant::INT) -MAKE_TYPE_INFO(uint32_t, Variant::INT) -MAKE_TYPE_INFO(int32_t, Variant::INT) -MAKE_TYPE_INFO(int64_t, Variant::INT) -MAKE_TYPE_INFO(uint64_t, Variant::INT) +MAKE_TYPE_INFO_WITH_META(uint8_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT8) +MAKE_TYPE_INFO_WITH_META(int8_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT8) +MAKE_TYPE_INFO_WITH_META(uint16_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT16) +MAKE_TYPE_INFO_WITH_META(int16_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT16) +MAKE_TYPE_INFO_WITH_META(uint32_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT32) +MAKE_TYPE_INFO_WITH_META(int32_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT32) +MAKE_TYPE_INFO_WITH_META(uint64_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_UINT64) +MAKE_TYPE_INFO_WITH_META(int64_t, Variant::INT, GodotTypeInfo::METADATA_INT_IS_INT64) MAKE_TYPE_INFO(wchar_t, Variant::INT) -MAKE_TYPE_INFO(float, Variant::REAL) -MAKE_TYPE_INFO(double, Variant::REAL) +MAKE_TYPE_INFO_WITH_META(float, Variant::REAL, GodotTypeInfo::METADATA_REAL_IS_FLOAT) +MAKE_TYPE_INFO_WITH_META(double, Variant::REAL, GodotTypeInfo::METADATA_REAL_IS_DOUBLE) MAKE_TYPE_INFO(String, Variant::STRING) MAKE_TYPE_INFO(Vector2, Variant::VECTOR2) @@ -138,6 +175,7 @@ MAKE_TYPE_INFO(BSP_Tree, Variant::DICTIONARY) template <> struct GetTypeInfo<RefPtr> { static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, "Reference"); } @@ -145,6 +183,7 @@ struct GetTypeInfo<RefPtr> { template <> struct GetTypeInfo<const RefPtr &> { static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::OBJECT, String(), PROPERTY_HINT_RESOURCE_TYPE, "Reference"); } @@ -154,6 +193,7 @@ struct GetTypeInfo<const RefPtr &> { template <> struct GetTypeInfo<Variant> { static const Variant::Type VARIANT_TYPE = Variant::NIL; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::NIL, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT); } @@ -162,25 +202,28 @@ struct GetTypeInfo<Variant> { template <> struct GetTypeInfo<const Variant &> { static const Variant::Type VARIANT_TYPE = Variant::NIL; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::NIL, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT); } }; -#define MAKE_TEMPLATE_TYPE_INFO(m_template, m_type, m_var_type) \ - template <> \ - struct GetTypeInfo<m_template<m_type> > { \ - static const Variant::Type VARIANT_TYPE = m_var_type; \ - static inline PropertyInfo get_class_info() { \ - return PropertyInfo(VARIANT_TYPE, String()); \ - } \ - }; \ - template <> \ - struct GetTypeInfo<const m_template<m_type> &> { \ - static const Variant::Type VARIANT_TYPE = m_var_type; \ - static inline PropertyInfo get_class_info() { \ - return PropertyInfo(VARIANT_TYPE, String()); \ - } \ +#define MAKE_TEMPLATE_TYPE_INFO(m_template, m_type, m_var_type) \ + template <> \ + struct GetTypeInfo<m_template<m_type> > { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ + }; \ + template <> \ + struct GetTypeInfo<const m_template<m_type> &> { \ + static const Variant::Type VARIANT_TYPE = m_var_type; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(VARIANT_TYPE, String()); \ + } \ }; MAKE_TEMPLATE_TYPE_INFO(Vector, uint8_t, Variant::POOL_BYTE_ARRAY) @@ -202,6 +245,7 @@ MAKE_TEMPLATE_TYPE_INFO(PoolVector, Face3, Variant::POOL_VECTOR3_ARRAY) template <typename T> struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type> { static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(StringName(T::get_class_static())); } @@ -210,6 +254,7 @@ struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type> template <typename T> struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>::type> { static const Variant::Type VARIANT_TYPE = Variant::OBJECT; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(StringName(T::get_class_static())); } @@ -219,6 +264,7 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>: template <> \ struct GetTypeInfo<m_impl> { \ static const Variant::Type VARIANT_TYPE = Variant::INT; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ static inline PropertyInfo get_class_info() { \ return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, String(#m_enum).replace("::", ".")); \ } \ diff --git a/core/ustring.cpp b/core/ustring.cpp index d60bd16921..78feddb229 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -123,6 +123,31 @@ const char *CharString::get_data() const { return ""; } +CharString &CharString::operator=(const char *p_cstr) { + + copy_from(p_cstr); + return *this; +} + +void CharString::copy_from(const char *p_cstr) { + + if (!p_cstr) { + resize(0); + return; + } + + size_t len = strlen(p_cstr); + + if (len == 0) { + resize(0); + return; + } + + resize(len + 1); // include terminating null char + + strcpy(ptrw(), p_cstr); +} + void String::copy_from(const char *p_cstr) { if (!p_cstr) { diff --git a/core/ustring.h b/core/ustring.h index 85103057df..e2e62874d6 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -101,12 +101,17 @@ public: _cowdata._ref(p_str._cowdata); return *this; } + _FORCE_INLINE_ CharString(const char *p_cstr) { copy_from(p_cstr); } + CharString &operator=(const char *p_cstr); bool operator<(const CharString &p_right) const; CharString &operator+=(char p_char); int length() const { return size() ? size() - 1 : 0; } const char *get_data() const; operator const char *() const { return get_data(); }; + +protected: + void copy_from(const char *p_cstr); }; typedef wchar_t CharType; diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 143b07418e..f9f73b4e51 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -36,6 +36,7 @@ #include "core/object.h" #include "core/os/os.h" #include "core/script_language.h" +#include "thirdparty/misc/sha256.h" typedef void (*VariantFunc)(Variant &r_ret, Variant &p_self, const Variant **p_args); typedef void (*VariantConstructFunc)(Variant &r_ret, const Variant **p_args); @@ -587,6 +588,19 @@ struct _VariantCall { r_ret = decompressed; } + static void _call_PoolByteArray_sha256_string(Variant &r_ret, Variant &p_self, const Variant **p_args) { + PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem); + PoolByteArray::Read r = ba->read(); + String s; + unsigned char hash[32]; + sha256_context sha256; + sha256_init(&sha256); + sha256_hash(&sha256, (unsigned char *)r.ptr(), ba->size()); + sha256_done(&sha256, hash); + s = String::hex_encode_buffer(hash, 32); + r_ret = s; + } + VCALL_LOCALMEM0R(PoolByteArray, size); VCALL_LOCALMEM2(PoolByteArray, set); VCALL_LOCALMEM1R(PoolByteArray, get); @@ -1733,6 +1747,7 @@ void register_variant_methods() { ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_ascii, varray()); ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_utf8, varray()); + ADDFUNC0R(POOL_BYTE_ARRAY, STRING, PoolByteArray, sha256_string, varray()); ADDFUNC1R(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, compress, INT, "compression_mode", varray(0)); ADDFUNC2R(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, decompress, INT, "buffer_size", INT, "compression_mode", varray(0)); diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index 6377197282..d7371b0434 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -1542,6 +1542,9 @@ Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r } else if (c != '=') { what += String::chr(c); } else { + if (p_stream->is_utf8()) { + what.parse_utf8(what.ascii(true).get_data()); + } r_assign = what; Token token; get_token(p_stream, token, line, r_err_str); diff --git a/doc/classes/@GDScript.xml b/doc/classes/@GDScript.xml index e31d815063..22834a4c81 100644 --- a/doc/classes/@GDScript.xml +++ b/doc/classes/@GDScript.xml @@ -92,7 +92,7 @@ <argument index="0" name="condition" type="bool"> </argument> <description> - Assert that the [code]condition[/code] is true. If the [code]condition[/code] is false a fatal error is generated and the program is halted. Useful for debugging to make sure a value is always true. + Assert that the [code]condition[/code] is [code]true[/code] . If the [code]condition[/code] is [code]false[/code] a fatal error is generated and the program is halted. Useful for debugging to make sure a value is always [code]true[/code]. [codeblock] # Speed should always be between 0 and 20 speed = -10 @@ -498,6 +498,17 @@ [/codeblock] </description> </method> + <method name="is_equal_approx"> + <return type="bool"> + </return> + <argument index="0" name="a" type="float"> + </argument> + <argument index="1" name="b" type="float"> + </argument> + <description> + Returns True/False whether [code]a[/code] and [code]b[/code] are approximately equal to each other. + </description> + </method> <method name="is_inf"> <return type="bool"> </return> @@ -525,6 +536,15 @@ Returns whether [code]s[/code] is a NaN (Not-A-Number) value. </description> </method> + <method name="is_zero_approx"> + <return type="bool"> + </return> + <argument index="0" name="s" type="float"> + </argument> + <description> + Returns True/False whether [code]s[/code] is zero or almost zero. + </description> + </method> <method name="len"> <return type="int"> </return> diff --git a/doc/classes/ARVRAnchor.xml b/doc/classes/ARVRAnchor.xml index 092d5e2916..91f44151fa 100644 --- a/doc/classes/ARVRAnchor.xml +++ b/doc/classes/ARVRAnchor.xml @@ -22,7 +22,7 @@ <return type="bool"> </return> <description> - Returns true if the anchor is being tracked and false if no anchor with this id is currently known. + Returns [code]true[/code] if the anchor is being tracked and [code]false[/code] if no anchor with this id is currently known. </description> </method> <method name="get_mesh" qualifiers="const"> diff --git a/doc/classes/ARVRInterface.xml b/doc/classes/ARVRInterface.xml index bb03c50be9..11084fb98e 100644 --- a/doc/classes/ARVRInterface.xml +++ b/doc/classes/ARVRInterface.xml @@ -53,7 +53,7 @@ <return type="bool"> </return> <description> - Returns true if the current output of this interface is in stereo. + Returns [code]true[/code] if the current output of this interface is in stereo. </description> </method> <method name="uninitialize"> diff --git a/doc/classes/ARVRServer.xml b/doc/classes/ARVRServer.xml index b828d45cbe..6f5a76943f 100644 --- a/doc/classes/ARVRServer.xml +++ b/doc/classes/ARVRServer.xml @@ -54,7 +54,7 @@ <return type="int"> </return> <description> - Get the number of interfaces currently registered with the AR/VR server. If your game supports multiple AR/VR platforms, you can look through the available interface, and either present the user with a selection or simply try an initialize each interface and use the first one that returns true. + Get the number of interfaces currently registered with the AR/VR server. If your game supports multiple AR/VR platforms, you can look through the available interface, and either present the user with a selection or simply try an initialize each interface and use the first one that returns [code]true[/code]. </description> </method> <method name="get_interfaces" qualifiers="const"> diff --git a/doc/classes/AnimatedSprite.xml b/doc/classes/AnimatedSprite.xml index a5202dc612..2d4dd0e4b2 100644 --- a/doc/classes/AnimatedSprite.xml +++ b/doc/classes/AnimatedSprite.xml @@ -13,7 +13,7 @@ <return type="bool"> </return> <description> - Return true if an animation if currently being played. + Return [code]true[/code] if an animation if currently being played. </description> </method> <method name="play"> diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml index 1607a2e105..4c6868d807 100644 --- a/doc/classes/AnimatedSprite3D.xml +++ b/doc/classes/AnimatedSprite3D.xml @@ -13,7 +13,7 @@ <return type="bool"> </return> <description> - Return true if an animation if currently being played. + Return [code]true[/code] if an animation if currently being played. </description> </method> <method name="play"> diff --git a/doc/classes/Animation.xml b/doc/classes/Animation.xml index 23227c7404..af3abed256 100644 --- a/doc/classes/Animation.xml +++ b/doc/classes/Animation.xml @@ -438,7 +438,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> - Return true if the given track is imported. Else, return false. + Return [code]true[/code] if the given track is imported. Else, return [code]false[/code]. </description> </method> <method name="track_move_down"> diff --git a/doc/classes/AnimationNode.xml b/doc/classes/AnimationNode.xml index 7ce4aae4fd..e61fe374fa 100644 --- a/doc/classes/AnimationNode.xml +++ b/doc/classes/AnimationNode.xml @@ -52,7 +52,7 @@ <argument index="5" name="optimize" type="bool" default="true"> </argument> <description> - Blend an input. This is only useful for nodes created for an [AnimationNodeBlendTree]. Time is a delta, unless "seek" is true, in which case it is absolute. A filter mode may be optionally passed. + Blend an input. This is only useful for nodes created for an [AnimationNodeBlendTree]. Time is a delta, unless "seek" is [code]true[/code], in which case it is absolute. A filter mode may be optionally passed. </description> </method> <method name="blend_node"> @@ -144,7 +144,7 @@ <return type="String"> </return> <description> - Return true whether you want the blend tree editor to display filter editing on this node. + Return [code]true[/code] whether you want the blend tree editor to display filter editing on this node. </description> </method> <method name="is_path_filtered" qualifiers="const"> @@ -153,7 +153,7 @@ <argument index="0" name="path" type="NodePath"> </argument> <description> - Return true wether a given path is filtered. + Return [code]true[/code] wether a given path is filtered. </description> </method> <method name="process" qualifiers="virtual"> @@ -164,7 +164,7 @@ <argument index="1" name="seek" type="bool"> </argument> <description> - Called when a custom node is processed. The argument "time" is relative, unless "seek" is true (in which case it is absolute). + Called when a custom node is processed. The argument "time" is relative, unless "seek" is [code]true[/code] (in which case it is absolute). Here, call the [method blend_input], [method blend_node] or [method blend_animation] functions. You can also use [method get_parameter] and [method set_parameter] to modify local memory. This function returns the time left for the current animation to finish (if unsure, just pass the value from the main blend being called). diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml index 509285cdb8..5ea993f83d 100644 --- a/doc/classes/AnimationPlayer.xml +++ b/doc/classes/AnimationPlayer.xml @@ -142,7 +142,7 @@ <argument index="3" name="from_end" type="bool" default="false"> </argument> <description> - Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards. + Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being [code]true[/code] can play the animation backwards. If the animation has been paused by [code]stop(true)[/code] it will be resumed. Calling [code]play()[/code] without arguments will also resume the animation. </description> </method> diff --git a/doc/classes/Array.xml b/doc/classes/Array.xml index 73ca6ab5b3..ecafc3514c 100644 --- a/doc/classes/Array.xml +++ b/doc/classes/Array.xml @@ -103,7 +103,7 @@ <argument index="1" name="before" type="bool" default="True"> </argument> <description> - Finds the index of an existing value (or the insertion index that maintains sorting order, if the value is not yet present in the array) using binary search. Optionally, a before specifier can be passed. If false, the returned index comes after all existing entries of the value in the array. Note that calling bsearch on an unsorted array results in unexpected behavior. + Finds the index of an existing value (or the insertion index that maintains sorting order, if the value is not yet present in the array) using binary search. Optionally, a before specifier can be passed. If [code]false[/code], the returned index comes after all existing entries of the value in the array. Note that calling bsearch on an unsorted array results in unexpected behavior. </description> </method> <method name="bsearch_custom"> @@ -118,7 +118,7 @@ <argument index="3" name="before" type="bool" default="True"> </argument> <description> - Finds the index of an existing value (or the insertion index that maintains sorting order, if the value is not yet present in the array) using binary search and a custom comparison method. Optionally, a before specifier can be passed. If false, the returned index comes after all existing entries of the value in the array. The custom method receives two arguments (an element from the array and the value searched for) and must return true if the first argument is less than the second, and return false otherwise. Note that calling bsearch on an unsorted array results in unexpected behavior. + Finds the index of an existing value (or the insertion index that maintains sorting order, if the value is not yet present in the array) using binary search and a custom comparison method. Optionally, a before specifier can be passed. If [code]false[/code], the returned index comes after all existing entries of the value in the array. The custom method receives two arguments (an element from the array and the value searched for) and must return [code]true[/code] if the first argument is less than the second, and return [code]false[/code] otherwise. Note that calling bsearch on an unsorted array results in unexpected behavior. </description> </method> <method name="clear"> @@ -312,7 +312,7 @@ <argument index="1" name="func" type="String"> </argument> <description> - Sorts the array using a custom method. The arguments are an object that holds the method and the name of such method. The custom method receives two arguments (a pair of elements from the array) and must return true if the first argument is less than the second, and return false otherwise. + Sorts the array using a custom method. The arguments are an object that holds the method and the name of such method. The custom method receives two arguments (a pair of elements from the array) and must return [code]true[/code] if the first argument is less than the second, and return [code]false[/code] otherwise. [b]Note:[/b] you cannot randomize the return value as the heapsort algorithm expects a deterministic result. Doing so will result in unexpected behavior. [codeblock] class MyCustomSorter: diff --git a/doc/classes/ArrayMesh.xml b/doc/classes/ArrayMesh.xml index 00bd72d4a5..db0fc77b25 100644 --- a/doc/classes/ArrayMesh.xml +++ b/doc/classes/ArrayMesh.xml @@ -205,31 +205,31 @@ Amount of weights/bone indices per vertex (always 4). </constant> <constant name="ARRAY_VERTEX" value="0" enum="ArrayType"> - Vertex array (array of [Vector3] vertices). + [PoolVector3Array], [PoolVector2Array], or [Array] of vertex positions. </constant> <constant name="ARRAY_NORMAL" value="1" enum="ArrayType"> - Normal array (array of [Vector3] normals). + [PoolVector3Array] of vertex normals. </constant> <constant name="ARRAY_TANGENT" value="2" enum="ArrayType"> - Tangent array, array of groups of 4 floats. first 3 floats determine the tangent, and the last the binormal direction as -1 or 1. + [PoolRealArray] of vertex tangents. Each element in groups of 4 floats, first 3 floats determine the tangent, and the last the binormal direction as -1 or 1. </constant> <constant name="ARRAY_COLOR" value="3" enum="ArrayType"> - Vertex array (array of [Color] colors). + [PoolColorArray] of vertex colors. </constant> <constant name="ARRAY_TEX_UV" value="4" enum="ArrayType"> - UV array (array of [Vector3] UVs or float array of groups of 2 floats (u,v)). + [PoolVector2Array] for UV coordinates. </constant> <constant name="ARRAY_TEX_UV2" value="5" enum="ArrayType"> - Second UV array (array of [Vector3] UVs or float array of groups of 2 floats (u,v)). + [PoolVector2Array] for second UV coordinates. </constant> <constant name="ARRAY_BONES" value="6" enum="ArrayType"> - Array of bone indices, as a float array. Each element in groups of 4 floats. + [PoolRealArray] or [PoolIntArray] of bone indices. Each element in groups of 4 floats. </constant> <constant name="ARRAY_WEIGHTS" value="7" enum="ArrayType"> - Array of bone weights, as a float array. Each element in groups of 4 floats. + [PoolRealArray] of bone weights. Each element in groups of 4 floats. </constant> <constant name="ARRAY_INDEX" value="8" enum="ArrayType"> - [Array] of integers used as indices referencing vertices, colors, normals, tangents, and textures. All of those arrays must have the same number of elements as the vertex array. No index can be beyond the vertex array size. When this index array is present, it puts the function into "index mode," where the index selects the *i*'th vertex, normal, tangent, color, UV, etc. This means if you want to have different normals or colors along an edge, you have to duplicate the vertices. + [PoolIntArray] of integers used as indices referencing vertices, colors, normals, tangents, and textures. All of those arrays must have the same number of elements as the vertex array. No index can be beyond the vertex array size. When this index array is present, it puts the function into "index mode," where the index selects the *i*'th vertex, normal, tangent, color, UV, etc. This means if you want to have different normals or colors along an edge, you have to duplicate the vertices. For triangles, the index array is interpreted as triples, referring to the vertices of each triangle. For lines, the index array is in pairs indicating the start and end of each line. </constant> <constant name="ARRAY_MAX" value="9" enum="ArrayType"> diff --git a/doc/classes/AudioServer.xml b/doc/classes/AudioServer.xml index 83fbd28152..6dc1600cf2 100644 --- a/doc/classes/AudioServer.xml +++ b/doc/classes/AudioServer.xml @@ -184,6 +184,12 @@ Returns the sample rate at the output of the audioserver. </description> </method> + <method name="get_output_latency" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> <method name="get_speaker_mode" qualifiers="const"> <return type="int" enum="AudioServer.SpeakerMode"> </return> @@ -191,6 +197,18 @@ Returns the speaker configuration. </description> </method> + <method name="get_time_since_last_mix" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_time_to_next_mix" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> <method name="is_bus_bypassing_effects" qualifiers="const"> <return type="bool"> </return> diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml index c6ec45f15e..07d7c875db 100644 --- a/doc/classes/AudioStreamPlayer.xml +++ b/doc/classes/AudioStreamPlayer.xml @@ -10,6 +10,15 @@ <link>https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html</link> </tutorials> <methods> + <method name="get_mix_time" qualifiers="const"> + <return type="float"> + </return> + <description> + Returns the actual amount of time this stream player was mixing since play() was pressed. + To know the exact position this song is mixing right now, add the value to [method AudioServer.get_time_since_last_mix]. + Also consider substracting [method AudioServer.get_output_latency] to that result. + </description> + </method> <method name="get_playback_position"> <return type="float"> </return> diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml index 6083372b72..2bd3ac1eaa 100644 --- a/doc/classes/AudioStreamPlayer3D.xml +++ b/doc/classes/AudioStreamPlayer3D.xml @@ -60,7 +60,7 @@ Amount how much the filter affects the loudness, in dB. </member> <member name="attenuation_model" type="int" setter="set_attenuation_model" getter="get_attenuation_model" enum="AudioStreamPlayer3D.AttenuationModel"> - Decides if audio should get quieter with distance linearly, quadratically or logarithmically. + Decides if audio should get quieter with distance linearly, quadratically, logarithmically, or not be affected by distance, effectively disabling attenuation. </member> <member name="autoplay" type="bool" setter="set_autoplay" getter="is_autoplay_enabled"> If [code]true[/code], audio plays when added to scene tree. Default value: [code]false[/code]. @@ -124,6 +124,9 @@ <constant name="ATTENUATION_LOGARITHMIC" value="2" enum="AttenuationModel"> Logarithmic dampening of loudness according to distance. </constant> + <constant name="ATTENUATION_DISABLED" value="3" enum="AttenuationModel"> + No dampening of loudness according to distance. + </constant> <constant name="OUT_OF_RANGE_MIX" value="0" enum="OutOfRangeMode"> Mix this audio in, even when it's out of range. </constant> diff --git a/doc/classes/BaseButton.xml b/doc/classes/BaseButton.xml index 3c8d4ea0d8..08be3ed0f4 100644 --- a/doc/classes/BaseButton.xml +++ b/doc/classes/BaseButton.xml @@ -36,7 +36,7 @@ <return type="bool"> </return> <description> - Return true if the mouse has entered the button and has not left it yet. + Return [code]true[/code] if the mouse has entered the button and has not left it yet. </description> </method> </methods> diff --git a/doc/classes/BitMap.xml b/doc/classes/BitMap.xml index 2e4aaed099..7f03c22b70 100644 --- a/doc/classes/BitMap.xml +++ b/doc/classes/BitMap.xml @@ -15,7 +15,7 @@ <argument index="0" name="size" type="Vector2"> </argument> <description> - Creates a bitmap with the specified size, filled with false. + Creates a bitmap with the specified size, filled with [code]false[/code]. </description> </method> <method name="create_from_image_alpha"> @@ -26,7 +26,7 @@ <argument index="1" name="threshold" type="float" default="0.1"> </argument> <description> - Creates a bitmap that matches the given image dimensions, every element of the bitmap is set to false if the alpha value of the image at that position is equal to [code]threshold[/code] or less, and true in other case. + Creates a bitmap that matches the given image dimensions, every element of the bitmap is set to [code]false[/code] if the alpha value of the image at that position is equal to [code]threshold[/code] or less, and [code]true[/code] in other case. </description> </method> <method name="get_bit" qualifiers="const"> @@ -49,7 +49,7 @@ <return type="int"> </return> <description> - Returns the amount of bitmap elements that are set to true. + Returns the amount of bitmap elements that are set to [code]true[/code]. </description> </method> <method name="grow_mask"> diff --git a/doc/classes/Camera.xml b/doc/classes/Camera.xml index 2716bee0f3..014df2b72a 100644 --- a/doc/classes/Camera.xml +++ b/doc/classes/Camera.xml @@ -15,7 +15,7 @@ <argument index="0" name="enable_next" type="bool" default="true"> </argument> <description> - If this is the current Camera, remove it from being current. If [code]enable_next[/code] is true, request to make the next Camera current, if any. + If this is the current Camera, remove it from being current. If [code]enable_next[/code] is [code]true[/code], request to make the next Camera current, if any. </description> </method> <method name="get_camera_transform" qualifiers="const"> @@ -101,6 +101,20 @@ <description> </description> </method> + <method name="set_frustum"> + <return type="void"> + </return> + <argument index="0" name="size" type="float"> + </argument> + <argument index="1" name="offset" type="Vector2"> + </argument> + <argument index="2" name="z_near" type="float"> + </argument> + <argument index="3" name="z_far" type="float"> + </argument> + <description> + </description> + </method> <method name="set_orthogonal"> <return type="void"> </return> @@ -156,6 +170,8 @@ <member name="fov" type="float" setter="set_fov" getter="get_fov"> The camera's field of view angle (in degrees). Only applicable in perspective mode. Since [member keep_aspect] locks one axis, [code]fov[/code] sets the other axis' field of view angle. </member> + <member name="frustum_offset" type="Vector2" setter="set_frustum_offset" getter="get_frustum_offset"> + </member> <member name="h_offset" type="float" setter="set_h_offset" getter="get_h_offset"> The horizontal (X) offset of the Camera viewport. </member> @@ -182,6 +198,8 @@ <constant name="PROJECTION_ORTHOGONAL" value="1" enum="Projection"> Orthogonal Projection (objects remain the same size on the screen no matter how far away they are). </constant> + <constant name="PROJECTION_FRUSTUM" value="2" enum="Projection"> + </constant> <constant name="KEEP_WIDTH" value="0" enum="KeepAspect"> Preserves the horizontal aspect ratio. </constant> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index f3e598c17d..82a5679172 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -97,6 +97,10 @@ </argument> <argument index="2" name="normal_map" type="Texture" default="null"> </argument> + <argument index="3" name="transform" type="Transform2D" default="Transform2D( 1, 0, 0, 1, 0, 0 )"> + </argument> + <argument index="4" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )"> + </argument> <description> </description> </method> diff --git a/doc/classes/ClassDB.xml b/doc/classes/ClassDB.xml index a37dd28d72..b029c85409 100644 --- a/doc/classes/ClassDB.xml +++ b/doc/classes/ClassDB.xml @@ -15,7 +15,7 @@ <argument index="0" name="class" type="String"> </argument> <description> - Returns true if you can instance objects from the specified 'class', false in other case. + Returns [code]true[/code] if you can instance objects from the specified 'class', [code]false[/code] in other case. </description> </method> <method name="class_exists" qualifiers="const"> @@ -66,7 +66,7 @@ <argument index="1" name="no_inheritance" type="bool" default="false"> </argument> <description> - Returns an array with all the methods of 'class' or its ancestry if 'no_inheritance' is false. Every element of the array is a [Dictionary] with the following keys: args, default_args, flags, id, name, return: (class_name, hint, hint_string, name, type, usage). + Returns an array with all the methods of 'class' or its ancestry if 'no_inheritance' is [code]false[/code]. Every element of the array is a [Dictionary] with the following keys: args, default_args, flags, id, name, return: (class_name, hint, hint_string, name, type, usage). </description> </method> <method name="class_get_property" qualifiers="const"> @@ -88,7 +88,7 @@ <argument index="1" name="no_inheritance" type="bool" default="false"> </argument> <description> - Returns an array with all the properties of 'class' or its ancestry if 'no_inheritance' is false. + Returns an array with all the properties of 'class' or its ancestry if 'no_inheritance' is [code]false[/code]. </description> </method> <method name="class_get_signal" qualifiers="const"> @@ -110,7 +110,7 @@ <argument index="1" name="no_inheritance" type="bool" default="false"> </argument> <description> - Returns an array with all the signals of 'class' or its ancestry if 'no_inheritance' is false. Every element of the array is a [Dictionary] as described in [method class_get_signal]. + Returns an array with all the signals of 'class' or its ancestry if 'no_inheritance' is [code]false[/code]. Every element of the array is a [Dictionary] as described in [method class_get_signal]. </description> </method> <method name="class_has_integer_constant" qualifiers="const"> diff --git a/doc/classes/CollisionPolygon.xml b/doc/classes/CollisionPolygon.xml index c40c8a82c3..85eb17cae7 100644 --- a/doc/classes/CollisionPolygon.xml +++ b/doc/classes/CollisionPolygon.xml @@ -15,7 +15,7 @@ Length that the resulting collision extends in either direction perpendicular to its polygon. </member> <member name="disabled" type="bool" setter="set_disabled" getter="is_disabled"> - If true, no collision will be produced. + If [code]true[/code], no collision will be produced. </member> <member name="polygon" type="PoolVector2Array" setter="set_polygon" getter="get_polygon"> Array of vertices which define the polygon. Note that the returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the [code]polygon[/code] member. diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index 224efeb3f5..f7fbdf08ed 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -682,7 +682,7 @@ Controls whether the control will be able to receive mouse button input events through [method _gui_input] and how these events should be handled. Also controls whether the control can receive the [signal mouse_entered], and [signal mouse_exited] signals. See the constants to learn what each does. </member> <member name="rect_clip_content" type="bool" setter="set_clip_contents" getter="is_clipping_contents"> - Enables whether rendering of children should be clipped to this control's rectangle. If true, parts of a child which would be visibly outside of this control's rectangle will not be rendered. + Enables whether rendering of children should be clipped to this control's rectangle. If [code]true[/code], parts of a child which would be visibly outside of this control's rectangle will not be rendered. </member> <member name="rect_global_position" type="Vector2" setter="set_global_position" getter="get_global_position"> The node's global position, relative to the world (usually to the top-left corner of the window). diff --git a/doc/classes/Curve2D.xml b/doc/classes/Curve2D.xml index d4aaa24b8c..3631711a8f 100644 --- a/doc/classes/Curve2D.xml +++ b/doc/classes/Curve2D.xml @@ -122,7 +122,7 @@ </argument> <description> Returns a point within the curve at position [code]offset[/code], where [code]offset[/code] is measured as a pixel distance along the curve. - To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to true, or linear if set to false. + To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to [code]true[/code], or linear if set to [code]false[/code]. Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough). </description> </method> diff --git a/doc/classes/Curve3D.xml b/doc/classes/Curve3D.xml index 1d9761407d..7fda8aaa93 100644 --- a/doc/classes/Curve3D.xml +++ b/doc/classes/Curve3D.xml @@ -146,7 +146,7 @@ </argument> <description> Returns a point within the curve at position [code]offset[/code], where [code]offset[/code] is measured as a pixel distance along the curve. - To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to true, or linear if set to false. + To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to [code]true[/code], or linear if set to [code]false[/code]. Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough). </description> </method> diff --git a/doc/classes/Dictionary.xml b/doc/classes/Dictionary.xml index b0a3b1ac75..f47649363e 100644 --- a/doc/classes/Dictionary.xml +++ b/doc/classes/Dictionary.xml @@ -38,7 +38,7 @@ <return type="bool"> </return> <description> - Return true if the dictionary is empty. + Return [code]true[/code] if the dictionary is empty. </description> </method> <method name="erase"> @@ -67,7 +67,7 @@ <argument index="0" name="key" type="Variant"> </argument> <description> - Return true if the dictionary has a given key. + Return [code]true[/code] if the dictionary has a given key. </description> </method> <method name="has_all"> @@ -76,7 +76,7 @@ <argument index="0" name="keys" type="Array"> </argument> <description> - Return true if the dictionary has all of the keys in the given array. + Return [code]true[/code] if the dictionary has all of the keys in the given array. </description> </method> <method name="hash"> diff --git a/doc/classes/DynamicFont.xml b/doc/classes/DynamicFont.xml index 99ba5143e3..5fdc1ebb75 100644 --- a/doc/classes/DynamicFont.xml +++ b/doc/classes/DynamicFont.xml @@ -5,6 +5,12 @@ </brief_description> <description> DynamicFont renders vector font files (such as TTF or OTF) dynamically at runtime instead of using a prerendered texture atlas like [BitmapFont]. This trades the faster loading time of [BitmapFont]s for the ability to change font parameters like size and spacing during runtime. [DynamicFontData] is used for referencing the font file paths. + [codeblock] + var dynamic_font = DynamicFont.new() + dynamic_font.font_data = load("res://BarlowCondensed-Bold.ttf") + dynamic_font.size = 64 + $"Label".set("custom_fonts/font", dynamic_font) + [/codeblock] </description> <tutorials> </tutorials> diff --git a/doc/classes/EditorFileSystem.xml b/doc/classes/EditorFileSystem.xml index f110183081..531af4c4e0 100644 --- a/doc/classes/EditorFileSystem.xml +++ b/doc/classes/EditorFileSystem.xml @@ -45,7 +45,7 @@ <return type="bool"> </return> <description> - Return true of the filesystem is being scanned. + Return [code]true[/code] of the filesystem is being scanned. </description> </method> <method name="scan"> diff --git a/doc/classes/EditorInspectorPlugin.xml b/doc/classes/EditorInspectorPlugin.xml index 49efee49f4..f2dcd2177c 100644 --- a/doc/classes/EditorInspectorPlugin.xml +++ b/doc/classes/EditorInspectorPlugin.xml @@ -1,8 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="EditorInspectorPlugin" inherits="Reference" category="Core" version="3.2"> <brief_description> + Plugin for adding custom property editors on inspector. </brief_description> <description> + This plugins allows adding custom property editors to [EditorInspector]. + Plugins are registered via [method EditorPlugin.add_inspector_plugin]. + When an object is edited, the [method can_handle] function is called and must return true if the object type is supported. + If supported, the function [method parse_begin] will be called, allowing to place custom controls at the beginning of the class. + Subsequently, the [method parse_category] and [method parse_property] are called for every category and property. They offer the ability to add custom controls to the inspector too. + Finally [method parse_end] will be called. + On each of these calls, the "add" functions can be called. </description> <tutorials> </tutorials> @@ -13,6 +21,7 @@ <argument index="0" name="control" type="Control"> </argument> <description> + Add a custom control, not necesarily a property editor. </description> </method> <method name="add_property_editor"> @@ -23,6 +32,7 @@ <argument index="1" name="editor" type="Control"> </argument> <description> + Add a property editor, this must inherit [EditorProperty]. </description> </method> <method name="add_property_editor_for_multiple_properties"> @@ -35,6 +45,7 @@ <argument index="2" name="editor" type="Control"> </argument> <description> + Add am editor that allows modifying multiple properties, this must inherit [EditorProperty]. </description> </method> <method name="can_handle" qualifiers="virtual"> @@ -43,6 +54,7 @@ <argument index="0" name="object" type="Object"> </argument> <description> + Return true if this object can be handled by this plugin. </description> </method> <method name="parse_begin" qualifiers="virtual"> @@ -51,6 +63,7 @@ <argument index="0" name="object" type="Object"> </argument> <description> + Called to allow adding controls at the beginning of the list. </description> </method> <method name="parse_category" qualifiers="virtual"> @@ -61,12 +74,14 @@ <argument index="1" name="category" type="String"> </argument> <description> + Called to allow adding controls at the beginning of the category. </description> </method> <method name="parse_end" qualifiers="virtual"> <return type="void"> </return> <description> + Called to allow adding controls at the end of the list. </description> </method> <method name="parse_property" qualifiers="virtual"> @@ -85,6 +100,7 @@ <argument index="5" name="usage" type="int"> </argument> <description> + Called to allow adding property specific editors to the inspector. Usually these inherit [EditorProperty] </description> </method> </methods> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index 829563c8ac..7981c90f86 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -292,14 +292,14 @@ <argument index="0" name="object" type="Object"> </argument> <description> - Implement this function if your plugin edits a specific type of object (Resource or Node). If you return true, then you will get the functions [method EditorPlugin.edit] and [method EditorPlugin.make_visible] called when the editor requests them. If you have declared the methods [method forward_canvas_gui_input] and [method forward_spatial_gui_input] these will be called too. + Implement this function if your plugin edits a specific type of object (Resource or Node). If you return [code]true[/code], then you will get the functions [method EditorPlugin.edit] and [method EditorPlugin.make_visible] called when the editor requests them. If you have declared the methods [method forward_canvas_gui_input] and [method forward_spatial_gui_input] these will be called too. </description> </method> <method name="has_main_screen" qualifiers="virtual"> <return type="bool"> </return> <description> - Return true if this is a main screen editor plugin (it goes in the workspaces selector together with '2D', '3D', and 'Script'). + Return [code]true[/code] if this is a main screen editor plugin (it goes in the workspaces selector together with '2D', '3D', and 'Script'). </description> </method> <method name="hide_bottom_panel"> diff --git a/doc/classes/EditorProperty.xml b/doc/classes/EditorProperty.xml index 2fd7f18461..735c270279 100644 --- a/doc/classes/EditorProperty.xml +++ b/doc/classes/EditorProperty.xml @@ -1,12 +1,23 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="EditorProperty" inherits="Container" category="Core" version="3.2"> <brief_description> + Custom control to edit properties for adding into the inspector </brief_description> <description> + This control allows property editing for one or multiple properties into [EditorInspector]. It is added via [EditorInspectorPlugin]. </description> <tutorials> </tutorials> <methods> + <method name="add_focusable"> + <return type="void"> + </return> + <argument index="0" name="control" type="Control"> + </argument> + <description> + If any of the controls added can gain keyboard focus, add it here. This ensures that focus will be restored if the inspector is refreshed. + </description> + </method> <method name="emit_changed"> <return type="void"> </return> @@ -19,45 +30,65 @@ <argument index="3" name="changing" type="bool" default="false"> </argument> <description> + If one (or many properties) changed, this must be called. "Field" is used in case your editor can modify fields separately (as an example, Vector3.x). The "changing" argument avoids the editor requesting this property to be refreshed (leave as false if unsure). </description> </method> <method name="get_edited_object"> <return type="Object"> </return> <description> + Get the edited object. </description> </method> <method name="get_edited_property"> <return type="String"> </return> <description> + Get the edited property. If your editor is for a single property (added via [method EditorInspectorPlugin.parse_property]), then this will return it.. </description> </method> <method name="get_tooltip_text" qualifiers="const"> <return type="String"> </return> <description> + Override if you want to allow a custom tooltip over your property. + </description> + </method> + <method name="set_bottom_editor"> + <return type="void"> + </return> + <argument index="0" name="editor" type="Control"> + </argument> + <description> + Add controls with this function if you want them on the bottom (below the label). </description> </method> <method name="update_property" qualifiers="virtual"> <return type="void"> </return> <description> + When this virtual function is called, you must update your editor. </description> </method> </methods> <members> <member name="checkable" type="bool" setter="set_checkable" getter="is_checkable"> + Used by the inspector, set when property is checkable. </member> <member name="checked" type="bool" setter="set_checked" getter="is_checked"> + Used by the inspector, when the property is checked. </member> <member name="draw_red" type="bool" setter="set_draw_red" getter="is_draw_red"> + Used by the inspector, when the property must draw with error color. </member> <member name="keying" type="bool" setter="set_keying" getter="is_keying"> + Used by the inspector, when the property can add keys for animation/ </member> <member name="label" type="String" setter="set_label" getter="get_label"> + Set this property to change the label (if you want to show one) </member> <member name="read_only" type="bool" setter="set_read_only" getter="is_read_only"> + Used by the inspector, when the property is read-only. </member> </members> <signals> @@ -67,6 +98,7 @@ <argument index="1" name="value" type="Array"> </argument> <description> + Emit yourself if you want multiple properties modified at the same time. Do not use if added via [method EditorInspectorPlugin.parse_property] </description> </signal> <signal name="object_id_selected"> @@ -75,6 +107,7 @@ <argument index="1" name="id" type="int"> </argument> <description> + Used by sub-inspectors. Emit if what was selected was an Object ID. </description> </signal> <signal name="property_changed"> @@ -83,6 +116,7 @@ <argument index="1" name="value" type="Nil"> </argument> <description> + Do not emit this manually, use the [method emit_changed] method instead. </description> </signal> <signal name="property_checked"> @@ -91,12 +125,14 @@ <argument index="1" name="bool" type="String"> </argument> <description> + Used internally, when a property was checked. </description> </signal> <signal name="property_keyed"> <argument index="0" name="property" type="String"> </argument> <description> + Emit if you want to add this value as an animation key (check keying being enabled first). </description> </signal> <signal name="property_keyed_with_value"> @@ -105,6 +141,7 @@ <argument index="1" name="value" type="Nil"> </argument> <description> + Emit if you want to key a property with a single value. </description> </signal> <signal name="resource_selected"> @@ -113,6 +150,7 @@ <argument index="1" name="resource" type="Resource"> </argument> <description> + If you want a sub-resource to be edited, emit this signal with the resource. </description> </signal> <signal name="selected"> @@ -121,6 +159,7 @@ <argument index="1" name="focusable_idx" type="int"> </argument> <description> + Internal, used when selected. </description> </signal> </signals> diff --git a/doc/classes/EditorSpatialGizmo.xml b/doc/classes/EditorSpatialGizmo.xml index 58d04e2bbf..da7fee1cf7 100644 --- a/doc/classes/EditorSpatialGizmo.xml +++ b/doc/classes/EditorSpatialGizmo.xml @@ -97,7 +97,7 @@ </argument> <description> Commit a handle being edited (handles must have been previously added by [method add_handles]). - If the cancel parameter is true, an option to restore the edited value to the original is provided. + If the cancel parameter is [code]true[/code], an option to restore the edited value to the original is provided. </description> </method> <method name="get_handle_name" qualifiers="virtual"> diff --git a/doc/classes/EditorSpatialGizmoPlugin.xml b/doc/classes/EditorSpatialGizmoPlugin.xml index 8700c1cff9..40d6376ca3 100644 --- a/doc/classes/EditorSpatialGizmoPlugin.xml +++ b/doc/classes/EditorSpatialGizmoPlugin.xml @@ -25,7 +25,7 @@ <return type="bool"> </return> <description> - Override this method to define whether the gizmo can be hidden or not. Defaults to true. + Override this method to define whether the gizmo can be hidden or not. Defaults to [code]true[/code]. </description> </method> <method name="commit_handle" qualifiers="virtual"> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 17fdc59c6f..5f8dc552d7 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -28,7 +28,7 @@ Global contrast value of the rendered scene (default value is 1). </member> <member name="adjustment_enabled" type="bool" setter="set_adjustment_enable" getter="is_adjustment_enabled"> - Enables the adjustment_* options provided by this resource. If false, adjustments modifications will have no effect on the rendered scene. + Enables the adjustment_* options provided by this resource. If [code]false[/code], adjustments modifications will have no effect on the rendered scene. </member> <member name="adjustment_saturation" type="float" setter="set_adjustment_saturation" getter="get_adjustment_saturation"> Global color saturation value of the rendered scene (default value is 1). diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml index 86504b2c98..145cd243bc 100644 --- a/doc/classes/GraphEdit.xml +++ b/doc/classes/GraphEdit.xml @@ -101,7 +101,7 @@ <argument index="3" name="to_port" type="int"> </argument> <description> - Return true if the 'from_port' slot of 'from' GraphNode is connected to the 'to_port' slot of 'to' GraphNode. + Return [code]true[/code] if the 'from_port' slot of 'from' GraphNode is connected to the 'to_port' slot of 'to' GraphNode. </description> </method> <method name="is_valid_connection_type" qualifiers="const"> diff --git a/doc/classes/GraphNode.xml b/doc/classes/GraphNode.xml index 845fc35a7a..4d6f3180d0 100644 --- a/doc/classes/GraphNode.xml +++ b/doc/classes/GraphNode.xml @@ -135,7 +135,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> - Return true if left (input) slot 'idx' is enabled. False otherwise. + Return [code]true[/code] if left (input) slot 'idx' is enabled, [code]false[/code] otherwise. </description> </method> <method name="is_slot_enabled_right" qualifiers="const"> @@ -144,7 +144,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> - Return true if right (output) slot 'idx' is enabled. False otherwise. + Return [code]true[/code] if right (output) slot 'idx' is enabled, [code]false[/code] otherwise. </description> </method> <method name="set_slot"> diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml index 13e018f88f..8ae0120a34 100644 --- a/doc/classes/HTTPClient.xml +++ b/doc/classes/HTTPClient.xml @@ -295,7 +295,7 @@ HTTP status code [code]303 See Other[/code]. The server is redirecting the user agent to a different resource, as indicated by a URI in the Location header field, which is intended to provide an indirect response to the original request. </constant> <constant name="RESPONSE_NOT_MODIFIED" value="304" enum="ResponseCode"> - HTTP status code [code]304 Not Modified[/code]. A conditional GET or HEAD request has been received and would have resulted in a 200 OK response if it were not for the fact that the condition evaluated to false. + HTTP status code [code]304 Not Modified[/code]. A conditional GET or HEAD request has been received and would have resulted in a 200 OK response if it were not for the fact that the condition evaluated to [code]false[/code]. </constant> <constant name="RESPONSE_USE_PROXY" value="305" enum="ResponseCode"> HTTP status code [code]305 Use Proxy[/code]. Deprecated. Do not use. @@ -346,7 +346,7 @@ HTTP status code [code]411 Length Required[/code]. The server refuses to accept the request without a defined Content-Length header. </constant> <constant name="RESPONSE_PRECONDITION_FAILED" value="412" enum="ResponseCode"> - HTTP status code [code]412 Precondition Failed[/code]. One or more conditions given in the request header fields evaluated to false when tested on the server. + HTTP status code [code]412 Precondition Failed[/code]. One or more conditions given in the request header fields evaluated to [code]false[/code] when tested on the server. </constant> <constant name="RESPONSE_REQUEST_ENTITY_TOO_LARGE" value="413" enum="ResponseCode"> HTTP status code [code]413 Entity Too Large[/code]. The server is refusing to process a request because the request payload is larger than the server is willing or able to process. diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index 2abc3af8c5..641bd64599 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -123,7 +123,7 @@ <argument index="3" name="format" type="int" enum="Image.Format"> </argument> <description> - Creates an empty image of given size and format. See [code]FORMAT_*[/code] constants. If [code]use_mipmaps[/code] is true then generate mipmaps for this image. See the [code]generate_mipmaps[/code] method. + Creates an empty image of given size and format. See [code]FORMAT_*[/code] constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate mipmaps for this image. See the [code]generate_mipmaps[/code] method. </description> </method> <method name="create_from_data"> @@ -140,7 +140,7 @@ <argument index="4" name="data" type="PoolByteArray"> </argument> <description> - Creates a new image of given size and format. See [code]FORMAT_*[/code] constants. Fills the image with the given raw data. If [code]use_mipmaps[/code] is true then generate mipmaps for this image. See the [code]generate_mipmaps[/code] method. + Creates a new image of given size and format. See [code]FORMAT_*[/code] constants. Fills the image with the given raw data. If [code]use_mipmaps[/code] is [code]true[/code] then generate mipmaps for this image. See the [code]generate_mipmaps[/code] method. </description> </method> <method name="crop"> diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index 4aff5dd62b..319f84b8d2 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -203,7 +203,7 @@ <argument index="0" name="action" type="String"> </argument> <description> - Returns [code]true[/code] when the user starts pressing the action event, meaning it's true only on the frame that the user pressed down the button. + Returns [code]true[/code] when the user starts pressing the action event, meaning it's [code]true[/code] only on the frame that the user pressed down the button. This is useful for code that needs to run only once when an action is pressed, instead of every frame while it's pressed. </description> </method> @@ -213,7 +213,7 @@ <argument index="0" name="action" type="String"> </argument> <description> - Returns [code]true[/code] when the user stops pressing the action event, meaning it's true only on the frame that the user released the button. + Returns [code]true[/code] when the user stops pressing the action event, meaning it's [code]true[/code] only on the frame that the user released the button. </description> </method> <method name="is_action_pressed" qualifiers="const"> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 1cfd9e03f7..663eeda77a 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -32,7 +32,7 @@ </argument> <description> Adds an item to the item list with specified text. Specify an icon of null for a list item with no icon. - If selectable is true the list item will be selectable. + If selectable is [code]true[/code] the list item will be selectable. </description> </method> <method name="clear"> diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml index dae549125f..8ea3d8c188 100644 --- a/doc/classes/KinematicBody.xml +++ b/doc/classes/KinematicBody.xml @@ -91,10 +91,10 @@ Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [KinematicBody] or [RigidBody], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes. [code]linear_velocity[/code] is the velocity vector (typically meters per second). Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity. [code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector3(0, 0, 0)[/code], everything is considered a wall. This is useful for topdown games. - If [code]stop_on_slope[/code] is true, body will not slide on slopes if you include gravity in [code]linear_velocity[/code]. + If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes if you include gravity in [code]linear_velocity[/code]. If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops. [code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees. - If [code]infinite_inertia[/code] is true, body will be able to push [RigidBody] nodes, but it won't also detect any collisions with them. When false, it will interact with [RigidBody] nodes like with [StaticBody]. + If [code]infinite_inertia[/code] is [code]true[/code], body will be able to push [RigidBody] nodes, but it won't also detect any collisions with them. If [code]false[/code] it will interact with [RigidBody] nodes like with [StaticBody]. Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a slide collision occurred. To get detailed information about collisions that occurred, use [method get_slide_collision]. </description> </method> diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml index b41b5412d7..05a8129cc5 100644 --- a/doc/classes/KinematicBody2D.xml +++ b/doc/classes/KinematicBody2D.xml @@ -95,10 +95,10 @@ Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [KinematicBody2D] or [RigidBody2D], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes. [code]linear_velocity[/code] is the velocity vector in pixels per second. Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity. [code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector2(0, 0)[/code], everything is considered a wall. This is useful for topdown games. - If [code]stop_on_slope[/code] is true, body will not slide on slopes when you include gravity in [code]linear_velocity[/code] and the body is standing still. + If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes when you include gravity in [code]linear_velocity[/code] and the body is standing still. If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops. [code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees. - If [code]infinite_inertia[/code] is true, body will be able to push [RigidBody2D] nodes, but it won't also detect any collisions with them. When false, it will interact with [RigidBody2D] nodes like with [StaticBody2D]. + If [code]infinite_inertia[/code] is [code]true[/code], body will be able to push [RigidBody2D] nodes, but it won't also detect any collisions with them. If [code]false[/code] it will interact with [RigidBody2D] nodes like with [StaticBody2D]. Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a slide collision occurred. To get detailed information about collisions that occurred, use [method get_slide_collision]. </description> </method> diff --git a/doc/classes/Label.xml b/doc/classes/Label.xml index 955fe6f822..8d52cae186 100644 --- a/doc/classes/Label.xml +++ b/doc/classes/Label.xml @@ -44,7 +44,7 @@ Controls the text's horizontal align. Supports left, center, right, and fill, or justify. Set it to one of the [code]ALIGN_*[/code] constants. </member> <member name="autowrap" type="bool" setter="set_autowrap" getter="has_autowrap"> - If [code]true[/code], wraps the text inside the node's bounding rectangle. If you resize the node, it will change its height automatically to show all the text. Default: false. + If [code]true[/code], wraps the text inside the node's bounding rectangle. If you resize the node, it will change its height automatically to show all the text. Default: [code]false[/code]. </member> <member name="clip_text" type="bool" setter="set_clip_text" getter="is_clipping_text"> If [code]true[/code], the Label only shows the text that fits inside its bounding rectangle. It also lets you scale the node down freely. diff --git a/doc/classes/MeshTexture.xml b/doc/classes/MeshTexture.xml new file mode 100644 index 0000000000..d305cca482 --- /dev/null +++ b/doc/classes/MeshTexture.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="MeshTexture" inherits="Texture" category="Core" version="3.2"> + <brief_description> + Simple texture that uses a mesh to draw itself. + </brief_description> + <description> + Simple texture that uses a mesh to draw itself. It's limited because flags can't be changed and region drawing is not supported. + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="base_texture" type="Texture" setter="set_base_texture" getter="get_base_texture"> + Set the base texture that the Mesh will use to draw. + </member> + <member name="image_size" type="Vector2" setter="set_image_size" getter="get_image_size"> + Set the size of the image, needed for reference. + </member> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> + Set the mesh used to draw. It must be a mesh using 2D vertices. + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/MultiMesh.xml b/doc/classes/MultiMesh.xml index 723ba7ea2b..7148871e8c 100644 --- a/doc/classes/MultiMesh.xml +++ b/doc/classes/MultiMesh.xml @@ -116,6 +116,8 @@ <member name="transform_format" type="int" setter="set_transform_format" getter="get_transform_format" enum="MultiMesh.TransformFormat"> Format of transform used to transform mesh, either 2D or 3D. </member> + <member name="visible_instance_count" type="int" setter="set_visible_instance_count" getter="get_visible_instance_count"> + </member> </members> <constants> <constant name="TRANSFORM_2D" value="0" enum="TransformFormat"> diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml index 14299cdcba..1b97f3267f 100644 --- a/doc/classes/Node2D.xml +++ b/doc/classes/Node2D.xml @@ -63,7 +63,7 @@ <argument index="1" name="scaled" type="bool" default="false"> </argument> <description> - Applies a local translation on the node's X axis based on the [method Node._process]'s [code]delta[/code]. If [code]scaled[/code] is false, normalizes the movement. + Applies a local translation on the node's X axis based on the [method Node._process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/code], normalizes the movement. </description> </method> <method name="move_local_y"> @@ -74,7 +74,7 @@ <argument index="1" name="scaled" type="bool" default="false"> </argument> <description> - Applies a local translation on the node's Y axis based on the [method Node._process]'s [code]delta[/code]. If [code]scaled[/code] is false, normalizes the movement. + Applies a local translation on the node's Y axis based on the [method Node._process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/code], normalizes the movement. </description> </method> <method name="rotate"> diff --git a/doc/classes/NodePath.xml b/doc/classes/NodePath.xml index 4c682f1266..73739ba79a 100644 --- a/doc/classes/NodePath.xml +++ b/doc/classes/NodePath.xml @@ -68,14 +68,14 @@ <return type="bool"> </return> <description> - Return true if the node path is absolute (not relative). + Return [code]true[/code] if the node path is absolute (not relative). </description> </method> <method name="is_empty"> <return type="bool"> </return> <description> - Return true if the node path is empty. + Return [code]true[/code] if the node path is empty. </description> </method> </methods> diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml index 4724cb9270..4fe43814d1 100644 --- a/doc/classes/Object.xml +++ b/doc/classes/Object.xml @@ -344,7 +344,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - If set to true, signal emission is blocked. + If set to [code]true[/code], signal emission is blocked. </description> </method> <method name="set_deferred"> @@ -373,7 +373,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Define whether the object can translate strings (with calls to [method tr]). Default is true. + Define whether the object can translate strings (with calls to [method tr]). Default is [code]true[/code]. </description> </method> <method name="set_meta"> diff --git a/doc/classes/Performance.xml b/doc/classes/Performance.xml index 881e4a9d82..3860511615 100644 --- a/doc/classes/Performance.xml +++ b/doc/classes/Performance.xml @@ -55,58 +55,60 @@ Number of resources currently used. </constant> <constant name="OBJECT_NODE_COUNT" value="10" enum="Monitor"> - Number of nodes currently instanced. This also includes the root node, as well as any nodes not in the scene tree. + Number of nodes currently instanced in the scene tree. This also includes the root node. </constant> - <constant name="RENDER_OBJECTS_IN_FRAME" value="11" enum="Monitor"> + <constant name="OBJECT_ORPHAN_NODE_COUNT" value="11" enum="Monitor"> + </constant> + <constant name="RENDER_OBJECTS_IN_FRAME" value="12" enum="Monitor"> 3D objects drawn per frame. </constant> - <constant name="RENDER_VERTICES_IN_FRAME" value="12" enum="Monitor"> + <constant name="RENDER_VERTICES_IN_FRAME" value="13" enum="Monitor"> Vertices drawn per frame. 3D only. </constant> - <constant name="RENDER_MATERIAL_CHANGES_IN_FRAME" value="13" enum="Monitor"> + <constant name="RENDER_MATERIAL_CHANGES_IN_FRAME" value="14" enum="Monitor"> Material changes per frame. 3D only </constant> - <constant name="RENDER_SHADER_CHANGES_IN_FRAME" value="14" enum="Monitor"> + <constant name="RENDER_SHADER_CHANGES_IN_FRAME" value="15" enum="Monitor"> Shader changes per frame. 3D only. </constant> - <constant name="RENDER_SURFACE_CHANGES_IN_FRAME" value="15" enum="Monitor"> + <constant name="RENDER_SURFACE_CHANGES_IN_FRAME" value="16" enum="Monitor"> Render surface changes per frame. 3D only. </constant> - <constant name="RENDER_DRAW_CALLS_IN_FRAME" value="16" enum="Monitor"> + <constant name="RENDER_DRAW_CALLS_IN_FRAME" value="17" enum="Monitor"> Draw calls per frame. 3D only. </constant> - <constant name="RENDER_VIDEO_MEM_USED" value="17" enum="Monitor"> + <constant name="RENDER_VIDEO_MEM_USED" value="18" enum="Monitor"> Video memory used. Includes both texture and vertex memory. </constant> - <constant name="RENDER_TEXTURE_MEM_USED" value="18" enum="Monitor"> + <constant name="RENDER_TEXTURE_MEM_USED" value="19" enum="Monitor"> Texture memory used. </constant> - <constant name="RENDER_VERTEX_MEM_USED" value="19" enum="Monitor"> + <constant name="RENDER_VERTEX_MEM_USED" value="20" enum="Monitor"> Vertex memory used. </constant> - <constant name="RENDER_USAGE_VIDEO_MEM_TOTAL" value="20" enum="Monitor"> + <constant name="RENDER_USAGE_VIDEO_MEM_TOTAL" value="21" enum="Monitor"> </constant> - <constant name="PHYSICS_2D_ACTIVE_OBJECTS" value="21" enum="Monitor"> + <constant name="PHYSICS_2D_ACTIVE_OBJECTS" value="22" enum="Monitor"> Number of active [RigidBody2D] nodes in the game. </constant> - <constant name="PHYSICS_2D_COLLISION_PAIRS" value="22" enum="Monitor"> + <constant name="PHYSICS_2D_COLLISION_PAIRS" value="23" enum="Monitor"> Number of collision pairs in the 2D physics engine. </constant> - <constant name="PHYSICS_2D_ISLAND_COUNT" value="23" enum="Monitor"> + <constant name="PHYSICS_2D_ISLAND_COUNT" value="24" enum="Monitor"> Number of islands in the 2D physics engine. </constant> - <constant name="PHYSICS_3D_ACTIVE_OBJECTS" value="24" enum="Monitor"> + <constant name="PHYSICS_3D_ACTIVE_OBJECTS" value="25" enum="Monitor"> Number of active [RigidBody] and [VehicleBody] nodes in the game. </constant> - <constant name="PHYSICS_3D_COLLISION_PAIRS" value="25" enum="Monitor"> + <constant name="PHYSICS_3D_COLLISION_PAIRS" value="26" enum="Monitor"> Number of collision pairs in the 3D physics engine. </constant> - <constant name="PHYSICS_3D_ISLAND_COUNT" value="26" enum="Monitor"> + <constant name="PHYSICS_3D_ISLAND_COUNT" value="27" enum="Monitor"> Number of islands in the 3D physics engine. </constant> - <constant name="AUDIO_OUTPUT_LATENCY" value="27" enum="Monitor"> + <constant name="AUDIO_OUTPUT_LATENCY" value="28" enum="Monitor"> </constant> - <constant name="MONITOR_MAX" value="28" enum="Monitor"> + <constant name="MONITOR_MAX" value="29" enum="Monitor"> </constant> </constants> </class> diff --git a/doc/classes/Plane.xml b/doc/classes/Plane.xml index df76b45f9f..a5e5c7022f 100644 --- a/doc/classes/Plane.xml +++ b/doc/classes/Plane.xml @@ -80,7 +80,7 @@ <argument index="1" name="epsilon" type="float" default="0.00001"> </argument> <description> - Returns true if "point" is inside the plane (by a very minimum threshold). + Returns [code]true[/code] if "point" is inside the plane (by a very minimum threshold). </description> </method> <method name="intersect_3"> @@ -122,7 +122,7 @@ <argument index="0" name="point" type="Vector3"> </argument> <description> - Returns true if "point" is located above the plane. + Returns [code]true[/code] if "point" is located above the plane. </description> </method> <method name="normalized"> diff --git a/doc/classes/PoolByteArray.xml b/doc/classes/PoolByteArray.xml index 67419377e8..f46cb243d7 100644 --- a/doc/classes/PoolByteArray.xml +++ b/doc/classes/PoolByteArray.xml @@ -112,6 +112,13 @@ Change the byte at the given index. </description> </method> + <method name="sha256_string"> + <return type="String"> + </return> + <description> + Return SHA256 string of the PoolByteArray. + </description> + </method> <method name="size"> <return type="int"> </return> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index a1558c186b..46a4a70a9b 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -4,7 +4,7 @@ Contains global variables accessible from everywhere. </brief_description> <description> - Contains global variables accessible from everywhere. Use "ProjectSettings.get_setting(variable)", "ProjectSettings.set_setting(variable,value)" or "ProjectSettings.has_setting(variable)" to access them. Variables stored in project.godot are also loaded into ProjectSettings, making this object very useful for reading custom game configuration options. + Contains global variables accessible from everywhere. Use [method get_setting], [method set_setting] or [method has_setting] to access them. Variables stored in [code]project.godot[/code] are also loaded into ProjectSettings, making this object very useful for reading custom game configuration options. </description> <tutorials> </tutorials> @@ -15,7 +15,7 @@ <argument index="0" name="hint" type="Dictionary"> </argument> <description> - Add a custom property info to a property. The dictionary must contain: name:[String](the name of the property) and type:[int](see TYPE_* in [@GlobalScope]), and optionally hint:[int](see PROPERTY_HINT_* in [@GlobalScope]), hint_string:[String]. + Adds a custom property info to a property. The dictionary must contain: name:[String](the property's name) and type:[int](see TYPE_* in [@GlobalScope]), and optionally hint:[int](see PROPERTY_HINT_* in [@GlobalScope]), hint_string:[String]. Example: [codeblock] ProjectSettings.set("category/property_name", 0) @@ -37,7 +37,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Clear the whole configuration (not recommended, may break things). + Clears the whole configuration (not recommended, may break things). </description> </method> <method name="get_order" qualifiers="const"> @@ -46,7 +46,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Return the order of a configuration value (influences when saved to the config file). + Returns the order of a configuration value (influences when saved to the config file). </description> </method> <method name="get_setting" qualifiers="const"> @@ -63,7 +63,7 @@ <argument index="0" name="path" type="String"> </argument> <description> - Convert a localized path (res://) to a full native OS path. + Converts a localized path ([code]res://[/code]) to a full native OS path. </description> </method> <method name="has_setting" qualifiers="const"> @@ -72,7 +72,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Return true if a configuration value is present. + Returns [code]true[/code] if a configuration value is present. </description> </method> <method name="load_resource_pack"> @@ -81,7 +81,7 @@ <argument index="0" name="pack" type="String"> </argument> <description> - Loads the contents of the .pck or .zip file specified by [code]pack[/code] into the resource filesystem (res://). Returns true on success. + Loads the contents of the .pck or .zip file specified by [code]pack[/code] into the resource filesystem ([code]res://[/code]). Returns [code]true[/code] on success. Note: If a file from [code]pack[/code] shares the same path as a file already in the resource filesystem, any attempts to load that file will use the file from [code]pack[/code]. </description> </method> @@ -91,7 +91,7 @@ <argument index="0" name="path" type="String"> </argument> <description> - Convert a path to a localized path (res:// path). + Convert a path to a localized path ([code]res://[/code] path). </description> </method> <method name="property_can_revert"> @@ -100,7 +100,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Returns true if the specified property exists and its initial value differs from the current value. + Returns [code]true[/code] if the specified property exists and its initial value differs from the current value. </description> </method> <method name="property_get_revert"> @@ -109,14 +109,14 @@ <argument index="0" name="name" type="String"> </argument> <description> - Returns the initial value of the specified property. Returns null if the property does not exist. + Returns the specified property's initial value. Returns [code]null[/code] if the property does not exist. </description> </method> <method name="save"> <return type="int" enum="Error"> </return> <description> - Saves the configuration to the project.godot file. + Saves the configuration to the [code]project.godot[/code] file. </description> </method> <method name="save_custom"> @@ -146,7 +146,7 @@ <argument index="1" name="position" type="int"> </argument> <description> - Set the order of a configuration value (influences when saved to the config file). + Sets the order of a configuration value (influences when saved to the config file). </description> </method> <method name="set_setting"> @@ -168,62 +168,64 @@ Background color for the boot splash. </member> <member name="application/boot_splash/fullsize" type="bool" setter="" getter=""> - Scale the boot splash image to the full window length when engine starts (will leave it as default pixel size otherwise). + If [code]true[/code], scale the boot splash image to the full window length when engine starts. If [code]false[/code], the engine will leave it at the default pixel size. </member> <member name="application/boot_splash/image" type="String" setter="" getter=""> - Path to an image used for boot splash. + Path to an image used as the boot splash. </member> <member name="application/config/custom_user_dir_name" type="String" setter="" getter=""> - This user directory is used for storing persistent data ([code]user://[/code] filesystem). By default (no custom name defined), [code]user://[/code] resolves to a project-specific folder in Godot's own configuration folder (see [method OS.get_user_data_dir]). If a custom directory name is defined, this name will be used instead and appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in [method OS.get_user_data_dir]). + This user directory is used for storing persistent data ([code]user://[/code] filesystem). If left empty, [code]user://[/code] resolves to a project-specific folder in Godot's own configuration folder (see [method OS.get_user_data_dir]). If a custom directory name is defined, this name will be used instead and appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in [method OS.get_user_data_dir]). The [member application/config/use_custom_user_dir] setting must be enabled for this to take effect. </member> <member name="application/config/icon" type="String" setter="" getter=""> - Icon used for the project, set when project loads. Exporters will use this icon when possible to. + Icon used for the project, set when project loads. Exporters will also use this icon when possible. </member> <member name="application/config/name" type="String" setter="" getter=""> - Name of the project. It is used from both project manager and by the exporters. Overriding this as name.locale allows setting it in multiple languages. + The project's name. It is used both by the Project Manager and by exporters. The project name can be translated by translating its value in localization files. </member> <member name="application/config/project_settings_override" type="String" setter="" getter=""> Specifies a file to override project settings. For example: [code]user://custom_settings.cfg[/code]. </member> <member name="application/config/use_custom_user_dir" type="bool" setter="" getter=""> - Allow the project to save to its own custom user dir (see [member application/config/custom_user_dir_name]). This setting only works for desktop platforms. A name must be set in the [member application/config/custom_user_dir_name] setting for this to take effect. + If [code]true[/code], the project will save user data to its own user directory (see [member application/config/custom_user_dir_name]). This setting is only effective on desktop platforms. A name must be set in the [member application/config/custom_user_dir_name] setting for this to take effect. If [code]false[/code], the project will save user data to [code](OS user data directory)/Godot/app_userdata/(project name)[/code]. </member> <member name="application/run/disable_stderr" type="bool" setter="" getter=""> - Disable printing to stderr on exported build. + If [code]true[/code], disables printing to standard error in an exported build. </member> <member name="application/run/disable_stdout" type="bool" setter="" getter=""> - Disable printing to stdout on exported build. + If [code]true[/code], disables printing to standard output in an exported build. </member> <member name="application/run/frame_delay_msec" type="int" setter="" getter=""> - Force a delay between frames in the main loop. This may be useful if you plan to disable vsync. + Forces a delay between frames in the main loop (in milliseconds). This may be useful if you plan to disable vertical synchronization. </member> <member name="application/run/low_processor_mode" type="bool" setter="" getter=""> - Turn on low processor mode. This setting only works on desktops. The screen is not redrawn if nothing changes visually. This is meant for writing applications and editors, but is pretty useless (and can hurt performance) on games. + If [code]true[/code], enables low-processor usage mode. This setting only works on desktop platforms. The screen is not redrawn if nothing changes visually. This is meant for writing applications and editors, but is pretty useless (and can hurt performance) in most games. </member> <member name="application/run/low_processor_mode_sleep_usec" type="int" setter="" getter=""> - Amount of sleeping between frames when the low_processor_mode is enabled. This effectively reduces CPU usage when this mode is enabled. + Amount of sleeping between frames when the low-processor usage mode is enabled (in microseconds). Higher values will result in lower CPU usage. </member> <member name="application/run/main_scene" type="String" setter="" getter=""> Path to the main scene file that will be loaded when the project runs. </member> <member name="audio/channel_disable_threshold_db" type="float" setter="" getter=""> - Audio buses will disable automatically when sound goes below a given DB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing. + Audio buses will disable automatically when sound goes below a given dB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing. </member> <member name="audio/channel_disable_time" type="float" setter="" getter=""> - Audio buses will disable automatically when sound goes below a given DB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing. + Audio buses will disable automatically when sound goes below a given dB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing. </member> <member name="audio/default_bus_layout" type="String" setter="" getter=""> </member> <member name="audio/driver" type="String" setter="" getter=""> + Specifies the audio driver to use. This setting is platform-dependent as each platform supports different audio drivers. If left empty, the default audio driver will be used. </member> <member name="audio/enable_audio_input" type="bool" setter="" getter=""> - This option should be enabled if project works with microphone. + If [code]true[/code], microphone input will be allowed. This requires appropriate permissions to be set when exporting to Android or iOS. </member> <member name="audio/mix_rate" type="int" setter="" getter=""> - Mix rate used for audio. In general, it's better to not touch this and leave it to the host operating system. + Mixing rate used for audio. In general, it's better to not touch this and leave it to the host operating system. </member> <member name="audio/output_latency" type="int" setter="" getter=""> + Output latency in milliseconds for audio. Lower values will result in lower audio latency at the cost of increased CPU usage. Low values may result in audible cracking on slower hardware. </member> <member name="audio/video_delay_compensation_ms" type="int" setter="" getter=""> Setting to hardcode audio delay when playing video. Best to leave this untouched unless you know what you are doing. @@ -232,75 +234,105 @@ Default compression level for gzip. Affects compressed scenes and resources. </member> <member name="compression/formats/zlib/compression_level" type="int" setter="" getter=""> - Default compression level for zlib. Affects compressed scenes and resources. + Default compression level for Zlib. Affects compressed scenes and resources. </member> <member name="compression/formats/zstd/compression_level" type="int" setter="" getter=""> - Default compression level for zstd. Affects compressed scenes and resources. + Default compression level for Zstandard. Affects compressed scenes and resources. </member> <member name="compression/formats/zstd/long_distance_matching" type="bool" setter="" getter=""> - Enable long distance matching in zstd. + Enables long-distance matching in Zstandard. </member> <member name="compression/formats/zstd/window_log_size" type="int" setter="" getter=""> </member> <member name="debug/gdscript/completion/autocomplete_setters_and_getters" type="bool" setter="" getter=""> + If [code]true[/code], displays getters and setters in autocompletion results in the script editor. This setting is meant to be used when porting old projects (Godot 2), as using member variables is the preferred style from Godot 3 onwards. </member> <member name="debug/gdscript/warnings/constant_used_as_function" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a constant is used as a function. </member> <member name="debug/gdscript/warnings/deprecated_keyword" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when deprecated keywords such as [code]slave[/code] are used. </member> <member name="debug/gdscript/warnings/enable" type="bool" setter="" getter=""> + If [code]true[/code], enables specific GDScript warnings (see [code]debug/gdscript/warnings/*[/code] settings). If [code]false[/code], disables all GDScript warnings. </member> <member name="debug/gdscript/warnings/function_conflicts_constant" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a function is declared with the same name as a constant. </member> <member name="debug/gdscript/warnings/function_conflicts_variable" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a function is declared with the same name as a variable. This will turn into an error in a future version when first-class functions become supported in GDScript. </member> <member name="debug/gdscript/warnings/function_may_yield" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a function assigned to a variable may yield and return a function state instead of a value. </member> <member name="debug/gdscript/warnings/function_used_as_property" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when using a function as if it was a property. </member> <member name="debug/gdscript/warnings/incompatible_ternary" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a ternary operator may emit values with incompatible types. </member> <member name="debug/gdscript/warnings/integer_division" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when dividing an integer by another integer (the decimal part will be discarded). </member> <member name="debug/gdscript/warnings/narrowing_conversion" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when passing a floating-point value to a function that expects an integer (it will be converted and lose precision). </member> <member name="debug/gdscript/warnings/property_used_as_function" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when using a property as if it was a function. </member> <member name="debug/gdscript/warnings/return_value_discarded" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when calling a function without using its return value (by assigning it to a variable or using it as a function argument). Such return values are sometimes used to denote possible errors using the [Error] type. </member> <member name="debug/gdscript/warnings/shadowed_variable" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when defining a local or subclass member variable that would shadow a variable at an upper level (such as a member variable). </member> <member name="debug/gdscript/warnings/standalone_expression" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when calling an expression that has no effect on the surrounding code, such as writing [code]2 + 2[/code] as a statement. </member> <member name="debug/gdscript/warnings/treat_warnings_as_errors" type="bool" setter="" getter=""> + If [code]true[/code], all warnings will be reported as if they were errors. </member> <member name="debug/gdscript/warnings/unassigned_variable" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when using a variable that wasn't previously assigned. </member> <member name="debug/gdscript/warnings/unassigned_variable_op_assign" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when assigning a variable using an assignment operator like [code]+=[/code] if the variable wasn't previously assigned. </member> <member name="debug/gdscript/warnings/unreachable_code" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when unreachable code is detected (such as after a [code]return[/code] statement that will always be executed). </member> <member name="debug/gdscript/warnings/unsafe_call_argument" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when using an expression whose type may not be compatible with the function parameter expected. </member> <member name="debug/gdscript/warnings/unsafe_cast" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when performing an unsafe cast. </member> <member name="debug/gdscript/warnings/unsafe_method_access" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when calling a method whose presence is not guaranteed at compile-time in the class. </member> <member name="debug/gdscript/warnings/unsafe_property_access" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when accessing a property whose presence is not guaranteed at compile-time in the class. </member> <member name="debug/gdscript/warnings/unused_argument" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a function parameter is unused. </member> <member name="debug/gdscript/warnings/unused_class_variable" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a member variable is unused. </member> <member name="debug/gdscript/warnings/unused_signal" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a signal is unused. </member> <member name="debug/gdscript/warnings/unused_variable" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a local variable is unused. </member> <member name="debug/gdscript/warnings/variable_conflicts_function" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when a variable is declared with the same name as a function. This will turn into an error in a future version when first-class functions become supported in GDScript. </member> <member name="debug/gdscript/warnings/void_assignment" type="bool" setter="" getter=""> + If [code]true[/code], enables warnings when assigning the result of a function that returns [code]void[/code] to a variable. </member> <member name="debug/settings/crash_handler/message" type="String" setter="" getter=""> + Message to be displayed before the backtrace when the engine crashes. </member> <member name="debug/settings/fps/force_fps" type="int" setter="" getter=""> </member> @@ -311,34 +343,34 @@ Maximum amount of functions per frame allowed when profiling. </member> <member name="debug/settings/stdout/print_fps" type="bool" setter="" getter=""> - Print frames per second to stdout. Not very useful in general. + Print frames per second to standard output every second. </member> <member name="debug/settings/stdout/verbose_stdout" type="bool" setter="" getter=""> - Print more information to stdout when running. It shows info such as memory leaks, which scenes and resources are being loaded, etc. + Print more information to standard output when running. It displays information such as memory leaks, which scenes and resources are being loaded, etc. </member> <member name="debug/settings/visual_script/max_call_stack" type="int" setter="" getter=""> Maximum call stack in visual scripting, to avoid infinite recursion. </member> <member name="display/mouse_cursor/custom_image" type="String" setter="" getter=""> - Custom image for the mouse cursor. + Custom image for the mouse cursor (limited to 256x256). </member> <member name="display/mouse_cursor/custom_image_hotspot" type="Vector2" setter="" getter=""> Hotspot for the custom mouse cursor image. </member> <member name="display/mouse_cursor/tooltip_position_offset" type="Vector2" setter="" getter=""> - Position offset for tooltips, relative to the hotspot of the mouse cursor. + Position offset for tooltips, relative to the mouse cursor's hotspot. </member> <member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter=""> - Allow HiDPI display on Windows and OSX. On Desktop Linux, this can't be enabled or disabled. + If [code]true[/code], allows HiDPI display on Windows and macOS. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there. </member> <member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter=""> - Force keep the screen on, so the screensaver does not take over. Works on Desktop and Mobile. + If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms. </member> <member name="display/window/handheld/orientation" type="String" setter="" getter=""> - Default orientation for cell phone or tablet. + Default orientation on mobile devices. </member> <member name="display/window/per_pixel_transparency/allowed" type="bool" setter="" getter=""> - Allow per pixel transparency in a Desktop window. This affects performance if not needed, so leave it off. + If [code]true[/code], allows per-pixel transparency in a desktop window. This affects performance if not needed, so leave it on [code]false[/code] unless you need it. </member> <member name="display/window/per_pixel_transparency/enabled" type="bool" setter="" getter=""> </member> @@ -357,19 +389,19 @@ Set the main window height. On desktop, this is the default window size. Stretch mode settings use this also as a reference when enabled. </member> <member name="display/window/size/resizable" type="bool" setter="" getter=""> - Allow the window to be resizable by default. + Allows the window to be resizable by default. </member> <member name="display/window/size/test_height" type="int" setter="" getter=""> - Test a different height for the window. The main use for this is to test with stretch modes. + If greater than zero, uses a different height for the window when running from the editor. The main use for this is to test with stretch modes. </member> <member name="display/window/size/test_width" type="int" setter="" getter=""> - Test a different width for the window. The main use for this is to test with stretch modes. + If greater than zero, uses a different width for the window when running from the editor. The main use for this is to test with stretch modes. </member> <member name="display/window/size/width" type="int" setter="" getter=""> - Set the main window width. On desktop, this is the default window size. Stretch mode settings use this also as a reference when enabled. + Sets the main window width. On desktop platforms, this is the default window size. Stretch mode settings use this also as a reference when enabled. </member> <member name="display/window/vsync/use_vsync" type="bool" setter="" getter=""> - Use VSync. Don't be stupid, don't turn this off. + If [code]true[/code], enables vertical synchronization. This eliminates tearing that may appear in moving scenes, at the cost of higher input latency and stuttering at lower framerates. If [code]false[/code], vertical synchronization will be disabled, however, many platforms will enforce it regardless (such as mobile platforms and HTML5). </member> <member name="editor/active" type="bool" setter="" getter=""> Internal editor setting, don't touch. @@ -377,22 +409,22 @@ <member name="gui/common/default_scroll_deadzone" type="int" setter="" getter=""> </member> <member name="gui/common/swap_ok_cancel" type="bool" setter="" getter=""> - Enable swap OK and Cancel buttons on dialogs. This is because Windows/MacOS/Desktop Linux may use them in different order, so the GUI swaps them depending on the host OS. Disable this behavior by turning this setting off. + If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and UWP to follow interface conventions. </member> <member name="gui/theme/custom" type="String" setter="" getter=""> Use a custom theme resource, set a path to it here. </member> <member name="gui/theme/custom_font" type="String" setter="" getter=""> - USe a custom default font resource, set a path to it here. + Use a custom default font resource, set a path to it here. </member> <member name="gui/theme/use_hidpi" type="bool" setter="" getter=""> - Make sure the theme used works with hidpi. + If [code]true[/code], makes sure the theme used works with HiDPI. </member> <member name="gui/timers/incremental_search_max_interval_msec" type="int" setter="" getter=""> - Timer setting for incremental search in Tree, IntemList, etc. controls. + Timer setting for incremental search in Tree, IntemList, etc. controls (in milliseconds). </member> <member name="gui/timers/text_edit_idle_detect_sec" type="float" setter="" getter=""> - Timer for detecting idle in the editor. + Timer for detecting idle in the editor (in seconds). </member> <member name="input/ui_accept" type="Dictionary" setter="" getter=""> </member> @@ -421,8 +453,10 @@ <member name="input/ui_up" type="Dictionary" setter="" getter=""> </member> <member name="input_devices/pointing/emulate_mouse_from_touch" type="bool" setter="" getter=""> + If [code]true[/code], sends mouse input events when tapping or swiping on the touchscreen. </member> <member name="input_devices/pointing/emulate_touch_from_mouse" type="bool" setter="" getter=""> + If [code]true[/code], sends touch input events when clicking or dragging the mouse. </member> <member name="layer_names/2d_physics/layer_1" type="String" setter="" getter=""> </member> @@ -585,23 +619,25 @@ <member name="layer_names/3d_render/layer_9" type="String" setter="" getter=""> </member> <member name="locale/fallback" type="String" setter="" getter=""> + The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used. </member> <member name="locale/test" type="String" setter="" getter=""> + If non-empty, this locale will be used when running the project from the editor. </member> <member name="logging/file_logging/enable_file_logging" type="bool" setter="" getter=""> - Log all output to a file. + If [code]true[/code], logs all output to files. </member> <member name="logging/file_logging/log_path" type="String" setter="" getter=""> - Path to logs withint he project. Using an [code]user://[/code] based path is recommended. + Path to logs within the project. Using an [code]user://[/code] path is recommended. </member> <member name="logging/file_logging/max_log_files" type="int" setter="" getter=""> - Amount of log files (used for rotation). + Specifies the maximum amount of log files allowed (used for rotation). </member> <member name="memory/limits/message_queue/max_size_kb" type="int" setter="" getter=""> Godot uses a message queue to defer some function calls. If you run out of space on it (you will see an error), you can increase the size here. </member> <member name="memory/limits/multithreaded_server/rid_pool_prealloc" type="int" setter="" getter=""> - This is used by servers when used in multi threading mode (servers and visual). RIDs are preallocated to avoid stalling the server requesting them on threads. If servers get stalled too often when loading resources in a thread, increase this number. + This is used by servers when used in multi-threading mode (servers and visual). RIDs are preallocated to avoid stalling the server requesting them on threads. If servers get stalled too often when loading resources in a thread, increase this number. </member> <member name="network/limits/debugger_stdout/max_chars_per_second" type="int" setter="" getter=""> Maximum amount of characters allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection. @@ -613,7 +649,7 @@ Maximum amount of messages allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection. </member> <member name="network/limits/packet_peer_stream/max_buffer_po2" type="int" setter="" getter=""> - Default size of packet peer stream for deserializing godot data. Over this size, data is dropped. + Default size of packet peer stream for deserializing Godot data. Over this size, data is dropped. </member> <member name="network/limits/websocket_client/max_in_buffer_kb" type="int" setter="" getter=""> </member> @@ -632,13 +668,13 @@ <member name="network/limits/websocket_server/max_out_packets" type="int" setter="" getter=""> </member> <member name="network/remote_fs/page_read_ahead" type="int" setter="" getter=""> - Amount of read ahead used by remote filesystem. Improves latency. + Amount of read ahead used by remote filesystem. Higher values decrease the effects of latency at the cost of higher bandwidth usage. </member> <member name="network/remote_fs/page_size" type="int" setter="" getter=""> - Page size used by remote filesystem. + Page size used by remote filesystem (in bytes). </member> <member name="node/name_casing" type="int" setter="" getter=""> - When creating nodes names automatically, set the type of casing in this project. This is mostly an editor setting. + When creating node names automatically, set the type of casing in this project. This is mostly an editor setting. </member> <member name="node/name_num_separator" type="int" setter="" getter=""> What to use to separate node name from number. This is mostly an editor setting. @@ -646,20 +682,21 @@ <member name="physics/2d/physics_engine" type="String" setter="" getter=""> </member> <member name="physics/2d/thread_model" type="int" setter="" getter=""> - Set whether physics is run on the main thread or a separate one. Running the server on a thread increases performance, but restricts API Access to only physics process. + Sets whether physics is run on the main thread or a separate one. Running the server on a thread increases performance, but restricts API access to only physics process. </member> <member name="physics/3d/active_soft_world" type="bool" setter="" getter=""> </member> <member name="physics/3d/physics_engine" type="String" setter="" getter=""> + Sets which physics engine to use. </member> <member name="physics/common/physics_fps" type="int" setter="" getter=""> Frames per second used in the physics. Physics always needs a fixed amount of frames per second. </member> <member name="physics/common/physics_jitter_fix" type="float" setter="" getter=""> - Fix to improve physics jitter, specially on monitors where refresh rate is different than physics FPS. + Fix to improve physics jitter, specially on monitors where refresh rate is different than the physics FPS. </member> <member name="rendering/environment/default_clear_color" type="Color" setter="" getter=""> - Default background clear color. Overridable per [Viewport] using its [Environment]. See [member Environment.background_mode] and [member Environment.background_color] in particular. To change this default color programmatically, use [method VisualServer.set_default_clear_color]. + Default background clear color. Overriddable per [Viewport] using its [Environment]. See [member Environment.background_mode] and [member Environment.background_color] in particular. To change this default color programmatically, use [method VisualServer.set_default_clear_color]. </member> <member name="rendering/limits/buffers/blend_shape_max_buffer_size_kb" type="int" setter="" getter=""> Max buffer size for blend shapes. Any blend shape bigger than this will not work. @@ -674,68 +711,70 @@ Max buffer size for drawing immediate objects (ImmediateGeometry nodes). Nodes using more than this size will not work. </member> <member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter=""> - Max amount of elements renderable in a frame. If more than this are visible per frame, they will be dropped. Keep in mind elements refer to mesh surfaces and not mesh themselves. + Max amount of elements renderable in a frame. If more than this are visible per frame, they will be dropped. Keep in mind elements refer to mesh surfaces and not meshes themselves. </member> <member name="rendering/limits/time/time_rollover_secs" type="float" setter="" getter=""> - Shaders have a time variable that constantly increases. At some point it needs to be rolled back to zero to avoid numerical errors on shader animations. This setting specifies when. + Shaders have a time variable that constantly increases. At some point, it needs to be rolled back to zero to avoid precision errors on shader animations. This setting specifies when (in seconds). </member> <member name="rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround" type="bool" setter="" getter=""> - Some Nvidia GPU drivers have a bug, which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to https://github.com/godotengine/godot/issues/9913 for details. - If [code]true[/code], this option enables a "safe" code path for such Nvidia GPUs, at the cost of performance. This option only impacts the GLES2 rendering backend (so the bug stays if you use GLES3), and only desktop platforms. Default value: [code]false[/code]. + Some NVIDIA GPU drivers have a bug which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to [url]https://github.com/godotengine/godot/issues/9913[/url] for details. + If [code]true[/code], this option enables a "safe" code path for such NVIDIA GPUs at the cost of performance. This option only impacts the GLES2 rendering backend (so the bug stays if you use GLES3), and only desktop platforms. </member> <member name="rendering/quality/2d/use_pixel_snap" type="bool" setter="" getter=""> - Force snapping of polygons to pixels in 2D rendering. May help in some pixel art styles. + If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. May help in some pixel art styles. </member> <member name="rendering/quality/depth_prepass/disable_for_vendors" type="String" setter="" getter=""> Disable depth pre-pass for some GPU vendors (usually mobile), as their architecture already does this. </member> <member name="rendering/quality/depth_prepass/enable" type="bool" setter="" getter=""> - Do a previous depth pass before rendering materials. This increases performance in scenes with high overdraw, when complex materials and lighting are used. + If [code]true[/code], performs a previous depth pass before rendering materials. This increases performance in scenes with high overdraw, when complex materials and lighting are used. </member> <member name="rendering/quality/directional_shadow/size" type="int" setter="" getter=""> - Size in pixels of the directional shadow. + The directional shadow's size in pixels. Higher values will result in sharper shadows, at the cost of performance. </member> <member name="rendering/quality/directional_shadow/size.mobile" type="int" setter="" getter=""> </member> <member name="rendering/quality/driver/driver_name" type="String" setter="" getter=""> - Name of the configured video driver ("GLES2" or "GLES3"). - Note that the backend in use can be overridden at runtime via the [code]--video-driver[/code] command line argument, or by the [member rendering/quality/driver/fallback_to_gles2] option if the target system does not support GLES3 and falls back to GLES2. In such cases, this property is not updated, so use [method OS.get_current_video_driver] to query it at runtime. + The video driver to use ("GLES2" or "GLES3"). + Note that the backend in use can be overridden at runtime via the [code]--video-driver[/code] command line argument, or by the [member rendering/quality/driver/fallback_to_gles2] option if the target system does not support GLES3 and falls back to GLES2. In such cases, this property is not updated, so use [method OS.get_current_video_driver] to query it at run-time. </member> <member name="rendering/quality/driver/fallback_to_gles2" type="bool" setter="" getter=""> - Whether to allow falling back to the GLES2 driver if the GLES3 driver is not supported. Default value: [code]false[/code]. - Note that the two video drivers are not drop-in replacements for each other, so a game designed for GLES3 might not work properly when falling back to GLES2. In particular, some features of the GLES3 backend are not available in GLES2. Enabling this setting also means that both ETC and ETC2 VRAM-compressed textures will be exported on Android and iOS, increasing the size of the game data pack. + If [code]true[/code], allows falling back to the GLES2 driver if the GLES3 driver is not supported. + Note that the two video drivers are not drop-in replacements for each other, so a game designed for GLES3 might not work properly when falling back to GLES2. In particular, some features of the GLES3 backend are not available in GLES2. Enabling this setting also means that both ETC and ETC2 VRAM-compressed textures will be exported on Android and iOS, increasing the data pack's size. </member> <member name="rendering/quality/filters/anisotropic_filter_level" type="int" setter="" getter=""> - Maximum Anisotropic filter level used for textures when anisotropy enabled. + Maximum anisotropic filter level used for textures with anisotropy enabled. Higher values will result in sharper textures when viewed from oblique angles, at the cost of performance. Only power-of-two values are valid (2, 4, 8, 16). </member> <member name="rendering/quality/filters/use_nearest_mipmap_filter" type="bool" setter="" getter=""> - Force to use nearest mipmap filtering when using mipmaps. This may increase performance in mobile as less memory bandwidth is used. + If [code]true[/code], uses nearest-neighbor mipmap filtering when using mipmaps (also called "bilinear filtering"), which will result in visible seams appearing between mipmap stages. This may increase performance in mobile as less memory bandwidth is used. If [code]false[/code], linear mipmap filtering (also called "trilinear filtering") is used. </member> <member name="rendering/quality/intended_usage/framebuffer_allocation" type="int" setter="" getter=""> - Strategy used for framebuffer allocation. The simpler it is, the less memory it uses (but the least features it supports). + Strategy used for framebuffer allocation. The simpler it is, the less resources it uses (but the less features it supports). </member> <member name="rendering/quality/intended_usage/framebuffer_allocation.mobile" type="int" setter="" getter=""> </member> <member name="rendering/quality/reflections/high_quality_ggx" type="bool" setter="" getter=""> - For reflection probes and panorama backgrounds (sky), use a high amount of samples to create ggx blurred versions (used for roughness). + If [code]true[/code], uses a high amount of samples to create blurred variants of reflection probes and panorama backgrounds (sky). Those blurred variants are used by rough materials. </member> <member name="rendering/quality/reflections/high_quality_ggx.mobile" type="bool" setter="" getter=""> </member> <member name="rendering/quality/reflections/texture_array_reflections" type="bool" setter="" getter=""> - For reflection probes and panorama backgrounds (sky), use a texture array instead of mipmaps. This reduces jitter noise on reflections, but costs more performance and memory. + If [code]true[/code], uses texture arrays instead of mipmaps for reflection probes and panorama backgrounds (sky). This reduces jitter noise on reflections, but costs more performance and memory. </member> <member name="rendering/quality/reflections/texture_array_reflections.mobile" type="bool" setter="" getter=""> </member> <member name="rendering/quality/shading/force_blinn_over_ggx" type="bool" setter="" getter=""> + If [code]true[/code], uses faster but lower-quality Blinn model to generate blurred reflections instead of the GGX model. </member> <member name="rendering/quality/shading/force_blinn_over_ggx.mobile" type="bool" setter="" getter=""> </member> <member name="rendering/quality/shading/force_lambert_over_burley" type="bool" setter="" getter=""> + If [code]true[/code], uses faster but lower-quality Lambert material lighting model instead of Burley. </member> <member name="rendering/quality/shading/force_lambert_over_burley.mobile" type="bool" setter="" getter=""> </member> <member name="rendering/quality/shading/force_vertex_shading" type="bool" setter="" getter=""> - Force vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can work to optimize on very low end mobile. + If [code]true[/code], forces vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can be used to optimize performance on low-end mobile devices. </member> <member name="rendering/quality/shading/force_vertex_shading.mobile" type="bool" setter="" getter=""> </member> @@ -752,12 +791,12 @@ Subdivision quadrant size for shadow mapping. See shadow mapping documentation. </member> <member name="rendering/quality/shadow_atlas/size" type="int" setter="" getter=""> - Size for shadow atlas (used for point and omni lights). See documentation. + Size for shadow atlas (used for OmniLights and SpotLights). See documentation. </member> <member name="rendering/quality/shadow_atlas/size.mobile" type="int" setter="" getter=""> </member> <member name="rendering/quality/shadows/filter_mode" type="int" setter="" getter=""> - Shadow filter mode. The more complex the filter, the more memory bandwidth required. + Shadow filter mode. Higher-quality settings result in smoother shadows that flicker less when moving. "Disabled" is the fastest option, but also has the lowest quality. "PCF5" is smoother but is also slower. "PCF13" is the smoothest option, but is also the slowest. </member> <member name="rendering/quality/shadows/filter_mode.mobile" type="int" setter="" getter=""> </member> @@ -773,24 +812,25 @@ Weight subsurface scattering samples. Helps to avoid reading samples from unrelated parts of the screen. </member> <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter=""> - Use high quality voxel cone tracing (looks better, but requires a higher end GPU). + Use high-quality voxel cone tracing. This results in better-looking reflections, but is much more expensive on the GPU. </member> <member name="rendering/threads/thread_model" type="int" setter="" getter=""> - Thread model for rendering. Rendering on a thread can vastly improve performance, but syncinc to the main thread can cause a bit more jitter. + Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter. </member> <member name="rendering/vram_compression/import_bptc" type="bool" setter="" getter=""> + If [code]true[/code], the texture importer will import VRAM-compressed textures using the BPTC algorithm. This texture compression algorithm is only supported on desktop platforms, and only when using the GLES3 renderer. </member> <member name="rendering/vram_compression/import_etc" type="bool" setter="" getter=""> - If the project uses this compression (usually low end mobile), texture importer will import these. + If [code]true[/code], the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression algorithm. This algorithm doesn't support alpha channels in textures. </member> <member name="rendering/vram_compression/import_etc2" type="bool" setter="" getter=""> - If the project uses this compression (usually high end mobile), texture importer will import these. + If [code]true[/code], the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm. This texture compression algorithm is only supported when using the GLES3 renderer. </member> <member name="rendering/vram_compression/import_pvrtc" type="bool" setter="" getter=""> - If the project uses this compression (usually iOS), texture importer will import these. + If [code]true[/code], the texture importer will import VRAM-compressed textures using the PowerVR Texture Compression algorithm. This texture compression algorithm is only supported on iOS. </member> <member name="rendering/vram_compression/import_s3tc" type="bool" setter="" getter=""> - If the project uses this compression (usually Desktop and Consoles), texture importer will import these. + If [code]true[/code], the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm. This algorithm is only supported on desktop platforms and consoles. </member> <member name="script" type="Script" setter="" getter=""> </member> diff --git a/doc/classes/ResourceFormatSaver.xml b/doc/classes/ResourceFormatSaver.xml index 79a813bcb5..caa05dce26 100644 --- a/doc/classes/ResourceFormatSaver.xml +++ b/doc/classes/ResourceFormatSaver.xml @@ -25,7 +25,7 @@ <argument index="0" name="resource" type="Resource"> </argument> <description> - Returns true if the given resource object can be saved by this saver. + Returns [code]true[/code] if the given resource object can be saved by this saver. </description> </method> <method name="save" qualifiers="virtual"> diff --git a/doc/classes/ResourcePreloader.xml b/doc/classes/ResourcePreloader.xml index d9e2466182..d6c635b6eb 100644 --- a/doc/classes/ResourcePreloader.xml +++ b/doc/classes/ResourcePreloader.xml @@ -42,7 +42,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Returns true if the preloader contains a resource associated to [code]name[/code]. + Returns [code]true[/code] if the preloader contains a resource associated to [code]name[/code]. </description> </method> <method name="remove_resource"> diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index b9199194cd..0b1f659da3 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -61,7 +61,7 @@ <argument index="1" name="pause_mode_process" type="bool" default="true"> </argument> <description> - Returns a [SceneTreeTimer] which will [signal SceneTreeTimer.timeout] after the given time in seconds elapsed in this SceneTree. If [code]pause_mode_process[/code] is set to false, pausing the SceneTree will also pause the timer. + Returns a [SceneTreeTimer] which will [signal SceneTreeTimer.timeout] after the given time in seconds elapsed in this SceneTree. If [code]pause_mode_process[/code] is set to [code]false[/code], pausing the SceneTree will also pause the timer. Commonly used to create a one-shot delay timer as in the following example: [codeblock] func some_function(): diff --git a/doc/classes/Skeleton.xml b/doc/classes/Skeleton.xml index 4377cf52c3..8fab778a48 100644 --- a/doc/classes/Skeleton.xml +++ b/doc/classes/Skeleton.xml @@ -134,6 +134,12 @@ <description> </description> </method> + <method name="localize_rests"> + <return type="void"> + </return> + <description> + </description> + </method> <method name="physical_bones_add_collision_exception"> <return type="void"> </return> diff --git a/doc/classes/SphereMesh.xml b/doc/classes/SphereMesh.xml index 01f6ee027e..0124d8a4b0 100644 --- a/doc/classes/SphereMesh.xml +++ b/doc/classes/SphereMesh.xml @@ -15,7 +15,7 @@ Full height of the sphere. Defaults to 2.0. </member> <member name="is_hemisphere" type="bool" setter="set_is_hemisphere" getter="get_is_hemisphere"> - Determines whether a full sphere or a hemisphere is created. Attention: To get a regular hemisphere the height and radius of the sphere have to equal. Defaults to false. + Determines whether a full sphere or a hemisphere is created. Attention: To get a regular hemisphere the height and radius of the sphere have to equal. Defaults to [code]false[/code]. </member> <member name="radial_segments" type="int" setter="set_radial_segments" getter="get_radial_segments"> Number of radial segments on the sphere. Defaults to 64. diff --git a/doc/classes/StreamPeerSSL.xml b/doc/classes/StreamPeerSSL.xml index 07a21a0b57..f7fd36ed58 100644 --- a/doc/classes/StreamPeerSSL.xml +++ b/doc/classes/StreamPeerSSL.xml @@ -28,7 +28,7 @@ <argument index="2" name="for_hostname" type="String" default=""""> </argument> <description> - Connect to a peer using an underlying [StreamPeer] "stream", when "validate_certs" is true, [StreamPeerSSL] will validate that the certificate presented by the peer matches the "for_hostname". + Connect to a peer using an underlying [StreamPeer] "stream", when "validate_certs" is [code]true[/code], [StreamPeerSSL] will validate that the certificate presented by the peer matches the "for_hostname". </description> </method> <method name="disconnect_from_stream"> diff --git a/doc/classes/StyleBoxFlat.xml b/doc/classes/StyleBoxFlat.xml index 884b52459b..ffee7366a3 100644 --- a/doc/classes/StyleBoxFlat.xml +++ b/doc/classes/StyleBoxFlat.xml @@ -94,7 +94,7 @@ The background color of the stylebox. </member> <member name="border_blend" type="bool" setter="set_border_blend" getter="get_border_blend"> - When set to true, the border will fade into the background color. + When set to [code]true[/code], the border will fade into the background color. </member> <member name="border_color" type="Color" setter="set_border_color" getter="get_border_color"> Sets the color of the border. diff --git a/doc/classes/TCP_Server.xml b/doc/classes/TCP_Server.xml index 2780e39067..ac9b33bc34 100644 --- a/doc/classes/TCP_Server.xml +++ b/doc/classes/TCP_Server.xml @@ -13,7 +13,7 @@ <return type="bool"> </return> <description> - Return true if a connection is available for taking. + Return [code]true[/code] if a connection is available for taking. </description> </method> <method name="listen"> diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index e1260ba44e..06299d65b6 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -100,7 +100,7 @@ <argument index="1" name="disabled" type="bool"> </argument> <description> - If [code]disabled[/code] is false, hides the tab at index [code]tab_idx[/code]. Note that its title text will remain, unless also removed with [method set_tab_title]. + If [code]disabled[/code] is [code]false[/code], hides the tab at index [code]tab_idx[/code]. Note that its title text will remain, unless also removed with [method set_tab_title]. </description> </method> <method name="set_tab_icon"> diff --git a/doc/classes/Tabs.xml b/doc/classes/Tabs.xml index 6e61f62f43..8c7d657b4a 100644 --- a/doc/classes/Tabs.xml +++ b/doc/classes/Tabs.xml @@ -135,7 +135,7 @@ <argument index="1" name="disabled" type="bool"> </argument> <description> - If [code]disabled[/code] is false, hides the tab at index [code]tab_idx[/code]. Note that its title text will remain, unless also removed with [method set_tab_title]. + If [code]disabled[/code] is [code]false[/code], hides the tab at index [code]tab_idx[/code]. Note that its title text will remain, unless also removed with [method set_tab_title]. </description> </method> <method name="set_tab_icon"> diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index c55d4d6960..fa78fbe305 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -41,6 +41,7 @@ <argument index="0" name="line" type="int"> </argument> <description> + Returns if the given line is foldable, that is, it has indented lines right below it. </description> </method> <method name="clear_colors"> @@ -120,6 +121,7 @@ <return type="void"> </return> <description> + Folds all lines that are possible to be folded (see [method can_fold]). </description> </method> <method name="fold_line"> @@ -128,6 +130,7 @@ <argument index="0" name="line" type="int"> </argument> <description> + Folds the given line, if possible (see [method can_fold]). </description> </method> <method name="get_breakpoints" qualifiers="const"> @@ -165,6 +168,7 @@ <return type="PopupMenu"> </return> <description> + Returns the [PopupMenu] of this [TextEdit]. By default, this menu is displayed when right-clicking on the [TextEdit]. </description> </method> <method name="get_selection_from_column" qualifiers="const"> @@ -231,6 +235,7 @@ <argument index="0" name="line" type="int"> </argument> <description> + Returns if the given line is folded. </description> </method> <method name="is_line_hidden" qualifiers="const"> @@ -245,7 +250,7 @@ <return type="bool"> </return> <description> - Return true if the selection is active. + Return [code]true[/code] if the selection is active. </description> </method> <method name="menu_option"> @@ -346,6 +351,7 @@ <argument index="0" name="line" type="int"> </argument> <description> + Unfolds the given line, if folded. </description> </method> <method name="unhide_all_lines"> @@ -376,6 +382,12 @@ <member name="context_menu_enabled" type="bool" setter="set_context_menu_enabled" getter="is_context_menu_enabled"> If [code]true[/code], a right click displays the context menu. </member> + <member name="draw_tabs" type="bool" setter="set_draw_tabs" getter="is_drawing_tabs"> + If [code]true[/code], the "tab" character will have a visible representation. + </member> + <member name="fold_gutter" type="bool" setter="set_fold_gutter_enabled" getter="is_fold_gutter_enabled"> + If [code]true[/code], the fold gutter is visible. This enables folding groups of indented lines. + </member> <member name="hiding_enabled" type="int" setter="set_hiding_enabled" getter="is_hiding_enabled"> </member> <member name="highlight_all_occurrences" type="bool" setter="set_highlight_all_occurrences" getter="is_highlight_all_occurrences_enabled"> @@ -418,6 +430,14 @@ Emitted when the cursor changes. </description> </signal> + <signal name="info_clicked"> + <argument index="0" name="row" type="int"> + </argument> + <argument index="1" name="info" type="String"> + </argument> + <description> + </description> + </signal> <signal name="request_completion"> <description> </description> diff --git a/doc/classes/Thread.xml b/doc/classes/Thread.xml index d1d19d91d7..ff8221fed3 100644 --- a/doc/classes/Thread.xml +++ b/doc/classes/Thread.xml @@ -20,7 +20,7 @@ <return type="bool"> </return> <description> - Returns true if this [Thread] is currently active. An active [Thread] cannot start work on a new method but can be joined with [method wait_to_finish]. + Returns [code]true[/code] if this [Thread] is currently active. An active [Thread] cannot start work on a new method but can be joined with [method wait_to_finish]. </description> </method> <method name="start"> diff --git a/doc/classes/TranslationServer.xml b/doc/classes/TranslationServer.xml index a3acc2c659..05774635b8 100644 --- a/doc/classes/TranslationServer.xml +++ b/doc/classes/TranslationServer.xml @@ -27,6 +27,12 @@ Clears the server from all translations. </description> </method> + <method name="get_loaded_locales" qualifiers="const"> + <return type="Array"> + </return> + <description> + </description> + </method> <method name="get_locale" qualifiers="const"> <return type="String"> </return> diff --git a/doc/classes/VehicleBody.xml b/doc/classes/VehicleBody.xml index 81d853090c..ab821aafdc 100644 --- a/doc/classes/VehicleBody.xml +++ b/doc/classes/VehicleBody.xml @@ -16,11 +16,11 @@ Slows down the vehicle by applying a braking force. The vehicle is only slowed down if the wheels are in contact with a surface. The force you need to apply to adequately slow down your vehicle depends on the [member RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 30 range for hard braking. </member> <member name="engine_force" type="float" setter="set_engine_force" getter="get_engine_force"> - Accelerates the vehicle by applying an engine force. The vehicle is only speed up if the wheels that have [member VehicleWheel.use_as_traction] set to true and are in contact with a surface. The [member RigidBody.mass] of the vehicle has an effect on the acceleration of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 range for acceleration. Note that the simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears. + Accelerates the vehicle by applying an engine force. The vehicle is only speed up if the wheels that have [member VehicleWheel.use_as_traction] set to [code]true[/code] and are in contact with a surface. The [member RigidBody.mass] of the vehicle has an effect on the acceleration of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 range for acceleration. Note that the simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears. A negative value will result in the vehicle reversing. </member> <member name="steering" type="float" setter="set_steering" getter="get_steering"> - The steering angle for the vehicle. Setting this to a non-zero value will result in the vehicle turning when it's moving. Wheels that have [member VehicleWheel.use_as_steering] set to true will automatically be rotated. + The steering angle for the vehicle. Setting this to a non-zero value will result in the vehicle turning when it's moving. Wheels that have [member VehicleWheel.use_as_steering] set to [code]true[/code] will automatically be rotated. </member> </members> <constants> diff --git a/doc/classes/VehicleWheel.xml b/doc/classes/VehicleWheel.xml index 6a507d630c..f8dac82cb5 100644 --- a/doc/classes/VehicleWheel.xml +++ b/doc/classes/VehicleWheel.xml @@ -20,7 +20,7 @@ <return type="bool"> </return> <description> - Returns true if this wheel is in contact with a surface. + Returns [code]true[/code] if this wheel is in contact with a surface. </description> </method> </methods> @@ -41,10 +41,10 @@ This is the distance the suspension can travel. As Godot measures are in meters keep this setting relatively low. Try a value between 0.1 and 0.3 depending on the type of car . </member> <member name="use_as_steering" type="bool" setter="set_use_as_steering" getter="is_used_as_steering"> - If true this wheel will be turned when the car steers. + If [code]true[/code] this wheel will be turned when the car steers. </member> <member name="use_as_traction" type="bool" setter="set_use_as_traction" getter="is_used_as_traction"> - If true this wheel transfers engine force to the ground to propel the vehicle forward. + If [code]true[/code] this wheel transfers engine force to the ground to propel the vehicle forward. </member> <member name="wheel_friction_slip" type="float" setter="set_friction_slip" getter="get_friction_slip"> This determines how much grip this wheel has. It is combined with the friction setting of the surface the wheel is in contact with. 0.0 means no grip, 1.0 is normal grip. For a drift car setup, try setting the grip of the rear wheels slightly lower than the front wheels, or use a lower value to simulate tire wear. diff --git a/doc/classes/VisualInstance.xml b/doc/classes/VisualInstance.xml index 381679f8bb..59f0a531dd 100644 --- a/doc/classes/VisualInstance.xml +++ b/doc/classes/VisualInstance.xml @@ -14,6 +14,18 @@ Returns the [AABB] (also known as the bounding box) for this VisualInstance. </description> </method> + <method name="get_base" qualifiers="const"> + <return type="RID"> + </return> + <description> + </description> + </method> + <method name="get_instance" qualifiers="const"> + <return type="RID"> + </return> + <description> + </description> + </method> <method name="get_layer_mask_bit" qualifiers="const"> <return type="bool"> </return> diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml index 0030795a6b..87bf0b79b6 100644 --- a/doc/classes/VisualServer.xml +++ b/doc/classes/VisualServer.xml @@ -66,6 +66,22 @@ <description> </description> </method> + <method name="camera_set_frustum"> + <return type="void"> + </return> + <argument index="0" name="camera" type="RID"> + </argument> + <argument index="1" name="size" type="float"> + </argument> + <argument index="2" name="offset" type="Vector2"> + </argument> + <argument index="3" name="z_near" type="float"> + </argument> + <argument index="4" name="z_far" type="float"> + </argument> + <description> + </description> + </method> <method name="camera_set_orthogonal"> <return type="void"> </return> @@ -173,12 +189,15 @@ </argument> <argument index="1" name="mesh" type="RID"> </argument> - <argument index="2" name="texture" type="RID"> + <argument index="2" name="texture" type="Transform2D"> </argument> - <argument index="3" name="normal_map" type="RID"> + <argument index="3" name="normal_map" type="Color"> + </argument> + <argument index="4" name="arg4" type="RID"> + </argument> + <argument index="5" name="arg5" type="RID"> </argument> <description> - Adds a [Mesh] to the [CanvasItem]'s draw commands. Only affects its aabb at the moment. </description> </method> <method name="canvas_item_add_multimesh"> diff --git a/doc/classes/bool.xml b/doc/classes/bool.xml index 15e4146ef4..9ed029a500 100644 --- a/doc/classes/bool.xml +++ b/doc/classes/bool.xml @@ -15,7 +15,7 @@ <argument index="0" name="from" type="int"> </argument> <description> - Cast an [int] value to a boolean value, this method will return true if called with an integer value different to 0 and false in other case. + Cast an [int] value to a boolean value, this method will return [code]true[/code] if called with an integer value different to 0 and [code]false[/code] in other case. </description> </method> <method name="bool"> @@ -24,7 +24,7 @@ <argument index="0" name="from" type="float"> </argument> <description> - Cast a [float] value to a boolean value, this method will return true if called with a floating point value different to 0 and false in other case. + Cast a [float] value to a boolean value, this method will return [code]true[/code] if called with a floating point value different to 0 and [code]false[/code] in other case. </description> </method> <method name="bool"> @@ -33,7 +33,7 @@ <argument index="0" name="from" type="String"> </argument> <description> - Cast a [String] value to a boolean value, this method will return true if called with a non empty string and false in other case. Examples: [code]bool('False')[/code] returns true, [code]bool('')[/code]. returns false + Cast a [String] value to a boolean value, this method will return [code]true[/code] if called with a non empty string and [code]false[/code] in other case. Examples: [code]bool('False')[/code] returns [code]true[/code], [code]bool('')[/code] returns [code]false[/code]. </description> </method> </methods> diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index e790d5b031..9f1425189c 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -480,7 +480,6 @@ RID RasterizerSceneGLES2::reflection_probe_instance_create(RID p_probe) { rpi->current_resolution = 0; rpi->dirty = true; - rpi->last_pass = 0; rpi->index = 0; for (int i = 0; i < 6; i++) { diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index 5d21c679ba..1c35b455c4 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -1545,6 +1545,11 @@ FRAGMENT_SHADER_CODE #ifdef BASE_PASS //none + +#ifdef AMBIENT_LIGHT_DISABLED + ambient_light = vec3(0.0, 0.0, 0.0); +#else + #ifdef USE_RADIANCE_MAP vec3 ref_vec = reflect(-eye_position, N); @@ -1567,6 +1572,7 @@ FRAGMENT_SHADER_CODE #endif +#endif // AMBIENT_LIGHT_DISABLED ambient_light *= ambient_energy; #if defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2) diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 56a6c51460..9aec348291 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1061,12 +1061,11 @@ void RasterizerSceneGLES3::gi_probe_instance_set_light_data(RID p_probe, RID p_b if (p_data.is_valid()) { RasterizerStorageGLES3::GIProbeData *gipd = storage->gi_probe_data_owner.getornull(p_data); ERR_FAIL_COND(!gipd); - if (gipd) { - gipi->tex_cache = gipd->tex_id; - gipi->cell_size_cache.x = 1.0 / gipd->width; - gipi->cell_size_cache.y = 1.0 / gipd->height; - gipi->cell_size_cache.z = 1.0 / gipd->depth; - } + + gipi->tex_cache = gipd->tex_id; + gipi->cell_size_cache.x = 1.0 / gipd->width; + gipi->cell_size_cache.y = 1.0 / gipd->height; + gipi->cell_size_cache.z = 1.0 / gipd->depth; } } void RasterizerSceneGLES3::gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform) { diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index 6e045817bc..a285b3b65f 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -293,8 +293,25 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) { }; } -Error FileAccessUnix::_chmod(const String &p_path, int p_mod) { - int err = chmod(p_path.utf8().get_data(), p_mod); +uint32_t FileAccessUnix::_get_unix_permissions(const String &p_file) { + + String file = fix_path(p_file); + struct stat flags; + int err = stat(file.utf8().get_data(), &flags); + + if (!err) { + return flags.st_mode & 0x7FF; //only permissions + } else { + ERR_EXPLAIN("Failed to get unix permissions for: " + p_file); + ERR_FAIL_V(0); + }; +} + +Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + + String file = fix_path(p_file); + + int err = chmod(file.utf8().get_data(), p_permissions); if (!err) { return OK; } diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 6405589b4d..2a369048a4 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -85,8 +85,8 @@ public: virtual bool file_exists(const String &p_path); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file); - - virtual Error _chmod(const String &p_path, int p_mod); + virtual uint32_t _get_unix_permissions(const String &p_file); + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); FileAccessUnix(); virtual ~FileAccessUnix(); diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 2778590658..25cdc8d8a0 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -119,15 +119,6 @@ int OS_Unix::unix_initialize_audio(int p_audio_driver) { return 0; } -// Very simple signal handler to reap processes where ::execute was called with -// !p_blocking -void handle_sigchld(int sig) { - int saved_errno = errno; - while (waitpid((pid_t)(-1), 0, WNOHANG) > 0) { - } - errno = saved_errno; -} - void OS_Unix::initialize_core() { #ifdef NO_THREADS @@ -155,14 +146,6 @@ void OS_Unix::initialize_core() { #endif _setup_clock(); - - struct sigaction sa; - sa.sa_handler = &handle_sigchld; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; - if (sigaction(SIGCHLD, &sa, 0) == -1) { - perror("ERROR sigaction() failed:"); - } } void OS_Unix::finalize_core() { @@ -293,7 +276,7 @@ uint64_t OS_Unix::get_ticks_usec() const { return longtime; } -Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr) { +Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr, Mutex *p_pipe_mutex) { #ifdef __EMSCRIPTEN__ // Don't compile this code at all to avoid undefined references. @@ -320,11 +303,17 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); char buf[65535]; + while (fgets(buf, 65535, f)) { + if (p_pipe_mutex) { + p_pipe_mutex->lock(); + } (*r_pipe) += buf; + if (p_pipe_mutex) { + p_pipe_mutex->unlock(); + } } - int rv = pclose(f); if (r_exitcode) *r_exitcode = rv; @@ -337,6 +326,13 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo if (pid == 0) { // is child + + if (!p_blocking) { + // For non blocking calls, create a new session-ID so parent won't wait for it. + // This ensures the process won't go zombie at end. + setsid(); + } + Vector<CharString> cs; cs.push_back(p_path.utf8()); for (int i = 0; i < p_arguments.size(); i++) @@ -359,6 +355,7 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo waitpid(pid, &status, 0); if (r_exitcode) *r_exitcode = WEXITSTATUS(status); + } else { if (r_child_id) diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index 09ab4aa1d8..6a05877a8c 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -89,7 +89,7 @@ public: virtual void delay_usec(uint32_t p_usec) const; virtual uint64_t get_ticks_usec() const; - virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false); + virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false, Mutex *p_pipe_mutex = NULL); virtual Error kill(const ProcessID &p_pid); virtual int get_process_id() const; diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index c4c5e0d709..c13300d09f 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -339,6 +339,16 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) { } } +uint32_t FileAccessWindows::_get_unix_permissions(const String &p_file) { + ERR_PRINT("Windows does not support unix permissions"); + return 0; +} + +Error FileAccessWindows::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { + ERR_PRINT("Windows does not support unix permissions"); + return FAILED; +} + FileAccessWindows::FileAccessWindows() : f(NULL), flags(0), diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h index 35b1f0b2d8..2848ed5279 100644 --- a/drivers/windows/file_access_windows.h +++ b/drivers/windows/file_access_windows.h @@ -80,6 +80,8 @@ public: virtual bool file_exists(const String &p_name); ///< return true if a file exists uint64_t _get_modified_time(const String &p_file); + virtual uint32_t _get_unix_permissions(const String &p_file); + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions); FileAccessWindows(); virtual ~FileAccessWindows(); diff --git a/drivers/xaudio2/SCsub b/drivers/xaudio2/SCsub index 3dca95b429..dfc877b6f5 100644 --- a/drivers/xaudio2/SCsub +++ b/drivers/xaudio2/SCsub @@ -3,5 +3,5 @@ Import('env') env.add_source_files(env.drivers_sources, "*.cpp") -env.Append(CXXFLAGS=['-DXAUDIO2_ENABLED']) +env.Append(CPPFLAGS=['-DXAUDIO2_ENABLED']) env.Append(LINKFLAGS=['xaudio2_8.lib']) diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 9f6fa74dd3..def55d6057 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -544,7 +544,7 @@ public: if (use_fps && animation->get_step() > 0) { float max_frame = animation->get_length() / animation->get_step(); - p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",0.01")); + p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1")); } else { p_list->push_back(PropertyInfo(Variant::REAL, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01")); } @@ -1022,8 +1022,14 @@ void AnimationTimelineEdit::update_values() { editing = true; if (use_fps && animation->get_step() > 0) { length->set_value(animation->get_length() / animation->get_step()); + length->set_step(1); + length->set_tooltip(TTR("Animation length (frames)")); + time_icon->set_tooltip(TTR("Animation length (frames)")); } else { length->set_value(animation->get_length()); + length->set_step(0.01); + length->set_tooltip(TTR("Animation length (seconds)")); + time_icon->set_tooltip(TTR("Animation length (seconds)")); } loop->set_pressed(animation->has_loop()); editing = false; @@ -1168,7 +1174,7 @@ AnimationTimelineEdit::AnimationTimelineEdit() { len_hb->add_child(expander); time_icon = memnew(TextureRect); time_icon->set_v_size_flags(SIZE_SHRINK_CENTER); - time_icon->set_tooltip(TTR("Animation Length Time (seconds)")); + time_icon->set_tooltip(TTR("Animation length (seconds)")); len_hb->add_child(time_icon); length = memnew(EditorSpinSlider); length->set_min(0.001); @@ -1177,7 +1183,7 @@ AnimationTimelineEdit::AnimationTimelineEdit() { length->set_allow_greater(true); length->set_custom_minimum_size(Vector2(70 * EDSCALE, 0)); length->set_hide_slider(true); - length->set_tooltip(TTR("Animation Length Time (seconds)")); + length->set_tooltip(TTR("Animation length (seconds)")); length->connect("value_changed", this, "_anim_length_changed"); len_hb->add_child(length); loop = memnew(ToolButton); @@ -3857,7 +3863,7 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { ERR_FAIL_INDEX(p_track, animation->get_track_count()); if (snap->is_pressed() && step->get_value() != 0) { - p_ofs = Math::stepify(p_ofs, step->get_value()); + p_ofs = snap_time(p_ofs); } while (animation->track_find_key(p_track, p_ofs, true) != -1) { //make sure insertion point is valid p_ofs += 0.001; @@ -4116,6 +4122,7 @@ void AnimationTrackEditor::_update_key_edit() { key_edit = memnew(AnimationTrackKeyEdit); key_edit->animation = animation; key_edit->track = selection.front()->key().track; + key_edit->use_fps = timeline->is_using_fps(); float ofs = animation->track_get_key_time(key_edit->track, selection.front()->key().key); key_edit->key_ofs = ofs; @@ -4889,7 +4896,14 @@ void AnimationTrackEditor::_selection_changed() { float AnimationTrackEditor::snap_time(float p_value) { if (snap->is_pressed()) { - p_value = Math::stepify(p_value, step->get_value()); + + double snap_increment; + if (timeline->is_using_fps() && step->get_value() > 0) + snap_increment = 1.0 / step->get_value(); + else + snap_increment = step->get_value(); + + p_value = Math::stepify(p_value, snap_increment); } return p_value; @@ -5021,7 +5035,7 @@ AnimationTrackEditor::AnimationTrackEditor() { bottom_hb->add_child(memnew(VSeparator)); snap = memnew(ToolButton); - snap->set_text(TTR("Snap: ")); + snap->set_text(TTR("Snap:") + " "); bottom_hb->add_child(snap); snap->set_disabled(true); snap->set_toggle_mode(true); diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 134384c167..d655f52f5d 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -768,6 +768,7 @@ void CodeTextEditor::update_editor_settings() { text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding")); text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding")); text_editor->set_wrap_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/word_wrap")); + text_editor->set_draw_info_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_info_gutter")); text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret")); text_editor->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/open_scripts/smooth_scrolling")); text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/open_scripts/v_scroll_speed")); @@ -1176,21 +1177,69 @@ void CodeTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) { text_editor->select(p_line, p_begin, p_line, p_end); } +void CodeTextEditor::set_executing_line(int p_line) { + text_editor->set_executing_line(p_line); +} + +void CodeTextEditor::clear_executing_line() { + text_editor->clear_executing_line(); +} + Variant CodeTextEditor::get_edit_state() { Dictionary state; state["scroll_position"] = text_editor->get_v_scroll(); + state["h_scroll_position"] = text_editor->get_h_scroll(); state["column"] = text_editor->cursor_get_column(); state["row"] = text_editor->cursor_get_line(); + state["selection"] = get_text_edit()->is_selection_active(); + if (get_text_edit()->is_selection_active()) { + state["selection_from_line"] = text_editor->get_selection_from_line(); + state["selection_from_column"] = text_editor->get_selection_from_column(); + state["selection_to_line"] = text_editor->get_selection_to_line(); + state["selection_to_column"] = text_editor->get_selection_to_column(); + } + + state["folded_lines"] = text_editor->get_folded_lines(); + state["breakpoints"] = text_editor->get_breakpoints_array(); + + state["syntax_highlighter"] = TTR("Standard"); + SyntaxHighlighter *syntax_highlighter = text_editor->_get_syntax_highlighting(); + if (syntax_highlighter) { + state["syntax_highlighter"] = syntax_highlighter->get_name(); + } + return state; } void CodeTextEditor::set_edit_state(const Variant &p_state) { Dictionary state = p_state; - text_editor->cursor_set_column(state["column"]); + + /* update the row first as it sets the column to 0 */ text_editor->cursor_set_line(state["row"]); + text_editor->cursor_set_column(state["column"]); text_editor->set_v_scroll(state["scroll_position"]); + text_editor->set_h_scroll(state["h_scroll_position"]); + + if (state.has("selection")) { + text_editor->select(state["selection_from_line"], state["selection_from_column"], state["selection_to_line"], state["selection_to_column"]); + } + + if (state.has("folded_lines")) { + Vector<int> folded_lines = state["folded_lines"]; + for (int i = 0; i < folded_lines.size(); i++) { + text_editor->fold_line(folded_lines[i]); + } + } + + if (state.has("breakpoints")) { + Array breakpoints = state["breakpoints"]; + for (int i = 0; i < breakpoints.size(); i++) { + text_editor->set_line_as_breakpoint(breakpoints[i], true); + } + } + text_editor->grab_focus(); } diff --git a/editor/code_editor.h b/editor/code_editor.h index e3dbfe1ce0..b98af377ce 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -217,6 +217,8 @@ public: void goto_line(int p_line); void goto_line_selection(int p_line, int p_begin, int p_end); + void set_executing_line(int p_line); + void clear_executing_line(); Variant get_edit_state(); void set_edit_state(const Variant &p_state); diff --git a/editor/collada/collada.cpp b/editor/collada/collada.cpp index 94a37a3118..e9040b9d3e 100644 --- a/editor/collada/collada.cpp +++ b/editor/collada/collada.cpp @@ -2256,8 +2256,7 @@ void Collada::_merge_skeletons2(VisualScene *p_vscene) { Node *node = state.scene_map[name]; ERR_CONTINUE(node->type != Node::TYPE_JOINT); - if (node->type != Node::TYPE_JOINT) - continue; + NodeSkeleton *sk = NULL; while (node && !sk) { diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 685c5de76c..a9a96da7b1 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -113,14 +113,14 @@ Signal automatically called by parent dialog. void ConnectDialog::ok_pressed() { if (dst_method->get_text() == "") { - error->set_text(TTR("Method in target Node must be specified!")); + error->set_text(TTR("Method in target node must be specified.")); error->popup_centered_minsize(); return; } Node *target = tree->get_selected(); if (target->get_script().is_null()) { if (!target->has_method(dst_method->get_text())) { - error->set_text(TTR("Target method not found! Specify a valid method or attach a script to target Node.")); + error->set_text(TTR("Target method not found. Specify a valid method or attach a script to the target node.")); error->popup_centered_minsize(); return; } @@ -141,6 +141,9 @@ void ConnectDialog::_tree_node_selected() { Node *current = tree->get_selected(); + if (!current) + return; + dst_path = source->get_path_to(current); get_ok()->set_disabled(false); } @@ -309,6 +312,7 @@ void ConnectDialog::popup_dialog(const String &p_for_signal, bool p_advanced) { advanced->set_pressed(p_advanced); from_signal->set_text(p_for_signal); error_label->add_color_override("font_color", get_color("error_color", "Editor")); + vbc_right->set_visible(p_advanced); if (p_advanced) { @@ -330,7 +334,7 @@ void ConnectDialog::popup_dialog(const String &p_for_signal, bool p_advanced) { } void ConnectDialog::_advanced_pressed() { - vbc_right->set_visible(advanced->is_pressed()); + popup_dialog(from_signal->get_text(), advanced->is_pressed()); } @@ -414,7 +418,7 @@ ConnectDialog::ConnectDialog() { advanced = memnew(CheckBox); dstm_hb->add_child(advanced); - advanced->set_text(TTR("Advanced..")); + advanced->set_text(TTR("Advanced...")); advanced->connect("pressed", this, "_advanced_pressed"); /* @@ -440,8 +444,9 @@ ConnectDialog::ConnectDialog() { cdbinds = memnew(ConnectDialogBinds); - error = memnew(ConfirmationDialog); + error = memnew(AcceptDialog); add_child(error); + error->set_title(TTR("Cannot connect signal")); error->get_ok()->set_text(TTR("Close")); get_ok()->set_text(TTR("Connect")); } diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h index 59fe6dacfe..9b35d84426 100644 --- a/editor/connections_dialog.h +++ b/editor/connections_dialog.h @@ -64,7 +64,7 @@ class ConnectDialog : public ConfirmationDialog { VBoxContainer *vbc_right; SceneTreeEditor *tree; - ConfirmationDialog *error; + AcceptDialog *error; EditorInspector *bind_editor; OptionButton *type_list; CheckButton *deferred; diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 49d40e6d90..2beb0153f4 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -756,7 +756,7 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) { add_child(vb); set_v_size_flags(SIZE_EXPAND_FILL); - set_custom_minimum_size(Size2(100, 0) * EDSCALE); + set_custom_minimum_size(Size2(110, 0) * EDSCALE); track_name = memnew(LineEdit); track_name->connect("text_entered", this, "_name_changed"); @@ -1394,7 +1394,7 @@ void EditorAudioMeterNotches::_notification(int p_what) { } void EditorAudioMeterNotches::_draw_audio_notches() { - Ref<Font> font = get_font("source", "EditorFonts"); + Ref<Font> font = get_font("font", "Label"); float font_height = font->get_height(); for (uint8_t i = 0; i < notches.size(); i++) { diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index e6a6d9e6a6..724b821267 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -233,8 +233,8 @@ void EditorFileDialog::_file_entered(const String &p_file) { void EditorFileDialog::_save_confirm_pressed() { String f = dir_access->get_current_dir().plus_file(file->get_text()); _save_to_recent(); - emit_signal("file_selected", f); hide(); + emit_signal("file_selected", f); } void EditorFileDialog::_post_popup() { @@ -343,8 +343,8 @@ void EditorFileDialog::_action_pressed() { if (files.size()) { _save_to_recent(); - emit_signal("files_selected", files); hide(); + emit_signal("files_selected", files); } return; @@ -354,8 +354,8 @@ void EditorFileDialog::_action_pressed() { if ((mode == MODE_OPEN_ANY || mode == MODE_OPEN_FILE) && dir_access->file_exists(f)) { _save_to_recent(); - emit_signal("file_selected", f); hide(); + emit_signal("file_selected", f); } else if (mode == MODE_OPEN_ANY || mode == MODE_OPEN_DIR) { String path = dir_access->get_current_dir(); @@ -374,8 +374,8 @@ void EditorFileDialog::_action_pressed() { } _save_to_recent(); - emit_signal("dir_selected", path); hide(); + emit_signal("dir_selected", path); } if (mode == MODE_SAVE_FILE) { @@ -441,8 +441,8 @@ void EditorFileDialog::_action_pressed() { } else { _save_to_recent(); - emit_signal("file_selected", f); hide(); + emit_signal("file_selected", f); } } } diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index e0a2bbf477..5917869988 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -97,8 +97,10 @@ void EditorHelp::_class_desc_select(const String &p_select) { emit_signal("go_to_help", "class_name:" + p_select.substr(1, p_select.length())); return; } else if (p_select.begins_with("@")) { - String tag = p_select.substr(1, 8).rstrip(" "); - String link = p_select.substr(9, p_select.length()); + int tag_end = p_select.find(" "); + + String tag = p_select.substr(1, tag_end - 1); + String link = p_select.substr(tag_end + 1, p_select.length()).lstrip(" "); String topic; Map<String, int> *table = NULL; @@ -230,7 +232,7 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview } if (p_overview && p_method.description != "") { - class_desc->push_meta("@method" + p_method.name); + class_desc->push_meta("@method " + p_method.name); } class_desc->push_color(headline_color); @@ -468,7 +470,7 @@ void EditorHelp::_update_doc() { } class_desc->push_cell(); if (describe) { - class_desc->push_meta("@member" + cd.properties[i].name); + class_desc->push_meta("@member " + cd.properties[i].name); } class_desc->push_font(doc_code_font); @@ -1192,10 +1194,13 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { } else if (tag.begins_with("method ") || tag.begins_with("member ") || tag.begins_with("signal ") || tag.begins_with("enum ") || tag.begins_with("constant ")) { - String link_target = tag.substr(tag.find(" ") + 1, tag.length()); - String link_tag = tag.substr(0, tag.find(" ")).rpad(8); + int tag_end = tag.find(" "); + + String link_tag = tag.substr(0, tag_end); + String link_target = tag.substr(tag_end + 1, tag.length()).lstrip(" "); + p_rt->push_color(link_color); - p_rt->push_meta("@" + link_tag + link_target); + p_rt->push_meta("@" + link_tag + " " + link_target); p_rt->add_text(link_target + (tag.begins_with("method ") ? "()" : "")); p_rt->pop(); p_rt->pop(); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index f1f68a14de..ecb9ea5f35 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -211,12 +211,14 @@ void EditorProperty::_notification(int p_what) { } int ofs = 0; + int text_limit = text_size; + if (checkable) { Ref<Texture> checkbox; if (checked) - checkbox = get_icon("checked", "CheckBox"); + checkbox = get_icon("GuiChecked", "EditorIcons"); else - checkbox = get_icon("unchecked", "CheckBox"); + checkbox = get_icon("GuiUnchecked", "EditorIcons"); Color color2(1, 1, 1); if (check_hover) { @@ -228,12 +230,11 @@ void EditorProperty::_notification(int p_what) { draw_texture(checkbox, check_rect.position, color2); ofs += get_constant("hseparator", "Tree"); ofs += checkbox->get_width(); + text_limit -= ofs; } else { check_rect = Rect2(); } - int text_limit = text_size; - if (can_revert) { Ref<Texture> reload_icon = get_icon("ReloadSmall", "EditorIcons"); text_limit -= reload_icon->get_width() + get_constant("hseparator", "Tree") * 2; @@ -433,7 +434,7 @@ bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Varian float a = p_current; float b = p_orig; - return Math::abs(a - b) > CMP_EPSILON; //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error + return !Math::is_equal_approx(a, b); //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error } return bool(Variant::evaluate(Variant::OP_NOT_EQUAL, p_current, p_orig)); @@ -804,6 +805,9 @@ void EditorProperty::_bind_methods() { ClassDB::bind_method(D_METHOD("get_tooltip_text"), &EditorProperty::get_tooltip_text); + ClassDB::bind_method(D_METHOD("add_focusable", "control"), &EditorProperty::add_focusable); + ClassDB::bind_method(D_METHOD("set_bottom_editor", "editor"), &EditorProperty::set_bottom_editor); + ClassDB::bind_method(D_METHOD("emit_changed", "property", "value", "field", "changing"), &EditorProperty::emit_changed, DEFVAL(StringName()), DEFVAL(false)); ADD_PROPERTY(PropertyInfo(Variant::STRING, "label"), "set_label", "get_label"); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index b729de2e2f..df653d6d03 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -47,6 +47,7 @@ #include "core/translation.h" #include "core/version.h" #include "main/input_default.h" +#include "main/main.h" #include "scene/resources/packed_scene.h" #include "servers/physics_2d_server.h" @@ -1936,6 +1937,21 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { open_request(previous_scenes.back()->get()); } break; + case FILE_CLOSE_OTHERS: + case FILE_CLOSE_RIGHT: + case FILE_CLOSE_ALL: { + if (editor_data.get_edited_scene_count() > 1 && (current_option != FILE_CLOSE_RIGHT || editor_data.get_edited_scene() < editor_data.get_edited_scene_count() - 1)) { + int next_tab = editor_data.get_edited_scene() + 1; + next_tab %= editor_data.get_edited_scene_count(); + _scene_tab_closed(next_tab, current_option); + } else { + if (current_option != FILE_CLOSE_ALL) + current_option = -1; + else + _scene_tab_closed(editor_data.get_edited_scene()); + } + + } break; case FILE_CLOSE_ALL_AND_QUIT: case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER: case FILE_CLOSE: { @@ -1973,6 +1989,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { if (scene_idx != -1) _discard_changes(); + save_layout(); break; } @@ -2270,6 +2287,23 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { OS::get_singleton()->shell_open(String("file://") + OS::get_singleton()->get_user_data_dir()); } break; + case FILE_INSTALL_ANDROID_SOURCE: { + + if (p_confirmed) { + export_template_manager->install_android_template(); + } else { + if (DirAccess::exists("res://android/build")) { + remove_android_build_template->popup_centered_minsize(); + } else if (export_template_manager->can_install_android_template()) { + install_android_build_template->popup_centered_minsize(); + } else { + custom_build_manage_templates->popup_centered_minsize(); + } + } + } break; + case FILE_EXPLORE_ANDROID_BUILD_TEMPLATES: { + OS::get_singleton()->shell_open(String("file://") + ProjectSettings::get_singleton()->get_resource_path().plus_file("android")); + } break; case FILE_QUIT: case RUN_PROJECT_MANAGER: { @@ -2417,7 +2451,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case SETTINGS_MANAGE_FEATURE_PROFILES: { - feature_profile_manager->popup_centered_ratio(); + Size2 popup_size = Size2(900, 800) * editor_get_scale(); + Size2 window_size = get_viewport()->get_size(); + + popup_size.x = MIN(window_size.x * 0.8, popup_size.x); + popup_size.y = MIN(window_size.y * 0.8, popup_size.y); + + feature_profile_manager->popup_centered(popup_size); } break; case SETTINGS_TOGGLE_FULLSCREEN: { @@ -2523,6 +2563,7 @@ int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) { void EditorNode::_exit_editor() { exiting = true; resource_preview->stop(); //stop early to avoid crashes + _save_docks(); get_tree()->quit(); } @@ -2533,6 +2574,9 @@ void EditorNode::_discard_changes(const String &p_str) { case FILE_CLOSE_ALL_AND_QUIT: case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER: case FILE_CLOSE: + case FILE_CLOSE_OTHERS: + case FILE_CLOSE_RIGHT: + case FILE_CLOSE_ALL: case SCENE_TAB_CLOSE: { _remove_scene(tab_closing); @@ -2545,6 +2589,15 @@ void EditorNode::_discard_changes(const String &p_str) { } else { _menu_option_confirm(current_option, false); } + } else if (current_option == FILE_CLOSE_OTHERS || current_option == FILE_CLOSE_RIGHT) { + if (editor_data.get_edited_scene_count() == 1 || (current_option == FILE_CLOSE_RIGHT && editor_data.get_edited_scene_count() <= editor_data.get_edited_scene() + 1)) { + current_option = -1; + save_confirmation->hide(); + } else { + _menu_option_confirm(current_option, false); + } + } else if (current_option == FILE_CLOSE_ALL && editor_data.get_edited_scene_count() > 0) { + _menu_option_confirm(current_option, false); } else { current_option = -1; save_confirmation->hide(); @@ -4172,8 +4225,8 @@ void EditorNode::_scene_tab_script_edited(int p_tab) { inspector_dock->edit_resource(script); } -void EditorNode::_scene_tab_closed(int p_tab) { - current_option = SCENE_TAB_CLOSE; +void EditorNode::_scene_tab_closed(int p_tab, int option) { + current_option = option; tab_closing = p_tab; Node *scene = editor_data.get_edited_scene_root(p_tab); if (!scene) { @@ -4246,7 +4299,11 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { scene_tabs_context_menu->add_separator(); scene_tabs_context_menu->add_item(TTR("Show in FileSystem"), FILE_SHOW_IN_FILESYSTEM); scene_tabs_context_menu->add_item(TTR("Play This Scene"), RUN_PLAY_SCENE); + scene_tabs_context_menu->add_separator(); scene_tabs_context_menu->add_item(TTR("Close Tab"), FILE_CLOSE); + scene_tabs_context_menu->add_item(TTR("Close Other Tabs"), FILE_CLOSE_OTHERS); + scene_tabs_context_menu->add_item(TTR("Close Tabs to the Right"), FILE_CLOSE_RIGHT); + scene_tabs_context_menu->add_item(TTR("Close All Tabs"), FILE_CLOSE_ALL); } scene_tabs_context_menu->set_position(mb->get_global_position()); scene_tabs_context_menu->popup(); @@ -4629,19 +4686,53 @@ void EditorNode::remove_tool_menu_item(const String &p_name) { void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) { String to_path = ProjectSettings::get_singleton()->globalize_path(get_filesystem_dock()->get_selected_path()); - DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + _add_dropped_files_recursive(p_files, to_path); + + EditorFileSystem::get_singleton()->scan_changes(); +} + +void EditorNode::_add_dropped_files_recursive(const Vector<String> &p_files, String to_path) { + + DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); Vector<String> just_copy = String("ttf,otf").split(","); + for (int i = 0; i < p_files.size(); i++) { String from = p_files[i]; + String to = to_path.plus_file(from.get_file()); + + if (dir->dir_exists(from)) { + + Vector<String> sub_files; + + DirAccessRef sub_dir = DirAccess::open(from); + sub_dir->list_dir_begin(); + + String next_file = sub_dir->get_next(); + while (next_file != "") { + if (next_file == "." || next_file == "..") { + next_file = sub_dir->get_next(); + continue; + } + + sub_files.push_back(from.plus_file(next_file)); + next_file = sub_dir->get_next(); + } + + if (!sub_files.empty()) { + dir->make_dir(to); + _add_dropped_files_recursive(sub_files, to); + } + + continue; + } + if (!ResourceFormatImporter::get_singleton()->can_be_imported(from) && (just_copy.find(from.get_extension().to_lower()) == -1)) { continue; } - String to = to_path.plus_file(from.get_file()); dir->copy(from, to); } - EditorFileSystem::get_singleton()->scan_changes(); } void EditorNode::_file_access_close_error_notify(const String &p_str) { @@ -5009,6 +5100,68 @@ void EditorNode::_print_handler(void *p_this, const String &p_string, bool p_err en->log->add_message(p_string, p_error ? EditorLog::MSG_TYPE_ERROR : EditorLog::MSG_TYPE_STD); } +static void _execute_thread(void *p_ud) { + + EditorNode::ExecuteThreadArgs *eta = (EditorNode::ExecuteThreadArgs *)p_ud; + Error err = OS::get_singleton()->execute(eta->path, eta->args, true, NULL, &eta->output, &eta->exitcode, true, eta->execute_output_mutex); + print_verbose("Thread exit status: " + itos(eta->exitcode)); + if (err != OK) { + eta->exitcode = err; + } + + eta->done = true; +} + +int EditorNode::execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok, bool p_close_on_errors) { + + execute_output_dialog->set_title(p_title); + execute_output_dialog->get_ok()->set_disabled(true); + execute_outputs->clear(); + execute_outputs->set_scroll_follow(true); + execute_output_dialog->popup_centered_ratio(); + + ExecuteThreadArgs eta; + eta.path = p_path; + eta.args = p_arguments; + eta.execute_output_mutex = Mutex::create(); + eta.exitcode = 255; + eta.done = false; + + int prev_len = 0; + + eta.execute_output_thread = Thread::create(_execute_thread, &eta); + + ERR_FAIL_COND_V(!eta.execute_output_thread, 0); + + while (!eta.done) { + eta.execute_output_mutex->lock(); + if (prev_len != eta.output.length()) { + String to_add = eta.output.substr(prev_len, eta.output.length()); + prev_len = eta.output.length(); + execute_outputs->add_text(to_add); + Main::iteration(); + } + eta.execute_output_mutex->unlock(); + OS::get_singleton()->delay_usec(1000); + } + + Thread::wait_to_finish(eta.execute_output_thread); + memdelete(eta.execute_output_thread); + memdelete(eta.execute_output_mutex); + execute_outputs->add_text("\nExit Code: " + itos(eta.exitcode)); + + if (p_close_on_errors && eta.exitcode != 0) { + execute_output_dialog->hide(); + } + if (p_close_on_ok && eta.exitcode == 0) { + execute_output_dialog->hide(); + } + + execute_output_dialog->get_ok()->set_disabled(false); + + return eta.exitcode; +} + EditorNode::EditorNode() { Input::get_singleton()->set_use_accumulated_input(true); @@ -5407,7 +5560,7 @@ EditorNode::EditorNode() { scene_tabs->set_drag_to_rearrange_enabled(true); scene_tabs->connect("tab_changed", this, "_scene_tab_changed"); scene_tabs->connect("right_button_pressed", this, "_scene_tab_script_edited"); - scene_tabs->connect("tab_close", this, "_scene_tab_closed"); + scene_tabs->connect("tab_close", this, "_scene_tab_closed", varray(SCENE_TAB_CLOSE)); scene_tabs->connect("tab_hover", this, "_scene_tab_hover"); scene_tabs->connect("mouse_exited", this, "_scene_tab_exit"); scene_tabs->connect("gui_input", this, "_scene_tab_input"); @@ -5583,12 +5736,13 @@ EditorNode::EditorNode() { tool_menu = memnew(PopupMenu); tool_menu->set_name("Tools"); tool_menu->connect("index_pressed", this, "_tool_menu_option"); + p->add_separator(); p->add_child(tool_menu); p->add_submenu_item(TTR("Tools"), "Tools"); - tool_menu->add_shortcut(ED_SHORTCUT("editor/orphan_resource_explorer", TTR("Orphan Resource Explorer")), TOOLS_ORPHAN_RESOURCES); + tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES); + tool_menu->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER); p->add_separator(); - - p->add_shortcut(ED_SHORTCUT("editor/open_project_data_folder", TTR("Open Project Data Folder")), RUN_PROJECT_DATA_FOLDER); + p->add_item(TTR("Install Android Build Template"), FILE_INSTALL_ANDROID_SOURCE); p->add_separator(); #ifdef OSX_ENABLED @@ -5935,6 +6089,24 @@ EditorNode::EditorNode() { save_confirmation->connect("confirmed", this, "_menu_confirm_current"); save_confirmation->connect("custom_action", this, "_discard_changes"); + custom_build_manage_templates = memnew(ConfirmationDialog); + custom_build_manage_templates->set_text(TTR("Android build template is missing, please install relevant templates.")); + custom_build_manage_templates->get_ok()->set_text(TTR("Manage Templates")); + custom_build_manage_templates->connect("confirmed", this, "_menu_option", varray(SETTINGS_MANAGE_EXPORT_TEMPLATES)); + gui_base->add_child(custom_build_manage_templates); + + install_android_build_template = memnew(ConfirmationDialog); + install_android_build_template->set_text(TTR("This will install the Android project for custom builds.\nNote that, in order to use it, it needs to be enabled per export preset.")); + install_android_build_template->get_ok()->set_text(TTR("Install")); + install_android_build_template->connect("confirmed", this, "_menu_confirm_current"); + gui_base->add_child(install_android_build_template); + + remove_android_build_template = memnew(ConfirmationDialog); + remove_android_build_template->set_text(TTR("Android build template is already installed and it won't be overwritten.\nRemove the \"build\" directory manually before attempting this operation again.")); + remove_android_build_template->get_ok()->set_text(TTR("Show in File Manager")); + remove_android_build_template->connect("confirmed", this, "_menu_option", varray(FILE_EXPLORE_ANDROID_BUILD_TEMPLATES)); + gui_base->add_child(remove_android_build_template); + file_templates = memnew(EditorFileDialog); file_templates->set_title(TTR("Import Templates From ZIP File")); @@ -6149,6 +6321,12 @@ EditorNode::EditorNode() { load_error_dialog->set_title(TTR("Load Errors")); gui_base->add_child(load_error_dialog); + execute_outputs = memnew(RichTextLabel); + execute_output_dialog = memnew(AcceptDialog); + execute_output_dialog->add_child(execute_outputs); + execute_output_dialog->set_title(TTR("")); + gui_base->add_child(execute_output_dialog); + EditorFileSystem::get_singleton()->connect("sources_changed", this, "_sources_changed"); EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "_fs_changed"); EditorFileSystem::get_singleton()->connect("resources_reimported", this, "_resources_reimported"); diff --git a/editor/editor_node.h b/editor/editor_node.h index 5ed0bd4ac3..0084d421f9 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -112,6 +112,16 @@ public: DOCK_SLOT_MAX }; + struct ExecuteThreadArgs { + String path; + List<String> args; + String output; + Thread *execute_output_thread; + Mutex *execute_output_mutex; + int exitcode; + volatile bool done; + }; + private: enum { HISTORY_SIZE = 64 @@ -130,6 +140,8 @@ private: FILE_IMPORT_SUBSCENE, FILE_EXPORT_PROJECT, FILE_EXPORT_MESH_LIBRARY, + FILE_INSTALL_ANDROID_SOURCE, + FILE_EXPLORE_ANDROID_BUILD_TEMPLATES, FILE_EXPORT_TILESET, FILE_SAVE_OPTIMIZED, FILE_OPEN_RECENT, @@ -138,6 +150,9 @@ private: FILE_QUICK_OPEN_SCRIPT, FILE_OPEN_PREV, FILE_CLOSE, + FILE_CLOSE_OTHERS, + FILE_CLOSE_RIGHT, + FILE_CLOSE_ALL, FILE_CLOSE_ALL_AND_QUIT, FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER, FILE_QUIT, @@ -267,6 +282,9 @@ private: RichTextLabel *load_errors; AcceptDialog *load_error_dialog; + RichTextLabel *execute_outputs; + AcceptDialog *execute_output_dialog; + Ref<Theme> theme; PopupMenu *recent_scenes; @@ -290,6 +308,10 @@ private: PopupMenu *editor_layouts; EditorNameDialog *layout_dialog; + ConfirmationDialog *custom_build_manage_templates; + ConfirmationDialog *install_android_build_template; + ConfirmationDialog *remove_android_build_template; + EditorSettingsDialog *settings_config_dialog; RunSettingsDialog *run_settings_dialog; ProjectSettingsEditor *project_settings; @@ -470,6 +492,7 @@ private: void _update_recent_scenes(); void _open_recent_scene(int p_idx); void _dropped_files(const Vector<String> &p_files, int p_screen); + void _add_dropped_files_recursive(const Vector<String> &p_files, String to_path); String _recent_scene; void _exit_editor(); @@ -543,7 +566,7 @@ private: void _dock_split_dragged(int ofs); void _dock_popup_exit(); void _scene_tab_changed(int p_tab); - void _scene_tab_closed(int p_tab); + void _scene_tab_closed(int p_tab, int option = SCENE_TAB_CLOSE); void _scene_tab_hover(int p_tab); void _scene_tab_exit(); void _scene_tab_input(const Ref<InputEvent> &p_input); @@ -799,6 +822,8 @@ public: void update_keying() const { inspector_dock->update_keying(); }; bool has_scenes_in_session(); + int execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok = true, bool p_close_on_errors = false); + EditorNode(); ~EditorNode(); void get_singleton(const char *arg1, bool arg2); diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp index 7e9d3a889e..12510e27de 100644 --- a/editor/editor_path.cpp +++ b/editor/editor_path.cpp @@ -56,122 +56,67 @@ void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) { Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj); - int index = popup->get_item_count(); - popup->add_icon_item(icon, E->get().name.capitalize(), objects.size()); - popup->set_item_h_offset(index, p_depth * 10 * EDSCALE); + int index = get_popup()->get_item_count(); + get_popup()->add_icon_item(icon, E->get().name.capitalize(), objects.size()); + get_popup()->set_item_h_offset(index, p_depth * 10 * EDSCALE); objects.push_back(obj->get_instance_id()); _add_children_to_popup(obj, p_depth + 1); } } -void EditorPath::_gui_input(const Ref<InputEvent> &p_event) { +void EditorPath::_about_to_show() { - Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { - - Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1)); - if (!obj) - return; - - objects.clear(); - popup->clear(); - _add_children_to_popup(obj); - popup->set_position(get_global_position() + Vector2(0, get_size().height)); - popup->set_size(Size2(get_size().width, 1)); - popup->popup(); - } -} + Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1)); + if (!obj) + return; -void EditorPath::_notification(int p_what) { - - switch (p_what) { - - case NOTIFICATION_MOUSE_ENTER: { - mouse_over = true; - update(); - } break; - case NOTIFICATION_MOUSE_EXIT: { - mouse_over = false; - update(); - } break; - case NOTIFICATION_DRAW: { - - RID ci = get_canvas_item(); - Ref<Font> label_font = get_font("font", "Label"); - Size2i size = get_size(); - Ref<Texture> sn = get_icon("SmallNext", "EditorIcons"); - Ref<StyleBox> sb = get_stylebox("pressed", "Button"); - - int ofs = sb->get_margin(MARGIN_LEFT); - - if (mouse_over) { - draw_style_box(sb, Rect2(Point2(), get_size())); - } - - for (int i = 0; i < history->get_path_size(); i++) { - - Object *obj = ObjectDB::get_instance(history->get_path_object(i)); - if (!obj) - continue; - - String type = obj->get_class(); - - Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj); - - if (icon.is_valid()) { - icon->draw(ci, Point2i(ofs, (size.height - icon->get_height()) / 2)); - ofs += icon->get_width(); - } - - if (i == history->get_path_size() - 1) { - //add name - ofs += 4; - int left = size.width - ofs; - if (left < 0) - continue; - String name; - if (Object::cast_to<Resource>(obj)) { - - Resource *r = Object::cast_to<Resource>(obj); - if (r->get_path().is_resource_file()) - name = r->get_path().get_file(); - else - name = r->get_name(); - - if (name == "") - name = r->get_class(); - } else if (obj->is_class("ScriptEditorDebuggerInspectedObject")) - name = obj->call("get_title"); - else if (Object::cast_to<Node>(obj)) - name = Object::cast_to<Node>(obj)->get_name(); - else if (Object::cast_to<Resource>(obj) && Object::cast_to<Resource>(obj)->get_name() != "") - name = Object::cast_to<Resource>(obj)->get_name(); - else - name = obj->get_class(); - - set_tooltip(obj->get_class()); - - label_font->draw(ci, Point2i(ofs, (size.height - label_font->get_height()) / 2 + label_font->get_ascent()), name, get_color("font_color", "Label"), left); - } else { - //add arrow - - //sn->draw(ci,Point2i(ofs,(size.height-sn->get_height())/2)); - //ofs+=sn->get_width(); - ofs += 5; //just looks better! somehow - } - } - - } break; - } + objects.clear(); + get_popup()->clear(); + get_popup()->set_size(Size2(get_size().width, 1)); + _add_children_to_popup(obj); } void EditorPath::update_path() { - update(); + for (int i = 0; i < history->get_path_size(); i++) { + + Object *obj = ObjectDB::get_instance(history->get_path_object(i)); + if (!obj) + continue; + + Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj); + if (icon.is_valid()) + set_icon(icon); + + if (i == history->get_path_size() - 1) { + String name; + if (Object::cast_to<Resource>(obj)) { + + Resource *r = Object::cast_to<Resource>(obj); + if (r->get_path().is_resource_file()) + name = r->get_path().get_file(); + else + name = r->get_name(); + + if (name == "") + name = r->get_class(); + } else if (obj->is_class("ScriptEditorDebuggerInspectedObject")) + name = obj->call("get_title"); + else if (Object::cast_to<Node>(obj)) + name = Object::cast_to<Node>(obj)->get_name(); + else if (Object::cast_to<Resource>(obj) && Object::cast_to<Resource>(obj)->get_name() != "") + name = Object::cast_to<Resource>(obj)->get_name(); + else + name = obj->get_class(); + + set_text(" " + name); // An extra space so the text is not too close of the icon. + set_tooltip(obj->get_class()); + } + } } -void EditorPath::_popup_select(int p_idx) { +void EditorPath::_id_pressed(int p_idx) { ERR_FAIL_INDEX(p_idx, objects.size()); @@ -184,15 +129,14 @@ void EditorPath::_popup_select(int p_idx) { void EditorPath::_bind_methods() { - ClassDB::bind_method("_gui_input", &EditorPath::_gui_input); - ClassDB::bind_method("_popup_select", &EditorPath::_popup_select); + ClassDB::bind_method("_about_to_show", &EditorPath::_about_to_show); + ClassDB::bind_method("_id_pressed", &EditorPath::_id_pressed); } EditorPath::EditorPath(EditorHistory *p_history) { history = p_history; - mouse_over = false; - popup = memnew(PopupMenu); - popup->connect("id_pressed", this, "_popup_select"); - add_child(popup); + set_text_align(ALIGN_LEFT); + get_popup()->connect("about_to_show", this, "_about_to_show"); + get_popup()->connect("id_pressed", this, "_id_pressed"); } diff --git a/editor/editor_path.h b/editor/editor_path.h index e12ca02534..2dc4d21f9b 100644 --- a/editor/editor_path.h +++ b/editor/editor_path.h @@ -32,27 +32,23 @@ #define EDITOR_PATH_H #include "editor_data.h" -#include "scene/gui/control.h" -#include "scene/gui/popup_menu.h" +#include "scene/gui/menu_button.h" -class EditorPath : public Control { +class EditorPath : public MenuButton { - GDCLASS(EditorPath, Control); + GDCLASS(EditorPath, MenuButton); EditorHistory *history; Vector<ObjectID> objects; - PopupMenu *popup; - bool mouse_over; EditorPath(); - void _popup_select(int p_idx); - void _gui_input(const Ref<InputEvent> &p_event); + void _id_pressed(int p_idx); + void _about_to_show(); void _add_children_to_popup(Object *p_obj, int p_depth = 0); protected: static void _bind_methods(); - void _notification(int p_what); public: void update_path(); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 9d936d9b99..45acd1b6d4 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -786,6 +786,7 @@ EditorPropertyLayers::EditorPropertyLayers() { grid->set_h_size_flags(SIZE_EXPAND_FILL); hb->add_child(grid); button = memnew(Button); + button->set_toggle_mode(true); button->set_text(".."); button->connect("pressed", this, "_button_pressed"); hb->add_child(button); @@ -794,6 +795,7 @@ EditorPropertyLayers::EditorPropertyLayers() { add_child(layers); layers->set_hide_on_checkable_item_selection(false); layers->connect("id_pressed", this, "_menu_pressed"); + layers->connect("popup_hide", button, "set_pressed", varray(false)); } ///////////////////// INT ///////////////////////// @@ -2598,6 +2600,7 @@ void EditorPropertyResource::_resource_selected() { RES res = get_edited_object()->get(get_edited_property()); if (res.is_null()) { + edit->set_pressed(true); _update_menu(); return; } @@ -2818,7 +2821,9 @@ EditorPropertyResource::EditorPropertyResource() { add_child(menu); edit = memnew(Button); edit->set_flat(true); + edit->set_toggle_mode(true); menu->connect("id_pressed", this, "_menu_option"); + menu->connect("popup_hide", edit, "set_pressed", varray(false)); edit->connect("pressed", this, "_update_menu"); hbc->add_child(edit); edit->connect("gui_input", this, "_button_input"); diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp index 06cadca1c0..b73cda6008 100644 --- a/editor/editor_run_native.cpp +++ b/editor/editor_run_native.cpp @@ -56,7 +56,7 @@ void EditorRunNative::_notification(int p_what) { small_icon->create_from_image(im, 0); MenuButton *mb = memnew(MenuButton); mb->get_popup()->connect("id_pressed", this, "_run_native", varray(i)); - //mb->connect("pressed", this, "_run_native", varray(-1, i)); + mb->connect("pressed", this, "_run_native", varray(-1, i)); mb->set_icon(small_icon); add_child(mb); menus[i] = mb; @@ -82,10 +82,14 @@ void EditorRunNative::_notification(int p_what) { } else { mb->get_popup()->clear(); mb->show(); - mb->set_tooltip(TTR("Select device from the list")); - for (int i = 0; i < dc; i++) { - mb->get_popup()->add_icon_item(get_icon("Play", "EditorIcons"), eep->get_device_name(i)); - mb->get_popup()->set_item_tooltip(mb->get_popup()->get_item_count() - 1, eep->get_device_info(i).strip_edges()); + if (dc == 1) { + mb->set_tooltip(eep->get_device_name(0) + "\n\n" + eep->get_device_info(0).strip_edges()); + } else { + mb->set_tooltip("Select device from the list"); + for (int i = 0; i < dc; i++) { + mb->get_popup()->add_icon_item(get_icon("Play", "EditorIcons"), eep->get_device_name(i)); + mb->get_popup()->set_item_tooltip(mb->get_popup()->get_item_count() - 1, eep->get_device_info(i).strip_edges()); + } } } } @@ -99,14 +103,15 @@ void EditorRunNative::_run_native(int p_idx, int p_platform) { Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(p_platform); ERR_FAIL_COND(eep.is_null()); - /*if (p_idx == -1) { + + if (p_idx == -1) { if (eep->get_device_count() == 1) { menus[p_platform]->get_popup()->hide(); p_idx = 0; } else { return; } - }*/ + } Ref<EditorExportPreset> preset; diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index f54c51940f..bf582ca004 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -429,6 +429,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("text_editor/line_numbers/show_line_numbers", true); _initial_set("text_editor/line_numbers/line_numbers_zero_padded", false); _initial_set("text_editor/line_numbers/show_breakpoint_gutter", true); + _initial_set("text_editor/line_numbers/show_info_gutter", true); _initial_set("text_editor/line_numbers/code_folding", true); _initial_set("text_editor/line_numbers/word_wrap", false); _initial_set("text_editor/line_numbers/show_line_length_guideline", false); @@ -644,6 +645,7 @@ void EditorSettings::_load_default_text_editor_theme() { _initial_set("text_editor/highlighting/member_variable_color", Color::html("e64e59")); _initial_set("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4)); _initial_set("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2)); + _initial_set("text_editor/highlighting/executing_line_color", Color(0.2, 0.8, 0.2, 0.4)); _initial_set("text_editor/highlighting/code_folding_color", Color(0.8, 0.8, 0.8, 0.8)); _initial_set("text_editor/highlighting/search_result_color", Color(0.05, 0.25, 0.05, 1)); _initial_set("text_editor/highlighting/search_result_border_color", Color(0.1, 0.45, 0.1, 1)); diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp index e4807a37c6..987033b123 100644 --- a/editor/editor_sub_scene.cpp +++ b/editor/editor_sub_scene.cpp @@ -73,8 +73,8 @@ void EditorSubScene::_notification(int p_what) { if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible_in_tree()) { - } + if (is_visible() && scene == NULL) + _path_browse(); } } @@ -232,7 +232,7 @@ EditorSubScene::EditorSubScene() { hb->add_child(path); path->set_h_size_flags(SIZE_EXPAND_FILL); Button *b = memnew(Button); - b->set_text(" .. "); + b->set_text(TTR("Browse")); hb->add_child(b); b->connect("pressed", this, "_path_browse"); vb->add_margin_child(TTR("Scene Path:"), hb); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 9641e10114..b8dd29cecc 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -831,6 +831,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("read_only", "TextEdit", style_widget_disabled); theme->set_constant("side_margin", "TabContainer", 0); theme->set_icon("tab", "TextEdit", theme->get_icon("GuiTab", "EditorIcons")); + theme->set_icon("folded", "TextEdit", theme->get_icon("GuiTreeArrowRight", "EditorIcons")); + theme->set_icon("fold", "TextEdit", theme->get_icon("GuiTreeArrowDown", "EditorIcons")); theme->set_color("font_color", "TextEdit", font_color); theme->set_color("caret_color", "TextEdit", font_color); theme->set_color("selection_color", "TextEdit", font_color_selection); @@ -1114,6 +1116,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color member_variable_color = main_color.linear_interpolate(mono_color, 0.6); const Color mark_color = Color(error_color.r, error_color.g, error_color.b, 0.3); const Color breakpoint_color = error_color; + const Color executing_line_color = Color(0.2, 0.8, 0.2, 0.4); const Color code_folding_color = alpha3; const Color search_result_color = alpha1; const Color search_result_border_color = alpha3; @@ -1149,6 +1152,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { setting->set_initial_value("text_editor/highlighting/member_variable_color", member_variable_color, true); setting->set_initial_value("text_editor/highlighting/mark_color", mark_color, true); setting->set_initial_value("text_editor/highlighting/breakpoint_color", breakpoint_color, true); + setting->set_initial_value("text_editor/highlighting/executing_line_color", executing_line_color, true); setting->set_initial_value("text_editor/highlighting/code_folding_color", code_folding_color, true); setting->set_initial_value("text_editor/highlighting/search_result_color", search_result_color, true); setting->set_initial_value("text_editor/highlighting/search_result_border_color", search_result_border_color, true); diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 97ccfb0db1..aa2a03510d 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -308,7 +308,8 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_ p->step(TTR("Importing:") + " " + file, fc); } - FileAccess *f = FileAccess::open(template_path.plus_file(file), FileAccess::WRITE); + String to_write = template_path.plus_file(file); + FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE); if (!f) { ret = unzGoToNextFile(pkg); @@ -320,6 +321,10 @@ bool ExportTemplateManager::_install_from_file(const String &p_file, bool p_use_ memdelete(f); +#ifndef WINDOWS_ENABLED + FileAccess::set_unix_permissions(to_write, (info.external_fa >> 16) & 0x01FF); +#endif + ret = unzGoToNextFile(pkg); fc++; } @@ -541,6 +546,112 @@ void ExportTemplateManager::_notification(int p_what) { } } +bool ExportTemplateManager::can_install_android_template() { + + return FileAccess::exists(EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG).plus_file("android_source.zip")); +} + +Error ExportTemplateManager::install_android_template() { + + DirAccessRef da = DirAccess::open("res://"); + ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); + //make android dir (if it does not exist) + + da->make_dir("android"); + { + //add an empty .gdignore file to avoid scan + FileAccessRef f = FileAccess::open("res://android/.gdignore", FileAccess::WRITE); + ERR_FAIL_COND_V(!f, ERR_CANT_CREATE); + f->store_line(""); + f->close(); + } + { + //add version, to ensure building wont work if template and Godot version are mismatch + FileAccessRef f = FileAccess::open("res://android/.build_version", FileAccess::WRITE); + ERR_FAIL_COND_V(!f, ERR_CANT_CREATE); + f->store_line(VERSION_FULL_CONFIG); + f->close(); + } + + Error err = da->make_dir_recursive("android/build"); + ERR_FAIL_COND_V(err != OK, err); + + String source_zip = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG).plus_file("android_source.zip"); + ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN); + + FileAccess *src_f = NULL; + zlib_filefunc_def io = zipio_create_io_from_file(&src_f); + + unzFile pkg = unzOpen2(source_zip.utf8().get_data(), &io); + ERR_EXPLAIN("Android sources not in zip format"); + ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN); + + int ret = unzGoToFirstFile(pkg); + + int total_files = 0; + //count files + while (ret == UNZ_OK) { + total_files++; + ret = unzGoToNextFile(pkg); + } + + ret = unzGoToFirstFile(pkg); + //decompress files + ProgressDialog::get_singleton()->add_task("uncompress", TTR("Uncompressing Android Build Sources"), total_files); + + Set<String> dirs_tested; + + int idx = 0; + while (ret == UNZ_OK) { + + //get filename + unz_file_info info; + char fname[16384]; + ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); + + String name = fname; + + String base_dir = name.get_base_dir(); + + if (!name.ends_with("/")) { + Vector<uint8_t> data; + data.resize(info.uncompressed_size); + + //read + unzOpenCurrentFile(pkg); + unzReadCurrentFile(pkg, data.ptrw(), data.size()); + unzCloseCurrentFile(pkg); + + if (!dirs_tested.has(base_dir)) { + da->make_dir_recursive(String("android/build").plus_file(base_dir)); + dirs_tested.insert(base_dir); + } + + String to_write = String("res://android/build").plus_file(name); + FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE); + if (f) { + f->store_buffer(data.ptr(), data.size()); + memdelete(f); +#ifndef WINDOWS_ENABLED + FileAccess::set_unix_permissions(to_write, (info.external_fa >> 16) & 0x01FF); +#endif + } else { + ERR_PRINTS("Cant uncompress file: " + to_write); + } + } + + ProgressDialog::get_singleton()->task_step("uncompress", name, idx); + + idx++; + ret = unzGoToNextFile(pkg); + } + + ProgressDialog::get_singleton()->end_task("uncompress"); + unzClose(pkg); + + return OK; +} + void ExportTemplateManager::_bind_methods() { ClassDB::bind_method("_download_template", &ExportTemplateManager::_download_template); diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h index 2edd3db6d7..608830c990 100644 --- a/editor/export_template_manager.h +++ b/editor/export_template_manager.h @@ -84,6 +84,9 @@ protected: static void _bind_methods(); public: + bool can_install_android_template(); + Error install_android_template(); + void popup_manager(); ExportTemplateManager(); diff --git a/editor/icons/icon_bucket.svg b/editor/icons/icon_bucket.svg new file mode 100644 index 0000000000..4a5df39e93 --- /dev/null +++ b/editor/icons/icon_bucket.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + version="1.1" + viewBox="0 0 16 16" + id="svg6" + sodipodi:docname="icon_bucket.svg" + inkscape:version="0.92.2 2405546, 2018-03-11"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1876" + inkscape:window-height="1574" + id="namedview8" + showgrid="true" + inkscape:snap-bbox="true" + inkscape:bbox-paths="false" + inkscape:bbox-nodes="false" + inkscape:snap-bbox-edge-midpoints="false" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-nodes="false" + inkscape:snap-others="false" + inkscape:zoom="16" + inkscape:cx="-4.3713942" + inkscape:cy="-1.9091903" + inkscape:window-x="4" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="g4"> + <inkscape:grid + type="xygrid" + id="grid4524" /> + </sodipodi:namedview> + <g + transform="translate(0 -1036.4)" + id="g4"> + <g + id="g4576" + transform="matrix(0.53348552,0.53348552,-0.53348552,0.53348552,561.06065,484.40406)" + style="stroke-width:1.32544696"> + <path + id="path2" + transform="translate(0,1036.4)" + d="M 2,1 C 1.4477645,1.0001 1.0000523,1.4477 1,2 V 3.5 H 3.8847656 A 1.4999877,1.5 0 0 1 5,3 1.4999877,1.5 0 0 1 6.5,4.5 1.4999877,1.5 0 0 1 5,6 1.4999877,1.5 0 0 1 3.8847656,5.5 H 1 V 7 H -0.26953125 -2 c -0.5522769,0 -0.999989,-0.4477 -1,-1 1.1e-5,-0.5523 0.4477231,-1 1,-1 h 3 2.5878906 0.546875 A 1,1 0 0 0 5,5.5 1,1 0 0 0 6,4.5 1,1 0 0 0 5,3.5 1,1 0 0 0 4.1367188,4 H 3.5878906 1 -2 c -1.1045647,0 -1.9999933,0.8954285 -2,2 6.7e-6,1.1045715 0.8954353,2 2,2 h 3 v 6 c 7.35e-5,0.5523 0.4477232,0.9999 1,1 h 8 c 0.552235,-10e-5 0.999947,-0.4477 1,-1 V 1 Z" + style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;stroke-width:1.32544696;color-rendering:auto;image-rendering:auto;shape-rendering:auto" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cczcc" + inkscape:connector-curvature="0" + id="path4526" + d="m 12,1038.4 c 0.707107,3.5356 0.707107,3.5356 1.414213,4.2427 0.707107,0.7071 2.121321,0.7071 2.828428,0 0.707106,-0.7071 0.707106,-2.1213 0,-2.8284 C 15.535534,1039.1071 15.535534,1039.1071 12,1038.4 Z" + style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.32544696px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index 44eaf3d9ef..e152827c63 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -1614,8 +1614,6 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones continue; } - ERR_CONTINUE(xform_idx == -1); - Vector<float> data = at.get_value_at_time(snapshots[i]); ERR_CONTINUE(data.empty()); diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index ab515785da..8f66cce39a 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -1127,7 +1127,7 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15)); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files"), animations_out ? true : false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), animations_out ? true : false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out ? true : false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_linear_error"), 0.05)); diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp index d711c1717d..8a2393ff60 100644 --- a/editor/inspector_dock.cpp +++ b/editor/inspector_dock.cpp @@ -130,8 +130,7 @@ void InspectorDock::_menu_option(int p_option) { ERR_FAIL_INDEX(idx, methods.size()); String name = methods[idx].name; - if (current) - current->call(name); + current->call(name); } } } diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 4a4e7f25b8..1afd7df049 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -481,6 +481,17 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) if (edited_point.valid() && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) { Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); + + //Move the point in a single axis. Should only work when editing a polygon and while holding shift. + if (mode == MODE_EDIT && mm->get_shift()) { + Vector2 old_point = pre_move_edit.get(selected_point.vertex); + if (ABS(cpoint.x - old_point.x) > ABS(cpoint.y - old_point.y)) { + cpoint.y = old_point.y; + } else { + cpoint.x = old_point.x; + } + } + edited_point = PosVertex(edited_point, cpoint); if (!wip_active) { diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index cb3e5a8129..f06b4b2828 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -874,9 +874,9 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() { } to.y = from.y; - float len = MAX(0.0001, playback->get_current_length()); + float len = MAX(0.0001, current_length); - float pos = CLAMP(playback->get_current_play_pos(), 0, len); + float pos = CLAMP(play_pos, 0, len); float c = pos / len; Color fg = get_color("font_color", "Label"); Color bg = fg; @@ -1011,7 +1011,8 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { bool is_playing = false; StringName current_node; StringName blend_from_node; - float play_pos = 0; + play_pos = 0; + current_length = 0; if (playback.is_valid()) { tp = playback->get_travel_path(); @@ -1019,6 +1020,7 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { current_node = playback->get_current_node(); blend_from_node = playback->get_blend_from_node(); play_pos = playback->get_current_play_pos(); + current_length = playback->get_current_length(); } { @@ -1046,6 +1048,27 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { state_machine_play_pos->update(); } + { + if (current_node != StringName() && state_machine->has_node(current_node)) { + + String next = current_node; + Ref<AnimationNodeStateMachine> anodesm = state_machine->get_node(next); + Ref<AnimationNodeStateMachinePlayback> current_node_playback; + + while (anodesm.is_valid()) { + current_node_playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + next + "/playback"); + next += "/" + current_node_playback->get_current_node(); + anodesm = anodesm->get_node(current_node_playback->get_current_node()); + } + + // when current_node is a state machine, use playback of current_node to set play_pos + if (current_node_playback.is_valid()) { + play_pos = current_node_playback->get_current_play_pos(); + current_length = current_node_playback->get_current_length(); + } + } + } + if (last_play_pos != play_pos) { last_play_pos = play_pos; diff --git a/editor/plugins/animation_state_machine_editor.h b/editor/plugins/animation_state_machine_editor.h index 1c4c06090a..8b0a5a0b00 100644 --- a/editor/plugins/animation_state_machine_editor.h +++ b/editor/plugins/animation_state_machine_editor.h @@ -160,6 +160,8 @@ class AnimationNodeStateMachineEditor : public AnimationTreeNodeEditorPlugin { StringName last_current_node; Vector<StringName> last_travel_path; float last_play_pos; + float play_pos; + float current_length; float error_time; String error_text; diff --git a/editor/plugins/animation_tree_player_editor_plugin.cpp b/editor/plugins/animation_tree_player_editor_plugin.cpp index e21ae4834d..f5d21ffb26 100644 --- a/editor/plugins/animation_tree_player_editor_plugin.cpp +++ b/editor/plugins/animation_tree_player_editor_plugin.cpp @@ -840,7 +840,7 @@ void AnimationTreePlayerEditor::_gui_input(Ref<InputEvent> p_event) { click_motion = Point2(mm->get_position().x, mm->get_position().y); update(); } - if ((mm->get_button_mask() & 4 || Input::get_singleton()->is_key_pressed(KEY_SPACE))) { + if (mm->get_button_mask() & 4 || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x); v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 386bc1738e..0dfb53b34a 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -175,7 +175,7 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const Ref<Image> overlay = get_icon("PlayOverlay", "EditorIcons")->get_data(); Ref<Image> thumbnail = p_image->get_data(); thumbnail = thumbnail->duplicate(); - Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width()) / 2, (thumbnail->get_height() - overlay->get_height()) / 2); + Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width() / 2) / 2, (thumbnail->get_height() - overlay->get_height() / 2) / 2); // Overlay and thumbnail need the same format for `blend_rect` to work. thumbnail->convert(Image::FORMAT_RGBA8); @@ -310,15 +310,20 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() { description = memnew(RichTextLabel); description->connect("meta_clicked", this, "_link_click"); + description->set_custom_minimum_size(Size2(440 * EDSCALE, 300 * EDSCALE)); desc_bg->add_child(description); + VBoxContainer *previews_vbox = memnew(VBoxContainer); + hbox->add_child(previews_vbox); + previews_vbox->add_constant_override("separation", 15 * EDSCALE); + preview = memnew(TextureRect); preview->set_custom_minimum_size(Size2(640 * EDSCALE, 345 * EDSCALE)); - hbox->add_child(preview); + previews_vbox->add_child(preview); previews_bg = memnew(PanelContainer); - vbox->add_child(previews_bg); - previews_bg->set_custom_minimum_size(Size2(0, 101 * EDSCALE)); + previews_vbox->add_child(previews_bg); + previews_bg->set_custom_minimum_size(Size2(640 * EDSCALE, 101 * EDSCALE)); previews = memnew(ScrollContainer); previews_bg->add_child(previews); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index b2923a1ff2..ab5ff7dee4 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -84,7 +84,6 @@ public: container = memnew(VBoxContainer); add_child(container); - //set_child_rect(container); child_container = memnew(GridContainer); child_container->set_columns(3); @@ -99,12 +98,14 @@ public: grid_offset_x->set_min(-SPIN_BOX_GRID_RANGE); grid_offset_x->set_max(SPIN_BOX_GRID_RANGE); grid_offset_x->set_suffix("px"); + grid_offset_x->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(grid_offset_x); grid_offset_y = memnew(SpinBox); grid_offset_y->set_min(-SPIN_BOX_GRID_RANGE); grid_offset_y->set_max(SPIN_BOX_GRID_RANGE); grid_offset_y->set_suffix("px"); + grid_offset_y->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(grid_offset_y); label = memnew(Label); @@ -116,12 +117,14 @@ public: grid_step_x->set_min(0.01); grid_step_x->set_max(SPIN_BOX_GRID_RANGE); grid_step_x->set_suffix("px"); + grid_step_x->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(grid_step_x); grid_step_y = memnew(SpinBox); grid_step_y->set_min(0.01); grid_step_y->set_max(SPIN_BOX_GRID_RANGE); grid_step_y->set_suffix("px"); + grid_step_y->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(grid_step_y); container->add_child(memnew(HSeparator)); @@ -139,6 +142,7 @@ public: rotation_offset->set_min(-SPIN_BOX_ROTATION_RANGE); rotation_offset->set_max(SPIN_BOX_ROTATION_RANGE); rotation_offset->set_suffix("deg"); + rotation_offset->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(rotation_offset); label = memnew(Label); @@ -150,6 +154,7 @@ public: rotation_step->set_min(-SPIN_BOX_ROTATION_RANGE); rotation_step->set_max(SPIN_BOX_ROTATION_RANGE); rotation_step->set_suffix("deg"); + rotation_step->set_h_size_flags(SIZE_EXPAND_FILL); child_container->add_child(rotation_step); } @@ -1858,7 +1863,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Confirm the move (only if it was moved) - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT && (drag_type == DRAG_MOVE)) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) { if (transform.affine_inverse().xform(b->get_position()) != drag_from) { _commit_canvas_item_state(drag_selection, TTR("Move CanvasItem"), true); } @@ -3911,6 +3916,8 @@ void CanvasItemEditor::_popup_callback(int p_op) { viewport->update(); } break; case LOCK_SELECTED: { + undo_redo->create_action(TTR("Lock Selected")); + List<Node *> selection = editor_selection->get_selected_node_list(); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get()); @@ -3919,12 +3926,18 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - canvas_item->set_meta("_edit_lock_", true); - emit_signal("item_lock_status_changed"); + undo_redo->add_do_method(canvas_item, "set_meta", "_edit_lock_", true); + undo_redo->add_undo_method(canvas_item, "remove_meta", "_edit_lock_"); + undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed"); } - viewport->update(); + undo_redo->add_do_method(viewport, "update", Variant()); + undo_redo->add_undo_method(viewport, "update", Variant()); + undo_redo->commit_action(); } break; case UNLOCK_SELECTED: { + undo_redo->create_action(TTR("Unlock Selected")); + List<Node *> selection = editor_selection->get_selected_node_list(); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get()); @@ -3933,12 +3946,18 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - canvas_item->set_meta("_edit_lock_", Variant()); - emit_signal("item_lock_status_changed"); + undo_redo->add_do_method(canvas_item, "remove_meta", "_edit_lock_"); + undo_redo->add_undo_method(canvas_item, "set_meta", "_edit_lock_", true); + undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed"); } - viewport->update(); + undo_redo->add_do_method(viewport, "update", Variant()); + undo_redo->add_undo_method(viewport, "update", Variant()); + undo_redo->commit_action(); } break; case GROUP_SELECTED: { + undo_redo->create_action(TTR("Group Selected")); + List<Node *> selection = editor_selection->get_selected_node_list(); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get()); @@ -3947,12 +3966,18 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - canvas_item->set_meta("_edit_group_", true); - emit_signal("item_group_status_changed"); + undo_redo->add_do_method(canvas_item, "set_meta", "_edit_group_", true); + undo_redo->add_undo_method(canvas_item, "remove_meta", "_edit_group_"); + undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed"); } - viewport->update(); + undo_redo->add_do_method(viewport, "update", Variant()); + undo_redo->add_undo_method(viewport, "update", Variant()); + undo_redo->commit_action(); } break; case UNGROUP_SELECTED: { + undo_redo->create_action(TTR("Ungroup Selected")); + List<Node *> selection = editor_selection->get_selected_node_list(); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get()); @@ -3961,10 +3986,14 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (canvas_item->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - canvas_item->set_meta("_edit_group_", Variant()); - emit_signal("item_group_status_changed"); + undo_redo->add_do_method(canvas_item, "remove_meta", "_edit_group_"); + undo_redo->add_undo_method(canvas_item, "set_meta", "_edit_group_", true); + undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed"); } - viewport->update(); + undo_redo->add_do_method(viewport, "update", Variant()); + undo_redo->add_undo_method(viewport, "update", Variant()); + undo_redo->commit_action(); } break; case ANCHORS_AND_MARGINS_PRESET_TOP_LEFT: { _set_anchors_and_margins_preset(PRESET_TOP_LEFT); @@ -4777,6 +4806,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(snap_config_menu); snap_config_menu->set_h_size_flags(SIZE_SHRINK_END); snap_config_menu->set_tooltip(TTR("Snapping Options")); + snap_config_menu->set_switch_on_hover(true); PopupMenu *p = snap_config_menu->get_popup(); p->connect("id_pressed", this, "_popup_callback"); @@ -4828,6 +4858,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { skeleton_menu = memnew(MenuButton); hb->add_child(skeleton_menu); skeleton_menu->set_tooltip(TTR("Skeleton Options")); + skeleton_menu->set_switch_on_hover(true); p = skeleton_menu->get_popup(); p->set_hide_on_checkable_item_selection(false); @@ -4846,8 +4877,10 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { view_menu->set_text(TTR("View")); hb->add_child(view_menu); view_menu->get_popup()->connect("id_pressed", this, "_popup_callback"); + view_menu->set_switch_on_hover(true); p = view_menu->get_popup(); + p->set_hide_on_checkable_item_selection(false); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Show Grid"), KEY_G), SHOW_GRID); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_helpers", TTR("Show Helpers"), KEY_H), SHOW_HELPERS); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_rulers", TTR("Show Rulers"), KEY_R), SHOW_RULERS); @@ -4866,6 +4899,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { presets_menu->set_text(TTR("Layout")); hb->add_child(presets_menu); presets_menu->hide(); + presets_menu->set_switch_on_hover(true); p = presets_menu->get_popup(); p->connect("id_pressed", this, "_popup_callback"); @@ -4923,6 +4957,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { animation_menu->set_text(TTR("Animation")); animation_hb->add_child(animation_menu); animation_menu->get_popup()->connect("id_pressed", this, "_popup_callback"); + animation_menu->set_switch_on_hover(true); p = animation_menu->get_popup(); diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp index 559558cdb8..1622ce17b2 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp @@ -267,6 +267,7 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) { menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK); // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK); menu->set_text(TTR("Particles")); + menu->set_switch_on_hover(true); toolbar->add_child(menu); file = memnew(EditorFileDialog); diff --git a/editor/plugins/cpu_particles_editor_plugin.cpp b/editor/plugins/cpu_particles_editor_plugin.cpp index 7222525dd7..70be9b95bb 100644 --- a/editor/plugins/cpu_particles_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_editor_plugin.cpp @@ -101,6 +101,7 @@ CPUParticlesEditor::CPUParticlesEditor() { particles_editor_hb = memnew(HBoxContainer); SpatialEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb); options = memnew(MenuButton); + options->set_switch_on_hover(true); particles_editor_hb->add_child(options); particles_editor_hb->hide(); diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index 3d76b5da21..2c0dd5f1db 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -194,7 +194,7 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) { Vector2 dir = (control_pos - point_pos).normalized(); real_t tangent; - if (Math::abs(dir.x) > CMP_EPSILON) + if (!Math::is_zero_approx(dir.x)) tangent = dir.y / dir.x; else tangent = 9999 * (dir.y >= 0 ? 1 : -1); diff --git a/editor/plugins/mesh_instance_editor_plugin.cpp b/editor/plugins/mesh_instance_editor_plugin.cpp index cf111dc4ce..635b934333 100644 --- a/editor/plugins/mesh_instance_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_editor_plugin.cpp @@ -412,6 +412,7 @@ void MeshInstanceEditor::_bind_methods() { MeshInstanceEditor::MeshInstanceEditor() { options = memnew(MenuButton); + options->set_switch_on_hover(true); SpatialEditor::get_singleton()->add_control_to_menu_panel(options); options->set_text(TTR("Mesh")); diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp index 8ff6080443..fc0a425bfc 100644 --- a/editor/plugins/multimesh_editor_plugin.cpp +++ b/editor/plugins/multimesh_editor_plugin.cpp @@ -293,6 +293,7 @@ void MultiMeshEditor::_bind_methods() { MultiMeshEditor::MultiMeshEditor() { options = memnew(MenuButton); + options->set_switch_on_hover(true); SpatialEditor::get_singleton()->add_control_to_menu_panel(options); options->set_text("MultiMesh"); diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp index 70d4919e9f..50bdf4512b 100644 --- a/editor/plugins/particles_2d_editor_plugin.cpp +++ b/editor/plugins/particles_2d_editor_plugin.cpp @@ -375,6 +375,7 @@ Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) { menu->get_popup()->add_separator(); menu->get_popup()->add_item(TTR("Convert to CPUParticles"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES); menu->set_text(TTR("Particles")); + menu->set_switch_on_hover(true); toolbar->add_child(menu); file = memnew(EditorFileDialog); diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp index 0032850535..09180edf2a 100644 --- a/editor/plugins/particles_editor_plugin.cpp +++ b/editor/plugins/particles_editor_plugin.cpp @@ -454,6 +454,7 @@ ParticlesEditor::ParticlesEditor() { particles_editor_hb = memnew(HBoxContainer); SpatialEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb); options = memnew(MenuButton); + options->set_switch_on_hover(true); particles_editor_hb->add_child(options); particles_editor_hb->hide(); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index af43f679fd..712b1a0ae4 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -1060,8 +1060,7 @@ void Polygon2DEditor::_uv_draw() { polygon_fill_color.push_back(pf); } Color prev_color = Color(0.5, 0.5, 0.5); - Rect2 rect(Point2(), mtx.basis_xform(base_tex->get_size())); - rect.expand_to(mtx.basis_xform(uv_edit_draw->get_size())); + Rect2 rect; int uv_draw_max = uvs.size(); @@ -1204,7 +1203,8 @@ void Polygon2DEditor::_uv_draw() { uv_edit_draw->draw_circle(bone_paint_pos, bone_paint_radius->get_value() * EDSCALE, Color(1, 1, 1, 0.1)); } - rect = rect.grow(200); + rect.position -= uv_edit_draw->get_size(); + rect.size += uv_edit_draw->get_size() * 2.0; updating_uv_scroll = true; uv_hscroll->set_min(rect.position.x); uv_hscroll->set_max(rect.position.x + rect.size.x); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index d7d4cec07d..d84a5a1e48 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -312,6 +312,38 @@ void ScriptEditor::_goto_script_line(REF p_script, int p_line) { } } +void ScriptEditor::_set_execution(REF p_script, int p_line) { + Ref<Script> script = Object::cast_to<Script>(*p_script); + if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) { + for (int i = 0; i < tab_container->get_child_count(); i++) { + + ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i)); + if (!se) + continue; + + if ((script != NULL && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) { + se->set_executing_line(p_line); + } + } + } +} + +void ScriptEditor::_clear_execution(REF p_script) { + Ref<Script> script = Object::cast_to<Script>(*p_script); + if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) { + for (int i = 0; i < tab_container->get_child_count(); i++) { + + ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i)); + if (!se) + continue; + + if ((script != NULL && se->get_edited_resource() == p_script) || se->get_edited_resource()->get_path() == script->get_path()) { + se->clear_executing_line(); + } + } + } +} + ScriptEditorBase *ScriptEditor::_get_current_editor() const { int selected = tab_container->get_current_tab(); @@ -1801,6 +1833,16 @@ void ScriptEditor::_update_script_names() { _update_script_colors(); } +void ScriptEditor::_update_script_connections() { + for (int i = 0; i < tab_container->get_child_count(); i++) { + ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(tab_container->get_child(i)); + if (!ste) { + continue; + } + ste->_update_connected_methods(); + } +} + Ref<TextFile> ScriptEditor::_load_text_file(const String &p_path, Error *r_error) { if (r_error) { *r_error = ERR_FILE_CANT_OPEN; @@ -2203,6 +2245,7 @@ void ScriptEditor::_tree_changed() { waiting_update_names = true; call_deferred("_update_script_names"); + call_deferred("_update_script_connections"); } void ScriptEditor::_script_split_dragged(float) { @@ -2482,22 +2525,39 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) { for (int i = 0; i < scripts.size(); i++) { String path = scripts[i]; + + Dictionary script_info = scripts[i]; + if (!script_info.empty()) { + path = script_info["path"]; + } + if (!FileAccess::exists(path)) continue; if (extensions.find(path.get_extension())) { Ref<Script> scr = ResourceLoader::load(path); - if (scr.is_valid()) { - edit(scr); + if (!scr.is_valid()) { + continue; + } + if (!edit(scr)) { + continue; + } + } else { + Error error; + Ref<TextFile> text_file = _load_text_file(path, &error); + if (error != OK || !text_file.is_valid()) { + continue; + } + if (!edit(text_file)) { continue; } } - Error error; - Ref<TextFile> text_file = _load_text_file(path, &error); - if (error == OK && text_file.is_valid()) { - edit(text_file); - continue; + if (!script_info.empty()) { + ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(tab_container->get_tab_count() - 1)); + if (se) { + se->set_edit_state(script_info["state"]); + } } } @@ -2537,7 +2597,11 @@ void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) { if (!path.is_resource_file()) continue; - scripts.push_back(path); + Dictionary script_info; + script_info["path"] = path; + script_info["state"] = se->get_edit_state(); + + scripts.push_back(script_info); } EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i)); @@ -2846,6 +2910,8 @@ void ScriptEditor::_bind_methods() { ClassDB::bind_method("_res_saved_callback", &ScriptEditor::_res_saved_callback); ClassDB::bind_method("_goto_script_line", &ScriptEditor::_goto_script_line); ClassDB::bind_method("_goto_script_line2", &ScriptEditor::_goto_script_line2); + ClassDB::bind_method("_set_execution", &ScriptEditor::_set_execution); + ClassDB::bind_method("_clear_execution", &ScriptEditor::_clear_execution); ClassDB::bind_method("_help_search", &ScriptEditor::_help_search); ClassDB::bind_method("_save_history", &ScriptEditor::_save_history); ClassDB::bind_method("_copy_script_path", &ScriptEditor::_copy_script_path); @@ -2856,6 +2922,7 @@ void ScriptEditor::_bind_methods() { ClassDB::bind_method("_autosave_scripts", &ScriptEditor::_autosave_scripts); ClassDB::bind_method("_editor_settings_changed", &ScriptEditor::_editor_settings_changed); ClassDB::bind_method("_update_script_names", &ScriptEditor::_update_script_names); + ClassDB::bind_method("_update_script_connections", &ScriptEditor::_update_script_connections); ClassDB::bind_method("_tree_changed", &ScriptEditor::_tree_changed); ClassDB::bind_method("_members_overview_selected", &ScriptEditor::_members_overview_selected); ClassDB::bind_method("_help_overview_selected", &ScriptEditor::_help_overview_selected); @@ -3135,6 +3202,8 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { debugger = memnew(ScriptEditorDebugger(editor)); debugger->connect("goto_script_line", this, "_goto_script_line"); + debugger->connect("set_execution", this, "_set_execution"); + debugger->connect("clear_execution", this, "_clear_execution"); debugger->connect("show_debugger", this, "_show_debugger"); disk_changed = memnew(ConfirmationDialog); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 954b014935..a17fed1e06 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -96,6 +96,8 @@ public: virtual Variant get_edit_state() = 0; virtual void set_edit_state(const Variant &p_state) = 0; virtual void goto_line(int p_line, bool p_with_error = false) = 0; + virtual void set_executing_line(int p_line) = 0; + virtual void clear_executing_line() = 0; virtual void trim_trailing_whitespace() = 0; virtual void convert_indent_to_spaces() = 0; virtual void convert_indent_to_tabs() = 0; @@ -318,6 +320,8 @@ class ScriptEditor : public PanelContainer { void _goto_script_line2(int p_line); void _goto_script_line(REF p_script, int p_line); + void _set_execution(REF p_script, int p_line); + void _clear_execution(REF p_script); void _breaked(bool p_breaked, bool p_can_debug); void _show_debugger(bool p_show); void _update_window_menu(); @@ -333,6 +337,7 @@ class ScriptEditor : public PanelContainer { void _update_members_overview(); void _toggle_members_overview_alpha_sort(bool p_alphabetic_sort); void _update_script_names(); + void _update_script_connections(); bool _sort_list_on_update; void _members_overview_selected(int p_idx); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index c586985957..d40e67cc8c 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -35,6 +35,76 @@ #include "editor/editor_settings.h" #include "editor/script_editor_debugger.h" +void ConnectionInfoDialog::ok_pressed() { +} + +void ConnectionInfoDialog::popup_connections(String p_method, Vector<Node *> p_nodes) { + method->set_text(p_method); + + tree->clear(); + TreeItem *root = tree->create_item(); + + for (int i = 0; i < p_nodes.size(); i++) { + List<Connection> all_connections; + p_nodes[i]->get_signals_connected_to_this(&all_connections); + + for (List<Connection>::Element *E = all_connections.front(); E; E = E->next()) { + Connection connection = E->get(); + + if (connection.method != p_method) { + continue; + } + + TreeItem *node_item = tree->create_item(root); + + node_item->set_text(0, Object::cast_to<Node>(connection.source)->get_name()); + node_item->set_icon(0, EditorNode::get_singleton()->get_object_icon(connection.source, "Node")); + node_item->set_selectable(0, false); + node_item->set_editable(0, false); + + node_item->set_text(1, connection.signal); + node_item->set_icon(1, get_parent_control()->get_icon("Slot", "EditorIcons")); + node_item->set_selectable(1, false); + node_item->set_editable(1, false); + + node_item->set_text(2, Object::cast_to<Node>(connection.target)->get_name()); + node_item->set_icon(2, EditorNode::get_singleton()->get_object_icon(connection.target, "Node")); + node_item->set_selectable(2, false); + node_item->set_editable(2, false); + } + } + + popup_centered(Size2(400, 300) * EDSCALE); +} + +ConnectionInfoDialog::ConnectionInfoDialog() { + set_title(TTR("Connections to method:")); + + VBoxContainer *vbc = memnew(VBoxContainer); + vbc->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 8 * EDSCALE); + vbc->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 8 * EDSCALE); + vbc->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -8 * EDSCALE); + vbc->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, -8 * EDSCALE); + add_child(vbc); + + method = memnew(Label); + method->set_align(Label::ALIGN_CENTER); + vbc->add_child(method); + + tree = memnew(Tree); + tree->set_columns(3); + tree->set_hide_root(true); + tree->set_column_titles_visible(true); + tree->set_column_title(0, TTR("Source")); + tree->set_column_title(1, TTR("Signal")); + tree->set_column_title(2, TTR("Target")); + vbc->add_child(tree); + tree->set_v_size_flags(SIZE_EXPAND_FILL); + tree->set_allow_rmb_select(true); +} + +//////////////////////////////////////////////////////////////////////////////// + Vector<String> ScriptTextEditor::get_functions() { String errortxt; @@ -144,6 +214,7 @@ void ScriptTextEditor::_load_theme_settings() { Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color"); Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color"); Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color"); + Color executing_line_color = EDITOR_GET("text_editor/highlighting/executing_line_color"); Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color"); Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color"); Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color"); @@ -175,6 +246,7 @@ void ScriptTextEditor::_load_theme_settings() { text_edit->add_color_override("function_color", function_color); text_edit->add_color_override("member_variable_color", member_variable_color); text_edit->add_color_override("breakpoint_color", breakpoint_color); + text_edit->add_color_override("executing_line_color", executing_line_color); text_edit->add_color_override("mark_color", mark_color); text_edit->add_color_override("code_folding_color", code_folding_color); text_edit->add_color_override("search_result_color", search_result_color); @@ -320,7 +392,6 @@ void ScriptTextEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: _load_theme_settings(); - _change_syntax_highlighter(EditorSettings::get_singleton()->get_project_metadata("script_text_editor", "syntax_highlighter", 0)); break; } } @@ -365,6 +436,14 @@ Variant ScriptTextEditor::get_edit_state() { void ScriptTextEditor::set_edit_state(const Variant &p_state) { code_editor->set_edit_state(p_state); + + Dictionary state = p_state; + if (state.has("syntax_highlighter")) { + int idx = highlighter_menu->get_item_idx_from_text(state["syntax_highlighter"]); + if (idx >= 0) { + _change_syntax_highlighter(idx); + } + } } void ScriptTextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) { @@ -402,6 +481,14 @@ void ScriptTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) { code_editor->goto_line_selection(p_line, p_begin, p_end); } +void ScriptTextEditor::set_executing_line(int p_line) { + code_editor->set_executing_line(p_line); +} + +void ScriptTextEditor::clear_executing_line() { + code_editor->clear_executing_line(); +} + void ScriptTextEditor::ensure_focus() { code_editor->get_text_edit()->grab_focus(); @@ -463,9 +550,32 @@ void ScriptTextEditor::_validate_script() { functions.push_back(E->get()); } } + _update_connected_methods(); - code_editor->set_warning_nb(warnings.size()); + code_editor->set_warning_nb(missing_connections.size() + warnings.size()); warnings_panel->clear(); + + // add missing connections + Node *base = get_tree()->get_edited_scene_root(); + if (base && missing_connections.size() > 0) { + warnings_panel->push_table(1); + for (List<Connection>::Element *E = missing_connections.front(); E; E = E->next()) { + Connection connection = E->get(); + + String base_path = base->get_name(); + String source_path = base == connection.source ? base_path : base_path + "/" + String(base->get_path_to(Object::cast_to<Node>(connection.source))); + String target_path = base == connection.target ? base_path : base_path + "/" + String(base->get_path_to(Object::cast_to<Node>(connection.target))); + + warnings_panel->push_cell(); + warnings_panel->push_color(warnings_panel->get_color("warning_color", "Editor")); + warnings_panel->add_text(vformat(TTR("Missing connected method '%s' for signal '%s' from node '%s' to node '%s'"), connection.method, connection.signal, source_path, target_path)); + warnings_panel->pop(); // Color + warnings_panel->pop(); // Cell + } + warnings_panel->pop(); // Table + } + + // add script warnings warnings_panel->push_table(3); for (List<ScriptLanguage::Warning>::Element *E = warnings.front(); E; E = E->next()) { ScriptLanguage::Warning w = E->get(); @@ -519,6 +629,27 @@ void ScriptTextEditor::_validate_script() { emit_signal("edited_script_changed"); } +static Vector<Node *> _find_all_node_for_script(Node *p_base, Node *p_current, const Ref<Script> &p_script) { + + Vector<Node *> nodes; + + if (p_current->get_owner() != p_base && p_base != p_current) { + return nodes; + } + + Ref<Script> c = p_current->get_script(); + if (c == p_script) { + nodes.push_back(p_current); + } + + for (int i = 0; i < p_current->get_child_count(); i++) { + Vector<Node *> found = _find_all_node_for_script(p_base, p_current->get_child(i), p_script); + nodes.append_array(found); + } + + return nodes; +} + static Node *_find_node_for_script(Node *p_base, Node *p_current, const Ref<Script> &p_script) { if (p_current->get_owner() != p_base && p_base != p_current) @@ -714,6 +845,47 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c } } +void ScriptTextEditor::_update_connected_methods() { + TextEdit *text_edit = code_editor->get_text_edit(); + text_edit->clear_info_icons(); + missing_connections.clear(); + + Node *base = get_tree()->get_edited_scene_root(); + if (!base) { + return; + } + + Vector<Node *> nodes = _find_all_node_for_script(base, base, script); + for (int i = 0; i < nodes.size(); i++) { + List<Connection> connections; + nodes[i]->get_signals_connected_to_this(&connections); + + for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { + Connection connection = E->get(); + if (!(connection.flags & CONNECT_PERSIST)) { + continue; + } + + int line = script->get_language()->find_function(connection.method, text_edit->get_text()); + if (line < 0) { + missing_connections.push_back(connection); + continue; + } + text_edit->set_line_info_icon(line - 1, get_parent_control()->get_icon("Slot", "EditorIcons"), connection.method); + } + } +} + +void ScriptTextEditor::_lookup_connections(int p_row, String p_method) { + Node *base = get_tree()->get_edited_scene_root(); + if (!base) { + return; + } + + Vector<Node *> nodes = _find_all_node_for_script(base, base, script); + connection_info_dialog->popup_connections(p_method, nodes); +} + void ScriptTextEditor::_edit_option(int p_op) { TextEdit *tx = code_editor->get_text_edit(); @@ -1026,7 +1198,6 @@ void ScriptTextEditor::_change_syntax_highlighter(int p_idx) { } // highlighter_menu->set_item_checked(p_idx, true); set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]); - EditorSettings::get_singleton()->set_project_metadata("script_text_editor", "syntax_highlighter", p_idx); } void ScriptTextEditor::_bind_methods() { @@ -1034,6 +1205,8 @@ void ScriptTextEditor::_bind_methods() { ClassDB::bind_method("_validate_script", &ScriptTextEditor::_validate_script); ClassDB::bind_method("_load_theme_settings", &ScriptTextEditor::_load_theme_settings); ClassDB::bind_method("_breakpoint_toggled", &ScriptTextEditor::_breakpoint_toggled); + ClassDB::bind_method("_lookup_connections", &ScriptTextEditor::_lookup_connections); + ClassDB::bind_method("_update_connected_methods", &ScriptTextEditor::_update_connected_methods); ClassDB::bind_method("_change_syntax_highlighter", &ScriptTextEditor::_change_syntax_highlighter); ClassDB::bind_method("_edit_option", &ScriptTextEditor::_edit_option); ClassDB::bind_method("_goto_line", &ScriptTextEditor::_goto_line); @@ -1366,6 +1539,7 @@ ScriptTextEditor::ScriptTextEditor() { code_editor->set_code_complete_func(_code_complete_scripts, this); code_editor->get_text_edit()->connect("breakpoint_toggled", this, "_breakpoint_toggled"); code_editor->get_text_edit()->connect("symbol_lookup", this, "_lookup_symbol"); + code_editor->get_text_edit()->connect("info_clicked", this, "_lookup_connections"); code_editor->set_v_size_flags(SIZE_EXPAND_FILL); warnings_panel = memnew(RichTextLabel); @@ -1486,6 +1660,9 @@ ScriptTextEditor::ScriptTextEditor() { goto_line_dialog = memnew(GotoLineDialog); add_child(goto_line_dialog); + connection_info_dialog = memnew(ConnectionInfoDialog); + add_child(connection_info_dialog); + code_editor->get_text_edit()->set_drag_forwarding(this); } diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index b081a31c18..0dbc884594 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -32,8 +32,25 @@ #define SCRIPT_TEXT_EDITOR_H #include "scene/gui/color_picker.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/tree.h" #include "script_editor_plugin.h" +class ConnectionInfoDialog : public AcceptDialog { + + GDCLASS(ConnectionInfoDialog, AcceptDialog); + + Label *method; + Tree *tree; + + virtual void ok_pressed(); + +public: + void popup_connections(String p_method, Vector<Node *> p_nodes); + + ConnectionInfoDialog(); +}; + class ScriptTextEditor : public ScriptEditorBase { GDCLASS(ScriptTextEditor, ScriptEditorBase); @@ -45,6 +62,8 @@ class ScriptTextEditor : public ScriptEditorBase { Vector<String> functions; + List<Connection> missing_connections; + Vector<String> member_keywords; HBoxContainer *edit_hb; @@ -56,6 +75,7 @@ class ScriptTextEditor : public ScriptEditorBase { GotoLineDialog *goto_line_dialog; ScriptEditorQuickOpen *quick_open; + ConnectionInfoDialog *connection_info_dialog; PopupPanel *color_panel; ColorPicker *color_picker; @@ -144,6 +164,8 @@ protected: void _goto_line(int p_line) { goto_line(p_line); } void _lookup_symbol(const String &p_symbol, int p_row, int p_column); + void _lookup_connections(int p_row, String p_method); + void _convert_case(CodeTextEditor::CaseStyle p_case); Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); @@ -151,6 +173,8 @@ protected: void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); public: + void _update_connected_methods(); + virtual void add_syntax_highlighter(SyntaxHighlighter *p_highlighter); virtual void set_syntax_highlighter(SyntaxHighlighter *p_highlighter); @@ -172,6 +196,8 @@ public: virtual void goto_line(int p_line, bool p_with_error = false); void goto_line_selection(int p_line, int p_begin, int p_end); + virtual void set_executing_line(int p_line); + virtual void clear_executing_line(); virtual void reload(bool p_soft); virtual void get_breakpoints(List<int> *p_breakpoints); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index d39e521113..31660a9e19 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -85,6 +85,7 @@ void ShaderTextEditor::_load_theme_settings() { Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color"); Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color"); Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color"); + Color executing_line_color = EDITOR_GET("text_editor/highlighting/executing_line_color"); Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color"); Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color"); Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color"); @@ -113,6 +114,7 @@ void ShaderTextEditor::_load_theme_settings() { get_text_edit()->add_color_override("member_variable_color", member_variable_color); get_text_edit()->add_color_override("mark_color", mark_color); get_text_edit()->add_color_override("breakpoint_color", breakpoint_color); + get_text_edit()->add_color_override("executing_line_color", executing_line_color); get_text_edit()->add_color_override("code_folding_color", code_folding_color); get_text_edit()->add_color_override("search_result_color", search_result_color); get_text_edit()->add_color_override("search_result_border_color", search_result_border_color); diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp index ef3e17279c..0ccb60e39e 100644 --- a/editor/plugins/skeleton_2d_editor_plugin.cpp +++ b/editor/plugins/skeleton_2d_editor_plugin.cpp @@ -108,6 +108,7 @@ Skeleton2DEditor::Skeleton2DEditor() { options->get_popup()->add_item(TTR("Make Rest Pose (From Bones)"), MENU_OPTION_MAKE_REST); options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Set Bones to Rest Pose"), MENU_OPTION_SET_REST); + options->set_switch_on_hover(true); options->get_popup()->connect("id_pressed", this, "_menu_option"); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index ba297539d3..5a733f6509 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -269,11 +269,21 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) { if (!clicked) return; - Spatial *sp = Object::cast_to<Spatial>(ObjectDB::get_instance(clicked)); - if (!sp) + Node *node = Object::cast_to<Node>(ObjectDB::get_instance(clicked)); + Spatial *selected = Object::cast_to<Spatial>(node); + if (!selected) return; - _select(sp, clicked_wants_append, true); + // Replace the node by the group if grouped + while (node && node != editor->get_edited_scene()->get_parent()) { + Spatial *selected_tmp = Object::cast_to<Spatial>(node); + if (selected_tmp && node->has_meta("_edit_group_")) { + selected = selected_tmp; + } + node = node->get_parent(); + } + + _select(selected, clicked_wants_append, true); } void SpatialEditorViewport::_select(Node *p_node, bool p_append, bool p_single) { @@ -511,6 +521,19 @@ void SpatialEditorViewport::_select_region() { item = item->get_owner(); } + // Replace the node by the group if grouped + if (item->is_class("Spatial")) { + Spatial *sel = Object::cast_to<Spatial>(item); + while (item && item != editor->get_edited_scene()->get_parent()) { + Spatial *selected_tmp = Object::cast_to<Spatial>(item); + if (selected_tmp && item->has_meta("_edit_group_")) { + sel = selected_tmp; + } + item = item->get_parent(); + } + item = sel; + } + if (selected.find(item) != -1) continue; Ref<EditorSpatialGizmo> seg = sp->get_gizmo(); @@ -1827,7 +1850,7 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (!sp) continue; - emit_signal("transform_key_request", sp, "", sp->get_transform()); + spatial_editor->emit_signal("transform_key_request", sp, "", sp->get_transform()); } set_message(TTR("Animation Key Inserted.")); @@ -2450,7 +2473,7 @@ void SpatialEditorViewport::_draw() { real_t max_speed = camera->get_zfar(); real_t scale_length = (max_speed - min_speed); - if (Math::abs(scale_length) > CMP_EPSILON) { + if (!Math::is_zero_approx(scale_length)) { real_t logscale_t = 1.0 - Math::log(1 + freelook_speed - min_speed) / Math::log(1 + scale_length); // There is no real maximum speed so that factor can become negative, @@ -2468,7 +2491,7 @@ void SpatialEditorViewport::_draw() { real_t max_distance = camera->get_zfar(); real_t scale_length = (max_distance - min_distance); - if (Math::abs(scale_length) > CMP_EPSILON) { + if (!Math::is_zero_approx(scale_length)) { real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length); // There is no real maximum distance so that factor can become negative, @@ -4492,6 +4515,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) { snap_selected_nodes_to_floor(); } break; case MENU_LOCK_SELECTED: { + undo_redo->create_action(TTR("Lock Selected")); List<Node *> &selection = editor_selection->get_selected_node_list(); @@ -4504,13 +4528,42 @@ void SpatialEditor::_menu_item_pressed(int p_option) { if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - spatial->set_meta("_edit_lock_", true); - emit_signal("item_lock_status_changed"); + undo_redo->add_do_method(spatial, "set_meta", "_edit_lock_", true); + undo_redo->add_undo_method(spatial, "remove_meta", "_edit_lock_"); + undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed"); } - _refresh_menu_icons(); + undo_redo->add_do_method(this, "_refresh_menu_icons", Variant()); + undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant()); + undo_redo->commit_action(); } break; case MENU_UNLOCK_SELECTED: { + undo_redo->create_action(TTR("Unlock Selected")); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + + Spatial *spatial = Object::cast_to<Spatial>(E->get()); + if (!spatial || !spatial->is_visible_in_tree()) + continue; + + if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) + continue; + + undo_redo->add_do_method(spatial, "remove_meta", "_edit_lock_"); + undo_redo->add_undo_method(spatial, "set_meta", "_edit_lock_", true); + undo_redo->add_do_method(this, "emit_signal", "item_lock_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_lock_status_changed"); + } + + undo_redo->add_do_method(this, "_refresh_menu_icons", Variant()); + undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant()); + undo_redo->commit_action(); + } break; + case MENU_GROUP_SELECTED: { + undo_redo->create_action(TTR("Group Selected")); List<Node *> &selection = editor_selection->get_selected_node_list(); @@ -4523,11 +4576,38 @@ void SpatialEditor::_menu_item_pressed(int p_option) { if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) continue; - spatial->set_meta("_edit_lock_", Variant()); - emit_signal("item_lock_status_changed"); + undo_redo->add_do_method(spatial, "set_meta", "_edit_group_", true); + undo_redo->add_undo_method(spatial, "remove_meta", "_edit_group_"); + undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed"); } - _refresh_menu_icons(); + undo_redo->add_do_method(this, "_refresh_menu_icons", Variant()); + undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant()); + undo_redo->commit_action(); + } break; + case MENU_UNGROUP_SELECTED: { + undo_redo->create_action(TTR("Ungroup Selected")); + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + + Spatial *spatial = Object::cast_to<Spatial>(E->get()); + if (!spatial || !spatial->is_visible_in_tree()) + continue; + + if (spatial->get_viewport() != EditorNode::get_singleton()->get_scene_root()) + continue; + + undo_redo->add_do_method(spatial, "remove_meta", "_edit_group_"); + undo_redo->add_undo_method(spatial, "set_meta", "_edit_group_", true); + undo_redo->add_do_method(this, "emit_signal", "item_group_status_changed"); + undo_redo->add_undo_method(this, "emit_signal", "item_group_status_changed"); + } + + undo_redo->add_do_method(this, "_refresh_menu_icons", Variant()); + undo_redo->add_undo_method(this, "_refresh_menu_icons", Variant()); + undo_redo->commit_action(); } break; } } @@ -4971,11 +5051,13 @@ bool SpatialEditor::is_any_freelook_active() const { void SpatialEditor::_refresh_menu_icons() { bool all_locked = true; + bool all_grouped = true; List<Node *> &selection = editor_selection->get_selected_node_list(); if (selection.empty()) { all_locked = false; + all_grouped = false; } else { for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { if (Object::cast_to<Spatial>(E->get()) && !Object::cast_to<Spatial>(E->get())->has_meta("_edit_lock_")) { @@ -4983,11 +5065,21 @@ void SpatialEditor::_refresh_menu_icons() { break; } } + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + if (Object::cast_to<Spatial>(E->get()) && !Object::cast_to<Spatial>(E->get())->has_meta("_edit_group_")) { + all_grouped = false; + break; + } + } } tool_button[TOOL_LOCK_SELECTED]->set_visible(!all_locked); tool_button[TOOL_LOCK_SELECTED]->set_disabled(selection.empty()); tool_button[TOOL_UNLOCK_SELECTED]->set_visible(all_locked); + + tool_button[TOOL_GROUP_SELECTED]->set_visible(!all_grouped); + tool_button[TOOL_GROUP_SELECTED]->set_disabled(selection.empty()); + tool_button[TOOL_UNGROUP_SELECTED]->set_visible(all_grouped); } template <typename T> @@ -5157,6 +5249,8 @@ void SpatialEditor::_notification(int p_what) { tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons")); tool_button[SpatialEditor::TOOL_LOCK_SELECTED]->set_icon(get_icon("Lock", "EditorIcons")); tool_button[SpatialEditor::TOOL_UNLOCK_SELECTED]->set_icon(get_icon("Unlock", "EditorIcons")); + tool_button[SpatialEditor::TOOL_GROUP_SELECTED]->set_icon(get_icon("Group", "EditorIcons")); + tool_button[SpatialEditor::TOOL_UNGROUP_SELECTED]->set_icon(get_icon("Ungroup", "EditorIcons")); tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->set_icon(get_icon("Object", "EditorIcons")); tool_option_button[SpatialEditor::TOOL_OPT_USE_SNAP]->set_icon(get_icon("Snap", "EditorIcons")); @@ -5351,6 +5445,7 @@ void SpatialEditor::_bind_methods() { ADD_SIGNAL(MethodInfo("transform_key_request")); ADD_SIGNAL(MethodInfo("item_lock_status_changed")); + ADD_SIGNAL(MethodInfo("item_group_status_changed")); } void SpatialEditor::clear() { @@ -5464,6 +5559,18 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds); tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock the selected object (can be moved).")); + tool_button[TOOL_GROUP_SELECTED] = memnew(ToolButton); + hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]); + button_binds.write[0] = MENU_GROUP_SELECTED; + tool_button[TOOL_GROUP_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds); + tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable.")); + + tool_button[TOOL_UNGROUP_SELECTED] = memnew(ToolButton); + hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]); + button_binds.write[0] = MENU_UNGROUP_SELECTED; + tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", this, "_menu_item_pressed", button_binds); + tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip(TTR("Restores the object's children's ability to be selected.")); + hbc_menu->add_child(memnew(VSeparator)); tool_option_button[TOOL_OPT_LOCAL_COORDS] = memnew(ToolButton); @@ -5598,11 +5705,11 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { snap_dialog_vbc->add_margin_child(TTR("Translate Snap:"), snap_translate); snap_rotate = memnew(LineEdit); - snap_rotate->set_text("5"); + snap_rotate->set_text("15"); snap_dialog_vbc->add_margin_child(TTR("Rotate Snap (deg.):"), snap_rotate); snap_scale = memnew(LineEdit); - snap_scale->set_text("5"); + snap_scale->set_text("10"); snap_dialog_vbc->add_margin_child(TTR("Scale Snap (%):"), snap_scale); /* SETTINGS DIALOG */ @@ -5760,6 +5867,39 @@ Vector3 SpatialEditor::snap_point(Vector3 p_target, Vector3 p_start) const { return p_target; } +float SpatialEditor::get_translate_snap() const { + float snap_value; + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + snap_value = snap_translate->get_text().to_double() / 10.0; + } else { + snap_value = snap_translate->get_text().to_double(); + } + + return snap_value; +} + +float SpatialEditor::get_rotate_snap() const { + float snap_value; + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + snap_value = snap_rotate->get_text().to_double() / 3.0; + } else { + snap_value = snap_rotate->get_text().to_double(); + } + + return snap_value; +} + +float SpatialEditor::get_scale_snap() const { + float snap_value; + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + snap_value = snap_scale->get_text().to_double() / 2.0; + } else { + snap_value = snap_scale->get_text().to_double(); + } + + return snap_value; +} + void SpatialEditorPlugin::_bind_methods() { ClassDB::bind_method("snap_cursor_to_plane", &SpatialEditorPlugin::snap_cursor_to_plane); @@ -5814,7 +5954,7 @@ SpatialEditorPlugin::SpatialEditorPlugin(EditorNode *p_node) { editor->get_viewport()->add_child(spatial_editor); spatial_editor->hide(); - spatial_editor->connect("transform_key_request", editor, "_transform_keyed"); + spatial_editor->connect("transform_key_request", editor->get_inspector_dock(), "_transform_keyed"); } SpatialEditorPlugin::~SpatialEditorPlugin() { diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 4a9d34a7f7..f3a1e657cc 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -485,6 +485,8 @@ public: TOOL_MODE_LIST_SELECT, TOOL_LOCK_SELECTED, TOOL_UNLOCK_SELECTED, + TOOL_GROUP_SELECTED, + TOOL_UNGROUP_SELECTED, TOOL_MAX }; @@ -570,6 +572,8 @@ private: MENU_VIEW_CAMERA_SETTINGS, MENU_LOCK_SELECTED, MENU_UNLOCK_SELECTED, + MENU_GROUP_SELECTED, + MENU_UNGROUP_SELECTED, MENU_SNAP_TO_FLOOR }; @@ -673,9 +677,9 @@ public: ToolMode get_tool_mode() const { return tool_mode; } bool are_local_coords_enabled() const { return tool_option_button[SpatialEditor::TOOL_OPT_LOCAL_COORDS]->is_pressed(); } bool is_snap_enabled() const { return snap_enabled ^ snap_key_enabled; } - float get_translate_snap() const { return snap_translate->get_text().to_double(); } - float get_rotate_snap() const { return snap_rotate->get_text().to_double(); } - float get_scale_snap() const { return snap_scale->get_text().to_double(); } + float get_translate_snap() const; + float get_rotate_snap() const; + float get_scale_snap() const; Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; } Ref<ArrayMesh> get_move_plane_gizmo(int idx) const { return move_plane_gizmo[idx]; } diff --git a/editor/plugins/sprite_editor_plugin.cpp b/editor/plugins/sprite_editor_plugin.cpp index fbc72b1396..7642bfaf04 100644 --- a/editor/plugins/sprite_editor_plugin.cpp +++ b/editor/plugins/sprite_editor_plugin.cpp @@ -549,6 +549,7 @@ SpriteEditor::SpriteEditor() { options->get_popup()->add_item(TTR("Convert to Polygon2D"), MENU_OPTION_CONVERT_TO_POLYGON_2D); options->get_popup()->add_item(TTR("Create CollisionPolygon2D Sibling"), MENU_OPTION_CREATE_COLLISION_POLY_2D); options->get_popup()->add_item(TTR("Create LightOccluder2D Sibling"), MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D); + options->set_switch_on_hover(true); options->get_popup()->connect("id_pressed", this, "_menu_option"); diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index fe32c97a64..becaae3567 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -66,7 +66,6 @@ void TextEditor::_change_syntax_highlighter(int p_idx) { el = el->next(); } set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]); - EditorSettings::get_singleton()->set_project_metadata("text_editor", "syntax_highlighter", p_idx); } void TextEditor::_load_theme_settings() { @@ -95,6 +94,7 @@ void TextEditor::_load_theme_settings() { Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color"); Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color"); Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color"); + Color executing_line_color = EDITOR_GET("text_editor/highlighting/executing_line_color"); Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color"); Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color"); Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color"); @@ -125,6 +125,7 @@ void TextEditor::_load_theme_settings() { text_edit->add_color_override("function_color", function_color); text_edit->add_color_override("member_variable_color", member_variable_color); text_edit->add_color_override("breakpoint_color", breakpoint_color); + text_edit->add_color_override("executing_line_color", executing_line_color); text_edit->add_color_override("mark_color", mark_color); text_edit->add_color_override("code_folding_color", code_folding_color); text_edit->add_color_override("search_result_color", search_result_color); @@ -234,6 +235,14 @@ Variant TextEditor::get_edit_state() { void TextEditor::set_edit_state(const Variant &p_state) { code_editor->set_edit_state(p_state); + + Dictionary state = p_state; + if (state.has("syntax_highlighter")) { + int idx = highlighter_menu->get_item_idx_from_text(state["syntax_highlighter"]); + if (idx >= 0) { + _change_syntax_highlighter(idx); + } + } } void TextEditor::trim_trailing_whitespace() { @@ -261,6 +270,15 @@ void TextEditor::goto_line(int p_line, bool p_with_error) { code_editor->goto_line(p_line); } +void TextEditor::set_executing_line(int p_line) { + + code_editor->set_executing_line(p_line); +} + +void TextEditor::clear_executing_line() { + code_editor->clear_executing_line(); +} + void TextEditor::ensure_focus() { code_editor->get_text_edit()->grab_focus(); @@ -299,7 +317,6 @@ void TextEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: _load_theme_settings(); - _change_syntax_highlighter(EditorSettings::get_singleton()->get_project_metadata("text_editor", "syntax_highlighter", 0)); break; } } diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 3c136277df..767001e2f6 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -123,6 +123,8 @@ public: virtual Vector<String> get_functions(); virtual void get_breakpoints(List<int> *p_breakpoints); virtual void goto_line(int p_line, bool p_with_error = false); + virtual void set_executing_line(int p_line); + virtual void clear_executing_line(); virtual void trim_trailing_whitespace(); virtual void convert_indent_to_spaces(); virtual void convert_indent_to_tabs(); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index f741040fa8..4e15bd5116 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -135,8 +135,7 @@ void TextureRegionEditor::_region_draw() { Ref<Texture> select_handle = get_icon("EditorHandle", "EditorIcons"); - Rect2 scroll_rect(Point2(), mtx.basis_xform(base_tex->get_size())); - scroll_rect.expand_to(mtx.basis_xform(edit_draw->get_size())); + Rect2 scroll_rect; Vector2 endpoints[4] = { mtx.basis_xform(rect.position), @@ -167,7 +166,9 @@ void TextureRegionEditor::_region_draw() { scroll_rect.expand_to(endpoints[i]); } - scroll_rect = scroll_rect.grow(200); + scroll_rect.position -= edit_draw->get_size(); + scroll_rect.size += edit_draw->get_size() * 2.0; + updating_scroll = true; hscroll->set_min(scroll_rect.position.x); hscroll->set_max(scroll_rect.position.x + scroll_rect.size.x); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index e9b9c03c1e..80e2e99685 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -36,7 +36,7 @@ void ThemeEditor::edit(const Ref<Theme> &p_theme) { theme = p_theme; - main_vb->set_theme(p_theme); + main_container->set_theme(p_theme); } void ThemeEditor::_propagate_redraw(Control *p_at) { @@ -53,7 +53,7 @@ void ThemeEditor::_propagate_redraw(Control *p_at) { void ThemeEditor::_refresh_interval() { - _propagate_redraw(main_vb); + _propagate_redraw(main_container); } void ThemeEditor::_type_menu_cbk(int p_option) { @@ -86,7 +86,7 @@ void ThemeEditor::_name_menu_about_to_show() { } name_menu->get_popup()->clear(); - + name_menu->get_popup()->set_size(Size2()); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { name_menu->get_popup()->add_item(E->get()); @@ -574,7 +574,6 @@ void ThemeEditor::_theme_menu_cbk(int p_option) { } } - //types.sort(); types.sort_custom<StringName::AlphCompare>(); for (List<StringName>::Element *E = types.front(); E; E = E->next()) { @@ -610,30 +609,14 @@ ThemeEditor::ThemeEditor() { time_left = 0; - scroll = memnew(ScrollContainer); - add_child(scroll); - scroll->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 3); - scroll->set_margin(MARGIN_TOP, 30 * EDSCALE); - //scroll->set_enable_h_scroll(true); - scroll->set_enable_v_scroll(true); - scroll->set_enable_h_scroll(false); - - Panel *panel = memnew(Panel); - scroll->add_child(panel); - panel->set_custom_minimum_size(Size2(500, 800) * EDSCALE); - panel->set_theme(Theme::get_default()); - panel->set_h_size_flags(SIZE_EXPAND_FILL); + HBoxContainer *top_menu = memnew(HBoxContainer); + add_child(top_menu); - main_vb = memnew(VBoxContainer); - panel->add_child(main_vb); - main_vb->set_anchors_and_margins_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 4 * EDSCALE); - - HBoxContainer *hb_menu = memnew(HBoxContainer); - main_vb->add_child(hb_menu); + top_menu->add_child(memnew(Label(TTR("Preview:")))); + top_menu->add_spacer(false); theme_menu = memnew(MenuButton); - theme_menu->set_text(TTR("Edit theme...")); - theme_menu->set_flat(false); + theme_menu->set_text(TTR("Edit Theme")); theme_menu->set_tooltip(TTR("Theme editing menu.")); theme_menu->get_popup()->add_item(TTR("Add Item"), POPUP_ADD); theme_menu->get_popup()->add_item(TTR("Add Class Items"), POPUP_CLASS_ADD); @@ -643,51 +626,73 @@ ThemeEditor::ThemeEditor() { theme_menu->get_popup()->add_item(TTR("Create Empty Template"), POPUP_CREATE_EMPTY); theme_menu->get_popup()->add_item(TTR("Create Empty Editor Template"), POPUP_CREATE_EDITOR_EMPTY); theme_menu->get_popup()->add_item(TTR("Create From Current Editor Theme"), POPUP_IMPORT_EDITOR_THEME); - add_child(theme_menu); - theme_menu->set_position(Vector2(3, 3) * EDSCALE); + top_menu->add_child(theme_menu); theme_menu->get_popup()->connect("id_pressed", this, "_theme_menu_cbk"); + scroll = memnew(ScrollContainer); + add_child(scroll); + scroll->set_enable_v_scroll(true); + scroll->set_enable_h_scroll(false); + scroll->set_v_size_flags(SIZE_EXPAND_FILL); + + main_container = memnew(MarginContainer); + scroll->add_child(main_container); + main_container->set_clip_contents(true); + main_container->set_custom_minimum_size(Size2(700, 0) * EDSCALE); + main_container->set_v_size_flags(SIZE_EXPAND_FILL); + main_container->set_h_size_flags(SIZE_EXPAND_FILL); + + //// Preview Controls //// + + Panel *panel = memnew(Panel); + main_container->add_child(panel); + panel->set_theme(Theme::get_default()); + + MarginContainer *mc = memnew(MarginContainer); + main_container->add_child(mc); + mc->set_theme(Theme::get_default()); + mc->add_constant_override("margin_right", 4 * EDSCALE); + mc->add_constant_override("margin_top", 4 * EDSCALE); + mc->add_constant_override("margin_left", 4 * EDSCALE); + mc->add_constant_override("margin_bottom", 4 * EDSCALE); + HBoxContainer *main_hb = memnew(HBoxContainer); - main_vb->add_child(main_hb); + mc->add_child(main_hb); VBoxContainer *first_vb = memnew(VBoxContainer); - first_vb->set_h_size_flags(SIZE_EXPAND_FILL); main_hb->add_child(first_vb); - - //main_panel->add_child(panel); - //panel->set_anchors_and_margins_preset(Control::PRESET_WIDE); - //panel->set_margin( MARGIN_TOP,20 ); + first_vb->set_h_size_flags(SIZE_EXPAND_FILL); + first_vb->add_constant_override("separation", 10 * EDSCALE); first_vb->add_child(memnew(Label("Label"))); first_vb->add_child(memnew(Button("Button"))); + Button *bt = memnew(Button); + bt->set_text(TTR("Toggle Button")); + bt->set_toggle_mode(true); + bt->set_pressed(true); + first_vb->add_child(bt); + bt = memnew(Button); + bt->set_text(TTR("Disabled Button")); + bt->set_disabled(true); + first_vb->add_child(bt); ToolButton *tb = memnew(ToolButton); tb->set_text("ToolButton"); first_vb->add_child(tb); + CheckButton *cb = memnew(CheckButton); cb->set_text("CheckButton"); first_vb->add_child(cb); + cb = memnew(CheckButton); CheckBox *cbx = memnew(CheckBox); cbx->set_text("CheckBox"); first_vb->add_child(cbx); - VBoxContainer *bg = memnew(VBoxContainer); - bg->set_v_size_flags(SIZE_EXPAND_FILL); - VBoxContainer *gbvb = memnew(VBoxContainer); - gbvb->set_v_size_flags(SIZE_EXPAND_FILL); - CheckBox *rbx1 = memnew(CheckBox); - rbx1->set_text(TTR("CheckBox Radio1")); - rbx1->set_pressed(true); - gbvb->add_child(rbx1); - CheckBox *rbx2 = memnew(CheckBox); - rbx2->set_text(TTR("CheckBox Radio2")); - gbvb->add_child(rbx2); - bg->add_child(gbvb); - first_vb->add_child(bg); - MenuButton *test_menu_button = memnew(MenuButton); test_menu_button->set_text("MenuButton"); test_menu_button->get_popup()->add_item(TTR("Item")); + test_menu_button->get_popup()->add_item(TTR("Disabled Item")); + test_menu_button->get_popup()->set_item_disabled(1, true); test_menu_button->get_popup()->add_separator(); test_menu_button->get_popup()->add_check_item(TTR("Check Item")); test_menu_button->get_popup()->add_check_item(TTR("Checked Item")); @@ -696,6 +701,14 @@ ThemeEditor::ThemeEditor() { test_menu_button->get_popup()->add_radio_check_item(TTR("Radio Item")); test_menu_button->get_popup()->add_radio_check_item(TTR("Checked Radio Item")); test_menu_button->get_popup()->set_item_checked(6, true); + test_menu_button->get_popup()->add_separator(TTR("Named Sep.")); + + PopupMenu *test_submenu = memnew(PopupMenu); + test_menu_button->get_popup()->add_child(test_submenu); + test_submenu->set_name("submenu"); + test_menu_button->get_popup()->add_submenu_item(TTR("Submenu"), "submenu"); + test_submenu->add_item(TTR("Item 1")); + test_submenu->add_item(TTR("Item 2")); first_vb->add_child(test_menu_button); OptionButton *test_option_button = memnew(OptionButton); @@ -705,21 +718,7 @@ ThemeEditor::ThemeEditor() { test_option_button->add_item(TTR("Many")); test_option_button->add_item(TTR("Options")); first_vb->add_child(test_option_button); - - ColorPickerButton *cpb = memnew(ColorPickerButton); - first_vb->add_child(cpb); - - first_vb->add_child(memnew(HSeparator)); - first_vb->add_child(memnew(HSlider)); - first_vb->add_child(memnew(HScrollBar)); - first_vb->add_child(memnew(SpinBox)); - ProgressBar *pb = memnew(ProgressBar); - pb->set_value(50); - first_vb->add_child(pb); - Panel *pn = memnew(Panel); - pn->set_custom_minimum_size(Size2(40, 40) * EDSCALE); - first_vb->add_child(pn); - first_vb->add_constant_override("separation", 10 * EDSCALE); + first_vb->add_child(memnew(ColorPickerButton)); VBoxContainer *second_vb = memnew(VBoxContainer); second_vb->set_h_size_flags(SIZE_EXPAND_FILL); @@ -728,50 +727,48 @@ ThemeEditor::ThemeEditor() { LineEdit *le = memnew(LineEdit); le->set_text("LineEdit"); second_vb->add_child(le); + le = memnew(LineEdit); + le->set_text(TTR("Disabled LineEdit")); + le->set_editable(false); + second_vb->add_child(le); TextEdit *te = memnew(TextEdit); te->set_text("TextEdit"); - //te->set_v_size_flags(SIZE_EXPAND_FILL); - te->set_custom_minimum_size(Size2(0, 160) * EDSCALE); + te->set_custom_minimum_size(Size2(0, 100) * EDSCALE); second_vb->add_child(te); + second_vb->add_child(memnew(SpinBox)); - Tree *test_tree = memnew(Tree); - second_vb->add_child(test_tree); - test_tree->set_custom_minimum_size(Size2(0, 160) * EDSCALE); - - TreeItem *item = test_tree->create_item(); - item->set_editable(0, true); - item->set_text(0, "Tree"); - item = test_tree->create_item(test_tree->get_root()); - item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); - item->set_editable(0, true); - item->set_text(0, "Check"); - item = test_tree->create_item(test_tree->get_root()); - item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); - item->set_editable(0, true); - item->set_range_config(0, 0, 20, 0.1); - item->set_range(0, 2); - item = test_tree->create_item(test_tree->get_root()); - item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); - item->set_editable(0, true); - item->set_text(0, TTR("Has,Many,Options")); - item->set_range(0, 2); + HBoxContainer *vhb = memnew(HBoxContainer); + second_vb->add_child(vhb); + vhb->set_custom_minimum_size(Size2(0, 100) * EDSCALE); + vhb->add_child(memnew(VSlider)); + VScrollBar *vsb = memnew(VScrollBar); + vsb->set_page(25); + vhb->add_child(vsb); + vhb->add_child(memnew(VSeparator)); + VBoxContainer *hvb = memnew(VBoxContainer); + vhb->add_child(hvb); + hvb->set_alignment(ALIGN_CENTER); + hvb->set_h_size_flags(SIZE_EXPAND_FILL); + hvb->add_child(memnew(HSlider)); + HScrollBar *hsb = memnew(HScrollBar); + hsb->set_page(25); + hvb->add_child(hsb); + HSlider *hs = memnew(HSlider); + hs->set_editable(false); + hvb->add_child(hs); + hvb->add_child(memnew(HSeparator)); + ProgressBar *pb = memnew(ProgressBar); + pb->set_value(50); + hvb->add_child(pb); VBoxContainer *third_vb = memnew(VBoxContainer); third_vb->set_h_size_flags(SIZE_EXPAND_FILL); - third_vb->add_constant_override("separation", 10); - + third_vb->add_constant_override("separation", 10 * EDSCALE); main_hb->add_child(third_vb); - HBoxContainer *vhb = memnew(HBoxContainer); - vhb->set_custom_minimum_size(Size2(0, 160) * EDSCALE); - vhb->add_child(memnew(VSeparator)); - vhb->add_child(memnew(VSlider)); - vhb->add_child(memnew(VScrollBar)); - third_vb->add_child(vhb); - TabContainer *tc = memnew(TabContainer); third_vb->add_child(tc); - tc->set_custom_minimum_size(Size2(0, 160) * EDSCALE); + tc->set_custom_minimum_size(Size2(0, 135) * EDSCALE); Control *tcc = memnew(Control); tcc->set_name(TTR("Tab 1")); tc->add_child(tcc); @@ -781,9 +778,41 @@ ThemeEditor::ThemeEditor() { tcc = memnew(Control); tcc->set_name(TTR("Tab 3")); tc->add_child(tcc); + tc->set_tab_disabled(2, true); + + Tree *test_tree = memnew(Tree); + third_vb->add_child(test_tree); + test_tree->set_custom_minimum_size(Size2(0, 175) * EDSCALE); + test_tree->add_constant_override("draw_relationship_lines", 1); + + TreeItem *item = test_tree->create_item(); + item->set_text(0, "Tree"); + item = test_tree->create_item(test_tree->get_root()); + item->set_text(0, "Item"); + item = test_tree->create_item(test_tree->get_root()); + item->set_editable(0, true); + item->set_text(0, TTR("Editable Item")); + TreeItem *sub_tree = test_tree->create_item(test_tree->get_root()); + sub_tree->set_text(0, TTR("Subtree")); + item = test_tree->create_item(sub_tree); + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_editable(0, true); + item->set_text(0, "Check Item"); + item = test_tree->create_item(sub_tree); + item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); + item->set_editable(0, true); + item->set_range_config(0, 0, 20, 0.1); + item->set_range(0, 2); + item = test_tree->create_item(sub_tree); + item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE); + item->set_editable(0, true); + item->set_text(0, TTR("Has,Many,Options")); + item->set_range(0, 2); main_hb->add_constant_override("separation", 20 * EDSCALE); + //////// + add_del_dialog = memnew(ConfirmationDialog); add_del_dialog->hide(); add_child(add_del_dialog); @@ -802,6 +831,7 @@ ThemeEditor::ThemeEditor() { type_edit->set_h_size_flags(SIZE_EXPAND_FILL); type_hbc->add_child(type_edit); type_menu = memnew(MenuButton); + type_menu->set_flat(false); type_menu->set_text(".."); type_hbc->add_child(type_menu); @@ -819,6 +849,7 @@ ThemeEditor::ThemeEditor() { name_edit->set_h_size_flags(SIZE_EXPAND_FILL); name_hbc->add_child(name_edit); name_menu = memnew(MenuButton); + type_menu->set_flat(false); name_menu->set_text(".."); name_hbc->add_child(name_menu); @@ -844,9 +875,6 @@ ThemeEditor::ThemeEditor() { file_dialog->add_filter("*.theme ; Theme File"); add_child(file_dialog); file_dialog->connect("file_selected", this, "_save_template_cbk"); - - //MenuButton *name_menu; - //LineEdit *name_edit; } void ThemeEditorPlugin::edit(Object *p_node) { @@ -886,7 +914,6 @@ ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) { theme_editor = memnew(ThemeEditor); theme_editor->set_custom_minimum_size(Size2(0, 200)); - //p_node->get_viewport()->add_child(theme_editor); button = editor->add_bottom_panel_item(TTR("Theme"), theme_editor); button->hide(); } diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h index 352988d69e..cc236907a9 100644 --- a/editor/plugins/theme_editor_plugin.h +++ b/editor/plugins/theme_editor_plugin.h @@ -33,6 +33,7 @@ #include "scene/gui/check_box.h" #include "scene/gui/file_dialog.h" +#include "scene/gui/margin_container.h" #include "scene/gui/option_button.h" #include "scene/gui/scroll_container.h" #include "scene/gui/texture_rect.h" @@ -40,12 +41,12 @@ #include "editor/editor_node.h" -class ThemeEditor : public Control { +class ThemeEditor : public VBoxContainer { - GDCLASS(ThemeEditor, Control); + GDCLASS(ThemeEditor, VBoxContainer); ScrollContainer *scroll; - VBoxContainer *main_vb; + MarginContainer *main_container; Ref<Theme> theme; EditorFileDialog *file_dialog; diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 33e4bb2336..abb52f8359 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -66,6 +66,11 @@ void TileMapEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { + paint_button->set_icon(get_icon("Edit", "EditorIcons")); + bucket_fill_button->set_icon(get_icon("Bucket", "EditorIcons")); + picker_button->set_icon(get_icon("ColorPick", "EditorIcons")); + select_button->set_icon(get_icon("ActionCopy", "EditorIcons")); + rotate_left_button->set_icon(get_icon("Rotate270", "EditorIcons")); rotate_right_button->set_icon(get_icon("Rotate90", "EditorIcons")); flip_horizontal_button->set_icon(get_icon("MirrorX", "EditorIcons")); @@ -76,9 +81,6 @@ void TileMapEditor::_notification(int p_what) { search_box->set_clear_button_enabled(true); PopupMenu *p = options->get_popup(); - p->set_item_icon(p->get_item_index(OPTION_PAINTING), get_icon("Edit", "EditorIcons")); - p->set_item_icon(p->get_item_index(OPTION_PICK_TILE), get_icon("ColorPick", "EditorIcons")); - p->set_item_icon(p->get_item_index(OPTION_SELECT), get_icon("ActionCopy", "EditorIcons")); p->set_item_icon(p->get_item_index(OPTION_CUT), get_icon("ActionCut", "EditorIcons")); p->set_item_icon(p->get_item_index(OPTION_COPY), get_icon("Duplicate", "EditorIcons")); p->set_item_icon(p->get_item_index(OPTION_ERASE_SELECTION), get_icon("Remove", "EditorIcons")); @@ -87,37 +89,51 @@ void TileMapEditor::_notification(int p_what) { } } -void TileMapEditor::_menu_option(int p_option) { +void TileMapEditor::_update_button_tool() { - switch (p_option) { - - case OPTION_PAINTING: { - // NOTE: We do not set tool = TOOL_PAINTING as this begins painting - // immediately without pressing the left mouse button first - tool = TOOL_NONE; - - CanvasItemEditor::get_singleton()->update_viewport(); + ToolButton *tb[4] = { paint_button, bucket_fill_button, picker_button, select_button }; + // Unpress all buttons + for (int i = 0; i < 4; i++) { + tb[i]->set_pressed(false); + } + // Press the good button + switch (tool) { + case TOOL_NONE: + case TOOL_PAINTING: { + paint_button->set_pressed(true); } break; - case OPTION_BUCKET: { - - tool = TOOL_BUCKET; - - CanvasItemEditor::get_singleton()->update_viewport(); + case TOOL_BUCKET: { + bucket_fill_button->set_pressed(true); } break; - case OPTION_PICK_TILE: { + case TOOL_PICKING: { + picker_button->set_pressed(true); + } break; + case TOOL_SELECTING: { + select_button->set_pressed(true); + } break; + default: + break; + } +} - tool = TOOL_PICKING; +void TileMapEditor::_button_tool_select(int p_tool) { + tool = (Tool)p_tool; + _update_button_tool(); + switch (tool) { + case TOOL_SELECTING: { - CanvasItemEditor::get_singleton()->update_viewport(); + selection_active = false; } break; - case OPTION_SELECT: { + default: + break; + } + CanvasItemEditor::get_singleton()->update_viewport(); +} - tool = TOOL_SELECTING; - selection_active = false; +void TileMapEditor::_menu_option(int p_option) { - CanvasItemEditor::get_singleton()->update_viewport(); - } break; + switch (p_option) { case OPTION_COPY: { _update_copydata(); @@ -168,6 +184,7 @@ void TileMapEditor::_menu_option(int p_option) { } } break; } + _update_button_tool(); } void TileMapEditor::_palette_selected(int index) { @@ -944,6 +961,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { selection_active = false; rectangle_begin = over_tile; + _update_button_tool(); return true; } #ifdef APPLE_STYLE_KEYS @@ -953,11 +971,13 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { #endif tool = TOOL_PICKING; _pick_tile(over_tile); + _update_button_tool(); return true; } tool = TOOL_PAINTING; + _update_button_tool(); } if (tool == TOOL_PAINTING) { @@ -979,6 +999,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { rectangle_begin = over_tile; } + _update_button_tool(); return true; } else { @@ -1075,6 +1096,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } tool = TOOL_NONE; + _update_button_tool(); return true; } @@ -1090,6 +1112,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } @@ -1100,6 +1123,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } @@ -1130,6 +1154,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { _set_cell(local, invalid_cell); } + _update_button_tool(); return true; } @@ -1144,6 +1169,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { tool = TOOL_NONE; + _update_button_tool(); return true; } else if (tool == TOOL_BUCKET) { @@ -1329,6 +1355,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } @@ -1343,17 +1370,20 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { tool = TOOL_NONE; CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } if (ED_IS_SHORTCUT("tile_map_editor/bucket_fill", p_event)) { tool = TOOL_BUCKET; CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } if (ED_IS_SHORTCUT("tile_map_editor/erase_selection", p_event)) { _menu_option(OPTION_ERASE_SELECTION); + _update_button_tool(); return true; } if (ED_IS_SHORTCUT("tile_map_editor/select", p_event)) { @@ -1362,6 +1392,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } if (ED_IS_SHORTCUT("tile_map_editor/copy_selection", p_event)) { @@ -1372,6 +1403,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } } @@ -1388,6 +1420,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { tool = TOOL_PASTING; CanvasItemEditor::get_singleton()->update_viewport(); + _update_button_tool(); return true; } } @@ -1700,6 +1733,7 @@ void TileMapEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_text_entered"), &TileMapEditor::_text_entered); ClassDB::bind_method(D_METHOD("_text_changed"), &TileMapEditor::_text_changed); ClassDB::bind_method(D_METHOD("_sbox_input"), &TileMapEditor::_sbox_input); + ClassDB::bind_method(D_METHOD("_button_tool_select"), &TileMapEditor::_button_tool_select); ClassDB::bind_method(D_METHOD("_menu_option"), &TileMapEditor::_menu_option); ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"), &TileMapEditor::_canvas_mouse_enter); ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"), &TileMapEditor::_canvas_mouse_exit); @@ -1880,37 +1914,65 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) { // Add menu items toolbar = memnew(HBoxContainer); - toolbar->set_h_size_flags(SIZE_EXPAND_FILL); - toolbar->set_alignment(BoxContainer::ALIGN_END); toolbar->hide(); CanvasItemEditor::get_singleton()->add_control_to_menu_panel(toolbar); + // Separator + toolbar->add_child(memnew(VSeparator)); + + // Tools + paint_button = memnew(ToolButton); + paint_button->set_shortcut(ED_SHORTCUT("tile_map_editor/paint_tile", TTR("Paint Tile"), KEY_P)); + paint_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_NONE)); + paint_button->set_toggle_mode(true); + toolbar->add_child(paint_button); + + bucket_fill_button = memnew(ToolButton); + bucket_fill_button->set_shortcut(ED_SHORTCUT("tile_map_editor/bucket_fill", TTR("Bucket Fill"), KEY_G)); + bucket_fill_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_BUCKET)); + bucket_fill_button->set_toggle_mode(true); + toolbar->add_child(bucket_fill_button); + + picker_button = memnew(ToolButton); + picker_button->set_shortcut(ED_SHORTCUT("tile_map_editor/pick_tile", TTR("Pick Tile"), KEY_CONTROL)); + picker_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_PICKING)); + picker_button->set_toggle_mode(true); + toolbar->add_child(picker_button); + + select_button = memnew(ToolButton); + select_button->set_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_MASK_CMD + KEY_B)); + select_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_SELECTING)); + select_button->set_toggle_mode(true); + toolbar->add_child(select_button); + + _update_button_tool(); + + // Container to the right of the toolbar + toolbar_right = memnew(HBoxContainer); + toolbar_right->hide(); + toolbar_right->set_h_size_flags(SIZE_EXPAND_FILL); + toolbar_right->set_alignment(BoxContainer::ALIGN_END); + CanvasItemEditor::get_singleton()->add_control_to_menu_panel(toolbar_right); + // Tile position tile_info = memnew(Label); - toolbar->add_child(tile_info); + toolbar_right->add_child(tile_info); + // Menu options = memnew(MenuButton); options->set_text("TileMap"); options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("TileMap", "EditorIcons")); options->set_process_unhandled_key_input(false); + toolbar_right->add_child(options); PopupMenu *p = options->get_popup(); - - p->add_shortcut(ED_SHORTCUT("tile_map_editor/paint_tile", TTR("Paint Tile"), KEY_P), OPTION_PAINTING); - p->add_shortcut(ED_SHORTCUT("tile_map_editor/bucket_fill", TTR("Bucket Fill"), KEY_G), OPTION_BUCKET); - p->add_separator(); - p->add_item(TTR("Pick Tile"), OPTION_PICK_TILE, KEY_CONTROL); - p->add_separator(); - p->add_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_MASK_CMD + KEY_B), OPTION_SELECT); p->add_shortcut(ED_SHORTCUT("tile_map_editor/cut_selection", TTR("Cut Selection"), KEY_MASK_CMD + KEY_X), OPTION_CUT); p->add_shortcut(ED_SHORTCUT("tile_map_editor/copy_selection", TTR("Copy Selection"), KEY_MASK_CMD + KEY_C), OPTION_COPY); p->add_shortcut(ED_GET_SHORTCUT("tile_map_editor/erase_selection"), OPTION_ERASE_SELECTION); p->add_separator(); p->add_item(TTR("Fix Invalid Tiles"), OPTION_FIX_INVALID); - p->connect("id_pressed", this, "_menu_option"); - toolbar->add_child(options); rotate_left_button = memnew(ToolButton); rotate_left_button->set_tooltip(TTR("Rotate left")); rotate_left_button->set_focus_mode(FOCUS_NONE); @@ -1984,10 +2046,12 @@ void TileMapEditorPlugin::make_visible(bool p_visible) { tile_map_editor->show(); tile_map_editor->get_toolbar()->show(); + tile_map_editor->get_toolbar_right()->show(); } else { tile_map_editor->hide(); tile_map_editor->get_toolbar()->hide(); + tile_map_editor->get_toolbar_right()->hide(); tile_map_editor->edit(NULL); } } diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h index b30426eabe..3bc10861f0 100644 --- a/editor/plugins/tile_map_editor_plugin.h +++ b/editor/plugins/tile_map_editor_plugin.h @@ -66,12 +66,8 @@ class TileMapEditor : public VBoxContainer { enum Options { - OPTION_BUCKET, - OPTION_PICK_TILE, - OPTION_SELECT, OPTION_COPY, OPTION_ERASE_SELECTION, - OPTION_PAINTING, OPTION_FIX_INVALID, OPTION_CUT }; @@ -90,10 +86,16 @@ class TileMapEditor : public VBoxContainer { ItemList *manual_palette; HBoxContainer *toolbar; + HBoxContainer *toolbar_right; Label *tile_info; MenuButton *options; + ToolButton *paint_button; + ToolButton *bucket_fill_button; + ToolButton *picker_button; + ToolButton *select_button; + ToolButton *flip_horizontal_button; ToolButton *flip_vertical_button; ToolButton *rotate_left_button; @@ -184,6 +186,8 @@ class TileMapEditor : public VBoxContainer { void _text_changed(const String &p_text); void _sbox_input(const Ref<InputEvent> &p_ie); void _update_palette(); + void _update_button_tool(); + void _button_tool_select(int p_tool); void _menu_option(int p_option); void _palette_selected(int index); void _palette_multi_selected(int index, bool selected); @@ -210,6 +214,7 @@ protected: public: HBoxContainer *get_toolbar() const { return toolbar; } + HBoxContainer *get_toolbar_right() const { return toolbar_right; } bool forward_gui_input(const Ref<InputEvent> &p_event); void forward_canvas_draw_over_viewport(Control *p_overlay); diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index 8cf00cf67d..21470d81ed 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -1561,13 +1561,42 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { _set_edited_collision_shape(Ref<ConvexPolygonShape2D>()); current_shape.resize(0); - current_shape.push_back(snap_point(shape_anchor)); - current_shape.push_back(snap_point(shape_anchor + Vector2(current_tile_region.size.x, 0))); - current_shape.push_back(snap_point(shape_anchor + current_tile_region.size)); - current_shape.push_back(snap_point(shape_anchor + Vector2(0, current_tile_region.size.y))); - close_shape(shape_anchor); + Vector2 pos = mb->get_position(); + pos = snap_point(pos); + current_shape.push_back(pos); + current_shape.push_back(pos); + current_shape.push_back(pos); + current_shape.push_back(pos); + creating_shape = true; workspace->update(); + return; } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (creating_shape) { + creating_shape = false; + _select_edited_shape_coord(); + workspace->update(); + } + } else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (creating_shape) { + if ((current_shape[0] - current_shape[1]).length_squared() <= grab_threshold) { + current_shape.set(0, snap_point(shape_anchor)); + current_shape.set(1, snap_point(shape_anchor + Vector2(current_tile_region.size.x, 0))); + current_shape.set(2, snap_point(shape_anchor + current_tile_region.size)); + current_shape.set(3, snap_point(shape_anchor + Vector2(0, current_tile_region.size.y))); + } + close_shape(shape_anchor); + workspace->update(); + return; + } + } + } else if (mm.is_valid()) { + if (creating_shape) { + Vector2 pos = mm->get_position(); + pos = snap_point(pos); + Vector2 p = current_shape[2]; + current_shape.set(3, snap_point(Vector2(pos.x, p.y))); + current_shape.set(0, snap_point(pos)); + current_shape.set(1, snap_point(Vector2(p.x, pos.y))); workspace->update(); } } diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 0aba7f3d15..964303ba22 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -172,6 +172,7 @@ void VisualShaderEditor::_update_options_menu() { int item_count = 0; int item_count2 = 0; + bool is_first_item = true; for (int i = 0; i < add_options.size() + 1; i++) { @@ -197,6 +198,7 @@ void VisualShaderEditor::_update_options_menu() { prev_sub_category = ""; category = members->create_item(root); category->set_text(0, add_options[i].category); + category->set_selectable(0, false); if (!use_filter) category->set_collapsed(true); } @@ -212,6 +214,7 @@ void VisualShaderEditor::_update_options_menu() { item_count2 = 0; sub_category = members->create_item(category); sub_category->set_text(0, add_options[i].sub_category); + sub_category->set_selectable(0, false); if (!use_filter) sub_category->set_collapsed(true); } @@ -221,6 +224,10 @@ void VisualShaderEditor::_update_options_menu() { ++item_count2; TreeItem *item = members->create_item(sub_category); item->set_text(0, add_options[i].name); + if (is_first_item) { + item->select(0); + is_first_item = false; + } switch (add_options[i].return_type) { case VisualShaderNode::PORT_TYPE_SCALAR: item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_icon("float", "EditorIcons")); @@ -303,6 +310,21 @@ static Ref<StyleBoxEmpty> make_empty_stylebox(float p_margin_left = -1, float p_ return style; } +void VisualShaderEditor::_update_created_node(GraphNode *node) { + + if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) { + Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode"); + Color c = sb->get_border_color(); + Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0); + mono_color.a = 0.85; + c = mono_color; + + node->add_color_override("title_color", c); + c.a = 0.7; + node->add_color_override("close_color", c); + } +} + void VisualShaderEditor::_update_graph() { if (updating) @@ -344,7 +366,6 @@ void VisualShaderEditor::_update_graph() { Ref<VisualShaderNode> vsnode = visual_shader->get_node(type, nodes[n_i]); GraphNode *node = memnew(GraphNode); - graph->add_child(node); /*if (!vsnode->is_connected("changed", this, "_node_changed")) { vsnode->connect("changed", this, "_node_changed", varray(vsnode->get_instance_id()), CONNECT_DEFERRED); @@ -367,6 +388,9 @@ void VisualShaderEditor::_update_graph() { Ref<VisualShaderNodeUniform> uniform = vsnode; if (uniform.is_valid()) { + graph->add_child(node); + _update_created_node(node); + LineEdit *uniform_name = memnew(LineEdit); uniform_name->set_text(uniform->get_uniform_name()); node->add_child(uniform_name); @@ -484,7 +508,7 @@ void VisualShaderEditor::_update_graph() { } } - if (valid_right && edit_type->get_selected() == VisualShader::TYPE_FRAGMENT) { + if (valid_right && edit_type->get_selected() == VisualShader::TYPE_FRAGMENT && port_right != VisualShaderNode::PORT_TYPE_TRANSFORM) { TextureButton *preview = memnew(TextureButton); preview->set_toggle_mode(true); preview->set_normal_texture(get_icon("GuiVisibilityHidden", "EditorIcons")); @@ -502,21 +526,9 @@ void VisualShaderEditor::_update_graph() { node->add_child(hb); node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], valid_right, port_right, type_color[port_right]); - - if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) { - Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode"); - Color c = sb->get_border_color(); - Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0); - mono_color.a = 0.85; - c = mono_color; - - node->add_color_override("title_color", c); - c.a = 0.7; - node->add_color_override("close_color", c); - } } - if (vsnode->get_output_port_for_preview() >= 0) { + if (vsnode->get_output_port_for_preview() >= 0 && vsnode->get_output_port_type(vsnode->get_output_port_for_preview()) != VisualShaderNode::PORT_TYPE_TRANSFORM) { VisualShaderNodePortPreview *port_preview = memnew(VisualShaderNodePortPreview); port_preview->setup(visual_shader, type, nodes[n_i], vsnode->get_output_port_for_preview()); port_preview->set_h_size_flags(SIZE_SHRINK_CENTER); @@ -530,6 +542,11 @@ void VisualShaderEditor::_update_graph() { error_label->set_text(error); node->add_child(error_label); } + + if (!uniform.is_valid()) { + graph->add_child(node); + _update_created_node(node); + } } for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) { @@ -750,7 +767,6 @@ void VisualShaderEditor::_connection_request(const String &p_from, int p_from_in int to = p_to.to_int(); if (!visual_shader->can_connect_nodes(type, from, p_from_index, to, p_to_index)) { - EditorNode::get_singleton()->show_warning(TTR("Unable to connect, port may be in use or connection may be invalid.")); return; } @@ -833,40 +849,56 @@ void VisualShaderEditor::_node_selected(Object *p_node) { //EditorNode::get_singleton()->push_item(vsnode.ptr(), "", true); } -void VisualShaderEditor::_member_gui_input(const Ref<InputEvent> p_event) { +void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> p_event) { + Ref<InputEventMouseButton> mb = p_event; - Ref<InputEventKey> key = p_event; - if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && mb->is_doubleclick()) { - _member_create(); - } - } else if (key.is_valid()) { - if (key->is_pressed() && key->get_scancode() == KEY_ENTER) { - _member_create(); - } - } + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) + _show_members_dialog(true); } -void VisualShaderEditor::_input(const Ref<InputEvent> p_event) { - if (graph->has_focus()) { - Ref<InputEventMouseButton> mb = p_event; +void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) { - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { - saved_node_pos_dirty = true; - saved_node_pos = graph->get_local_mouse_position(); + members_dialog->popup(); - Point2 gpos = Input::get_singleton()->get_mouse_position(); - members_dialog->popup(); - members_dialog->set_position(gpos); - } + if (at_mouse_pos) { + saved_node_pos_dirty = true; + saved_node_pos = graph->get_local_mouse_position(); + + Point2 gpos = Input::get_singleton()->get_mouse_position(); + members_dialog->popup(); + members_dialog->set_position(gpos); + } else { + saved_node_pos_dirty = false; + members_dialog->set_position(graph->get_global_position() + Point2(5 * EDSCALE, 65 * EDSCALE)); + } + + // keep dialog within window bounds + Size2 window_size = OS::get_singleton()->get_window_size(); + Rect2 dialog_rect = members_dialog->get_global_rect(); + if (dialog_rect.position.y + dialog_rect.size.y > window_size.y) { + int difference = dialog_rect.position.y + dialog_rect.size.y - window_size.y; + members_dialog->set_position(members_dialog->get_position() - Point2(0, difference)); + } + if (dialog_rect.position.x + dialog_rect.size.x > window_size.x) { + int difference = dialog_rect.position.x + dialog_rect.size.x - window_size.x; + members_dialog->set_position(members_dialog->get_position() - Point2(difference, 0)); } + + node_filter->call_deferred("grab_focus"); // still not visible + node_filter->select_all(); } -void VisualShaderEditor::_show_members_dialog() { - saved_node_pos_dirty = false; - members_dialog->popup(); - members_dialog->set_position(graph->get_global_position() + Point2(5 * EDSCALE, 65 * EDSCALE)); +void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) { + Ref<InputEventKey> ie = p_ie; + if (ie.is_valid() && (ie->get_scancode() == KEY_UP || + ie->get_scancode() == KEY_DOWN || + ie->get_scancode() == KEY_ENTER || + ie->get_scancode() == KEY_KP_ENTER)) { + + members->call("_gui_input", ie); + node_filter->accept_event(); + } } void VisualShaderEditor::_notification(int p_what) { @@ -1238,7 +1270,7 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_mode_selected", &VisualShaderEditor::_mode_selected); ClassDB::bind_method("_input_select_item", &VisualShaderEditor::_input_select_item); ClassDB::bind_method("_preview_select_port", &VisualShaderEditor::_preview_select_port); - ClassDB::bind_method("_input", &VisualShaderEditor::_input); + ClassDB::bind_method("_graph_gui_input", &VisualShaderEditor::_graph_gui_input); ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw); ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw); @@ -1247,7 +1279,7 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_is_available", &VisualShaderEditor::_is_available); ClassDB::bind_method("_tools_menu_option", &VisualShaderEditor::_tools_menu_option); ClassDB::bind_method("_show_members_dialog", &VisualShaderEditor::_show_members_dialog); - ClassDB::bind_method("_member_gui_input", &VisualShaderEditor::_member_gui_input); + ClassDB::bind_method("_sbox_input", &VisualShaderEditor::_sbox_input); ClassDB::bind_method("_member_filter_changed", &VisualShaderEditor::_member_filter_changed); ClassDB::bind_method("_member_selected", &VisualShaderEditor::_member_selected); ClassDB::bind_method("_member_unselected", &VisualShaderEditor::_member_unselected); @@ -1278,6 +1310,7 @@ VisualShaderEditor::VisualShaderEditor() { graph->connect("scroll_offset_changed", this, "_scroll_changed"); graph->connect("duplicate_nodes_request", this, "_duplicate_nodes"); graph->connect("delete_nodes_request", this, "_on_nodes_delete"); + graph->connect("gui_input", this, "_graph_gui_input"); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_BOOLEAN); @@ -1306,7 +1339,7 @@ VisualShaderEditor::VisualShaderEditor() { graph->get_zoom_hbox()->add_child(add_node); add_node->set_text(TTR("Add Node...")); graph->get_zoom_hbox()->move_child(add_node, 0); - add_node->connect("pressed", this, "_show_members_dialog"); + add_node->connect("pressed", this, "_show_members_dialog", varray(false)); /////////////////////////////////////// // SHADER NODES TREE @@ -1321,6 +1354,7 @@ VisualShaderEditor::VisualShaderEditor() { node_filter = memnew(LineEdit); filter_hb->add_child(node_filter); node_filter->connect("text_changed", this, "_member_filter_changed"); + node_filter->connect("gui_input", this, "_sbox_input"); node_filter->set_h_size_flags(SIZE_EXPAND_FILL); node_filter->set_placeholder(TTR("Search")); @@ -1340,9 +1374,9 @@ VisualShaderEditor::VisualShaderEditor() { members->set_allow_reselect(true); members->set_hide_folding(false); members->set_custom_minimum_size(Size2(180 * EDSCALE, 200 * EDSCALE)); + members->connect("item_activated", this, "_member_create"); members->connect("item_selected", this, "_member_selected"); members->connect("nothing_selected", this, "_member_unselected"); - members->connect("gui_input", this, "_member_gui_input"); Label *desc_label = memnew(Label); members_vb->add_child(desc_label); @@ -1827,9 +1861,9 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<VisualShaderNode if (Object::cast_to<EditorPropertyResource>(prop)) { Object::cast_to<EditorPropertyResource>(prop)->set_use_sub_inspector(false); prop->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); - } else if (Object::cast_to<EditorPropertyTransform>(prop)) { + } else if (Object::cast_to<EditorPropertyTransform>(prop) || Object::cast_to<EditorPropertyVector3>(prop)) { prop->set_custom_minimum_size(Size2(250 * EDSCALE, 0)); - } else if (Object::cast_to<EditorPropertyFloat>(prop) || Object::cast_to<EditorPropertyVector3>(prop)) { + } else if (Object::cast_to<EditorPropertyFloat>(prop)) { prop->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); } else if (Object::cast_to<EditorPropertyEnum>(prop)) { prop->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 4b0b48ad92..35041da2bd 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -85,7 +85,7 @@ class VisualShaderEditor : public VBoxContainer { RichTextLabel *node_desc; void _tools_menu_option(int p_idx); - void _show_members_dialog(); + void _show_members_dialog(bool at_mouse_pos); void _update_graph(); @@ -166,10 +166,10 @@ class VisualShaderEditor : public VBoxContainer { void _input_select_item(Ref<VisualShaderNodeInput> input, String name); void _preview_select_port(int p_node, int p_port); - void _input(const Ref<InputEvent> p_event); + void _graph_gui_input(const Ref<InputEvent> p_event); - void _member_gui_input(const Ref<InputEvent> p_event); void _member_filter_changed(const String &p_text); + void _sbox_input(const Ref<InputEvent> &p_ie); void _member_selected(); void _member_unselected(); void _member_create(); @@ -179,6 +179,7 @@ class VisualShaderEditor : public VBoxContainer { void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); bool _is_available(int p_flags); + void _update_created_node(GraphNode *node); protected: void _notification(int p_what); diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp index 5fdc725f50..8dac5fa6b5 100644 --- a/editor/progress_dialog.cpp +++ b/editor/progress_dialog.cpp @@ -161,6 +161,7 @@ void ProgressDialog::_popup() { main->set_margin(MARGIN_TOP, style->get_margin(MARGIN_TOP)); main->set_margin(MARGIN_BOTTOM, -style->get_margin(MARGIN_BOTTOM)); + raise(); popup_centered(ms); } @@ -220,6 +221,7 @@ bool ProgressDialog::task_step(const String &p_task, const String &p_state, int if (cancel_hb->is_visible()) { OS::get_singleton()->force_process_input(); } + Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor return cancelled; } diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 82a6a07805..b9cf7ec10a 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -631,6 +631,7 @@ void ProjectExportDialog::_delete_preset_confirm() { int idx = presets->get_current(); _edit_preset(-1); + export_button->set_disabled(true); EditorExport::get_singleton()->remove_export_preset(idx); _update_presets(); } @@ -931,7 +932,7 @@ void ProjectExportDialog::_export_project() { Ref<EditorExportPlatform> platform = current->get_platform(); ERR_FAIL_COND(platform.is_null()); - export_project->set_access(FileDialog::ACCESS_FILESYSTEM); + export_project->set_access(EditorFileDialog::ACCESS_FILESYSTEM); export_project->clear_filters(); List<String> extension_list = platform->get_binary_extensions(current); @@ -955,7 +956,7 @@ void ProjectExportDialog::_export_project() { export_project->get_line_edit()->connect("text_entered", export_project, "_file_entered"); } - export_project->set_mode(FileDialog::MODE_SAVE_FILE); + export_project->set_mode(EditorFileDialog::MODE_SAVE_FILE); export_project->popup_centered_ratio(); } @@ -1184,9 +1185,9 @@ ProjectExportDialog::ProjectExportDialog() { patches_hb->add_child(patch_export); patches_hb->add_spacer(); - patch_dialog = memnew(FileDialog); + patch_dialog = memnew(EditorFileDialog); patch_dialog->add_filter("*.pck ; Pack File"); - patch_dialog->set_mode(FileDialog::MODE_OPEN_FILE); + patch_dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE); patch_dialog->connect("file_selected", this, "_patch_selected"); add_child(patch_dialog); @@ -1266,11 +1267,11 @@ ProjectExportDialog::ProjectExportDialog() { export_all_button->connect("pressed", this, "_export_all_dialog"); export_all_button->set_disabled(true); - export_pck_zip = memnew(FileDialog); + export_pck_zip = memnew(EditorFileDialog); export_pck_zip->add_filter("*.zip ; ZIP File"); export_pck_zip->add_filter("*.pck ; Godot Game Pack"); - export_pck_zip->set_access(FileDialog::ACCESS_FILESYSTEM); - export_pck_zip->set_mode(FileDialog::MODE_SAVE_FILE); + export_pck_zip->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + export_pck_zip->set_mode(EditorFileDialog::MODE_SAVE_FILE); add_child(export_pck_zip); export_pck_zip->connect("file_selected", this, "_export_pck_zip_selected"); @@ -1300,8 +1301,8 @@ ProjectExportDialog::ProjectExportDialog() { export_templates_error->add_child(download_templates); download_templates->connect("pressed", this, "_open_export_template_manager"); - export_project = memnew(FileDialog); - export_project->set_access(FileDialog::ACCESS_FILESYSTEM); + export_project = memnew(EditorFileDialog); + export_project->set_access(EditorFileDialog::ACCESS_FILESYSTEM); add_child(export_project); export_project->connect("file_selected", this, "_export_project_to_path"); export_project->get_line_edit()->connect("text_changed", this, "_validate_export_path"); diff --git a/editor/project_export.h b/editor/project_export.h index f8b6484477..476a30c9c0 100644 --- a/editor/project_export.h +++ b/editor/project_export.h @@ -90,7 +90,7 @@ private: Tree *patches; Button *patch_export; int patch_index; - FileDialog *patch_dialog; + EditorFileDialog *patch_dialog; ConfirmationDialog *patch_erase; Button *export_button; @@ -139,8 +139,8 @@ private: bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); - FileDialog *export_pck_zip; - FileDialog *export_project; + EditorFileDialog *export_pck_zip; + EditorFileDialog *export_project; CheckBox *export_debug; CheckBox *export_pck_zip_debug; diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index bd245d5da9..1dca542138 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -892,10 +892,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { List<Node *>::Element *e = selection.front(); if (e) { Node *node = e->get(); - if (node) { - if (node && node->get_scene_inherited_state().is_valid()) { - scene_tree->emit_signal("open", node->get_scene_inherited_state()->get_path()); - } + if (node && node->get_scene_inherited_state().is_valid()) { + scene_tree->emit_signal("open", node->get_scene_inherited_state()->get_path()); } } } break; @@ -986,6 +984,7 @@ void SceneTreeDock::_notification(int p_what) { SpatialEditorPlugin *spatial_editor_plugin = Object::cast_to<SpatialEditorPlugin>(editor_data->get_editor("3D")); spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree"); + spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", scene_tree, "_update_tree"); button_add->set_icon(get_icon("Add", "EditorIcons")); button_instance->set_icon(get_icon("Instance", "EditorIcons")); @@ -1941,7 +1940,13 @@ void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected) { void SceneTreeDock::import_subscene() { - import_subscene_dialog->popup_centered_ratio(); + Size2 popup_size = Size2(500, 800) * editor_get_scale(); + Size2 window_size = get_viewport_rect().size; + + popup_size.x = MIN(window_size.x * 0.8, popup_size.x); + popup_size.y = MIN(window_size.y * 0.8, popup_size.y); + + import_subscene_dialog->popup_centered(popup_size); } void SceneTreeDock::_import_subscene() { diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index f2d11c2753..62845bfb9b 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -88,12 +88,18 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i } undo_redo->commit_action(); } else if (p_id == BUTTON_LOCK) { + undo_redo->create_action(TTR("Unlock Node")); if (n->is_class("CanvasItem") || n->is_class("Spatial")) { - n->set_meta("_edit_lock_", Variant()); - _update_tree(); - emit_signal("node_changed"); + + undo_redo->add_do_method(n, "remove_meta", "_edit_lock_"); + undo_redo->add_undo_method(n, "set_meta", "_edit_lock_", true); + undo_redo->add_do_method(this, "_update_tree", Variant()); + undo_redo->add_undo_method(this, "_update_tree", Variant()); + undo_redo->add_do_method(this, "emit_signal", "node_changed"); + undo_redo->add_undo_method(this, "emit_signal", "node_changed"); } + undo_redo->commit_action(); } else if (p_id == BUTTON_PIN) { if (n->is_class("AnimationPlayer")) { @@ -102,11 +108,18 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i } } else if (p_id == BUTTON_GROUP) { - if (n->is_class("CanvasItem")) { - n->set_meta("_edit_group_", Variant()); - _update_tree(); - emit_signal("node_changed"); + undo_redo->create_action(TTR("Button Group")); + + if (n->is_class("CanvasItem") || n->is_class("Spatial")) { + + undo_redo->add_do_method(n, "remove_meta", "_edit_group_"); + undo_redo->add_undo_method(n, "set_meta", "_edit_group_", true); + undo_redo->add_do_method(this, "_update_tree", Variant()); + undo_redo->add_undo_method(this, "_update_tree", Variant()); + undo_redo->add_do_method(this, "emit_signal", "node_changed"); + undo_redo->add_undo_method(this, "emit_signal", "node_changed"); } + undo_redo->commit_action(); } else if (p_id == BUTTON_WARNING) { String config_err = n->get_configuration_warning(); @@ -303,6 +316,10 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { if (is_locked) item->add_button(0, get_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it.")); + bool is_grouped = p_node->has_meta("_edit_group_"); + if (is_grouped) + item->add_button(0, get_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable.")); + bool v = p_node->call("is_visible"); if (v) item->add_button(0, get_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 717d6bc8f6..1da8bf874c 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -209,8 +209,8 @@ void ScriptEditorDebugger::debug_next() { Array msg; msg.push_back("next"); ppeer->put_var(msg); + _clear_execution(); stack_dump->clear(); - inspector->edit(NULL); } void ScriptEditorDebugger::debug_step() { @@ -221,8 +221,8 @@ void ScriptEditorDebugger::debug_step() { Array msg; msg.push_back("step"); ppeer->put_var(msg); + _clear_execution(); stack_dump->clear(); - inspector->edit(NULL); } void ScriptEditorDebugger::debug_break() { @@ -245,6 +245,7 @@ void ScriptEditorDebugger::debug_continue() { OS::get_singleton()->enable_for_stealing_focus(EditorNode::get_singleton()->get_child_process_id()); Array msg; + _clear_execution(); msg.push_back("continue"); ppeer->put_var(msg); } @@ -424,6 +425,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da } else if (p_msg == "debug_exit") { breaked = false; + _clear_execution(); copy->set_disabled(true); step->set_disabled(true); next->set_disabled(true); @@ -436,7 +438,6 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da emit_signal("breaked", false, false, Variant()); profiler->set_enabled(true); profiler->disable_seeking(); - inspector->edit(NULL); EditorNode::get_singleton()->get_pause_button()->set_pressed(false); } else if (p_msg == "message:click_ctrl") { @@ -1273,6 +1274,18 @@ void ScriptEditorDebugger::_notification(int p_what) { } } +void ScriptEditorDebugger::_clear_execution() { + TreeItem *ti = stack_dump->get_selected(); + if (!ti) + return; + + Dictionary d = ti->get_metadata(0); + + stack_script = ResourceLoader::load(d["file"]); + emit_signal("clear_execution", stack_script); + stack_script.unref(); +} + void ScriptEditorDebugger::start() { stop(); @@ -1313,6 +1326,7 @@ void ScriptEditorDebugger::stop() { set_process(false); breaked = false; + _clear_execution(); server->stop(); _clear_remote_objects(); @@ -1337,7 +1351,7 @@ void ScriptEditorDebugger::stop() { profiler->set_enabled(true); inspect_scene_tree->clear(); - + inspector->edit(NULL); EditorNode::get_singleton()->get_pause_button()->set_pressed(false); EditorNode::get_singleton()->get_pause_button()->set_disabled(true); EditorNode::get_singleton()->get_scene_tree_dock()->hide_remote_tree(); @@ -1393,6 +1407,7 @@ void ScriptEditorDebugger::_stack_dump_frame_selected() { stack_script = ResourceLoader::load(d["file"]); emit_signal("goto_script_line", stack_script, int(d["line"]) - 1); + emit_signal("set_execution", stack_script, int(d["line"]) - 1); stack_script.unref(); if (connection.is_valid() && connection->is_connected_to_host()) { @@ -1966,6 +1981,8 @@ void ScriptEditorDebugger::_bind_methods() { ClassDB::bind_method(D_METHOD("_scene_tree_property_value_edited"), &ScriptEditorDebugger::_scene_tree_property_value_edited); ADD_SIGNAL(MethodInfo("goto_script_line")); + ADD_SIGNAL(MethodInfo("set_execution", PropertyInfo("script"), PropertyInfo(Variant::INT, "line"))); + ADD_SIGNAL(MethodInfo("clear_execution", PropertyInfo("script"))); ADD_SIGNAL(MethodInfo("breaked", PropertyInfo(Variant::BOOL, "reallydid"), PropertyInfo(Variant::BOOL, "can_debug"))); ADD_SIGNAL(MethodInfo("show_debugger", PropertyInfo(Variant::BOOL, "reallydid"))); } diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index 5f21602579..f7afe6bf72 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -205,6 +205,8 @@ class ScriptEditorDebugger : public Control { void _export_csv(); + void _clear_execution(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp index 2e06a903aa..f540b386aa 100644 --- a/editor/spatial_editor_gizmos.cpp +++ b/editor/spatial_editor_gizmos.cpp @@ -324,7 +324,6 @@ void EditorSpatialGizmo::add_handles(const Vector<Vector3> &p_handles, const Ref ERR_FAIL_COND(!spatial_node); - ERR_FAIL_COND(!spatial_node); Instance ins; Ref<ArrayMesh> mesh = memnew(ArrayMesh); @@ -1310,6 +1309,28 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) { Ref<Material> material = get_material("camera_material", p_gizmo); Ref<Material> icon = get_material("camera_icon", p_gizmo); +#define ADD_TRIANGLE(m_a, m_b, m_c) \ + { \ + lines.push_back(m_a); \ + lines.push_back(m_b); \ + lines.push_back(m_b); \ + lines.push_back(m_c); \ + lines.push_back(m_c); \ + lines.push_back(m_a); \ + } + +#define ADD_QUAD(m_a, m_b, m_c, m_d) \ + { \ + lines.push_back(m_a); \ + lines.push_back(m_b); \ + lines.push_back(m_b); \ + lines.push_back(m_c); \ + lines.push_back(m_c); \ + lines.push_back(m_d); \ + lines.push_back(m_d); \ + lines.push_back(m_a); \ + } + switch (camera->get_projection()) { case Camera::PROJECTION_PERSPECTIVE: { @@ -1322,16 +1343,6 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) { nside.x = -nside.x; Vector3 up = Vector3(0, side.x, 0); -#define ADD_TRIANGLE(m_a, m_b, m_c) \ - { \ - lines.push_back(m_a); \ - lines.push_back(m_b); \ - lines.push_back(m_b); \ - lines.push_back(m_c); \ - lines.push_back(m_c); \ - lines.push_back(m_a); \ - } - ADD_TRIANGLE(Vector3(), side + up, side - up); ADD_TRIANGLE(Vector3(), nside + up, nside - up); ADD_TRIANGLE(Vector3(), side + up, nside + up); @@ -1346,17 +1357,6 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) { } break; case Camera::PROJECTION_ORTHOGONAL: { -#define ADD_QUAD(m_a, m_b, m_c, m_d) \ - { \ - lines.push_back(m_a); \ - lines.push_back(m_b); \ - lines.push_back(m_b); \ - lines.push_back(m_c); \ - lines.push_back(m_c); \ - lines.push_back(m_d); \ - lines.push_back(m_d); \ - lines.push_back(m_a); \ - } float size = camera->get_size(); float hsize = size * 0.5; @@ -1369,6 +1369,7 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) { ADD_QUAD(-up - right + back, -up + right + back, up + right + back, up - right + back); ADD_QUAD(up + right, up + right + back, up - right + back, up - right); ADD_QUAD(-up + right, -up + right + back, -up - right + back, -up - right); + handles.push_back(right + back); right.x *= 0.25; @@ -1376,8 +1377,30 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) { ADD_TRIANGLE(tup, right + up + back, -right + up + back); } break; + case Camera::PROJECTION_FRUSTUM: { + float hsize = camera->get_size() / 2.0; + + Vector3 side = Vector3(hsize, 0, -camera->get_znear()).normalized(); + Vector3 nside = side; + nside.x = -nside.x; + Vector3 up = Vector3(0, side.x, 0); + Vector3 offset = Vector3(camera->get_frustum_offset().x, camera->get_frustum_offset().y, 0.0); + + ADD_TRIANGLE(Vector3(), side + up + offset, side - up + offset); + ADD_TRIANGLE(Vector3(), nside + up + offset, nside - up + offset); + ADD_TRIANGLE(Vector3(), side + up + offset, nside + up + offset); + ADD_TRIANGLE(Vector3(), side - up + offset, nside - up + offset); + + side.x *= 0.25; + nside.x *= 0.25; + Vector3 tup(0, up.y * 3 / 2, side.z); + ADD_TRIANGLE(tup + offset, side + up + offset, nside + up + offset); + } } +#undef ADD_TRIANGLE +#undef ADD_QUAD + p_gizmo->add_lines(lines, material); p_gizmo->add_unscaled_billboard(icon, 0.05); p_gizmo->add_handles(handles, get_material("handles")); diff --git a/editor/translations/af.po b/editor/translations/af.po index acc57bd967..795044c0cd 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -433,7 +433,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Tree (s):" #: editor/animation_track_editor.cpp @@ -441,6 +441,14 @@ msgstr "Tree (s):" msgid "Animation step value." msgstr "Animasie Zoem." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3814,6 +3822,11 @@ msgid "Delete Node" msgstr "Skrap" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Wissel Gunsteling" @@ -4791,8 +4804,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Anim Voeg Sleutel by" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Anim Voeg Sleutel by" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4864,6 +4902,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5214,52 +5298,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5782,7 +5829,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6614,6 +6661,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Skep Nuwe" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Skep Intekening" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Skep Intekening" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Skep Vouer" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6626,17 +6693,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Skep Nuwe" +msgid "Convert to Polygon2D" +msgstr "Hernoem AutoLaai" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Skep Intekening" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7234,6 +7322,11 @@ msgid "Duplicate Nodes" msgstr "Anim Dupliseer Sleutels" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Skrap" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8398,10 +8491,6 @@ msgid "Open documentation" msgstr "Opnoemings" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 6807717a59..50efabd7f5 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -17,7 +17,7 @@ # Rex_sa <asd1234567890m@gmail.com>, 2017, 2018, 2019. # Wajdi Feki <wajdi.feki@gmail.com>, 2017. # Omar Aglan <omar.aglan91@yahoo.com>, 2018, 2019. -# Codes Otaku <ilyas.gamerz@gmail.com>, 2018. +# Codes Otaku <ilyas.gamerz@gmail.com>, 2018, 2019. # Takai Eddine Kennouche <takai.kenn@gmail.com>, 2018. # Mohamed El-Baz <albaz2000eg@gmail.com>, 2018. # عاصم شكر - Aasem shokr <aasemshokr@gmail.com>, 2018. @@ -28,8 +28,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-24 17:38+0000\n" -"Last-Translator: spiderx0x <legendofdarks@gmail.com>\n" +"PO-Revision-Date: 2019-04-17 10:02+0000\n" +"Last-Translator: Omar Aglan <omar.aglan91@yahoo.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -53,7 +53,7 @@ msgstr "لا يوجد ما يكÙÙŠ من البايتات من أجل ÙÙƒ Ø§Ù„Ø #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Ù…Ùدخل غير ØµØ§Ù„Ø \"i%\" (لم يتم تمريره) ÙÙŠ السطر" +msgstr "إدخال خاطيء i% (لم يتم تمريره) ÙÙŠ التصريØ" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -363,11 +363,11 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." -msgstr "" +msgstr "مشغل الØركة لا يمكنه تØريك Ù†Ùسه, Ùقط الاعبين الأخرين." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "لا يمكن إضاÙØ© مقطع جديد بدون جذر" #: editor/animation_track_editor.cpp #, fuzzy @@ -376,34 +376,31 @@ msgstr "إضاÙØ© مسار" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "مسار المقطع غير صالØ, إذن لا يمكن إضاÙØ© Ù…ÙتاØ." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "المقطع ليس من نوع مكاني (Spatial), لا يمكن إضاÙØ© Ù…ÙتاØ." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "خط التØريك ثلاثي الأبعاد" +msgstr "أض٠مÙØªØ§Ø Ù…Ù‚Ø·Ø¹ المتØول (Transform)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "إضاÙØ© مسار" +msgstr "أض٠مÙØªØ§Ø Ø§Ù„Ù…Ù‚Ø·Ø¹" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "مسار المقطع غير صالØ, إذن لا يمكن إضاÙØ© دالة المÙØªØ§Ø (Method key)." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "استدعاء أسلوب المسار" +msgstr "أض٠مÙØªØ§Ø Ù…Ù‚Ø·Ø¹ الدالة" #: editor/animation_track_editor.cpp msgid "Method not found in object: " -msgstr "" +msgstr "دالة لم توجد ÙÙŠ شيئ: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -411,12 +408,11 @@ msgstr "Ù…ÙØªØ§Ø Øركة التØريك" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "" +msgstr "ذاكرة التخزين المؤقت (Clipboard) Ùارغة" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" -msgstr "لصق المÙعامل" +msgstr "لصق المقاطع" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" @@ -425,25 +421,32 @@ msgstr "Ù…ÙØªØ§Ø ØªÙƒØ¨ÙŠØ± Øركة" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "هذا الخيار لا يعمل لتعديل خط (Bezier), لأنه Ùقط مقطع واØد." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "Ùقط قم بتبين المقاطع من العقد (Nodes) المØددة ÙÙŠ الشجرة." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "" +msgstr "قم بتجميع المقاطع Øسب العقد (Nodes) أو إظهارهم كقائمة بسيطة." #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "خطوة (ثانية):" +msgid "Snap:" +msgstr "خطوة أو خطوات: " #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation step value." -msgstr "شجرة الØركة صØÙŠØØ©." +msgstr "قيمة خطوة الØركة." + +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -452,17 +455,15 @@ msgstr "شجرة الØركة صØÙŠØØ©." #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "تعديل" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "شجرة الØركة" +msgstr "خاصيات الØركة." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Copy Tracks" -msgstr "إنسخ المÙعامل" +msgstr "إنسخ المقاطع" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -481,17 +482,14 @@ msgid "Duplicate Transposed" msgstr "نسخ Ù…Øمّل" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "نص٠المÙØدد" +msgstr "Ø¥Øد٠المØدد (المجموعة المختارة)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" msgstr "إذهب إلي الخطوة التالية" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" msgstr "إذهب إلي الخطوة السابقة" @@ -505,11 +503,12 @@ msgstr "تنظي٠الØركة" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "" +msgstr "إختار العقدة التي سو٠يتم تØريكها:" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Use Bezier Curves" -msgstr "" +msgstr "إستعمل خطوط أو منØنيات Bezier" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -557,7 +556,7 @@ msgstr "نسبة التكبير:" #: editor/animation_track_editor.cpp msgid "Select tracks to copy:" -msgstr "" +msgstr "Øدد مقاطع لنسخ:" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -565,20 +564,19 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "" +msgstr "أنسخ" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "مقاطع الصوت:" +msgstr "أض٠مقطع صوت" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "تغيير موضع بداية مقطع صوت" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "تغيير موضع نهاية مقطع صوت" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -646,11 +644,11 @@ msgstr "إرجاع التكبير" #: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp msgid "Warnings" -msgstr "" +msgstr "تØذيرات" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "أرقام الخط Ùˆ العمود." #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" @@ -734,7 +732,6 @@ msgid "Disconnect '%s' from '%s'" msgstr "قطع إتصال'%s' من '%s'" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect all from signal: '%s'" msgstr "قطع إتصال'%s' من '%s'" @@ -748,18 +745,16 @@ msgid "Disconnect" msgstr "قطع الاتصال" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect Signal: " -msgstr "يوصل الإشارة:" +msgstr "قم بوصل الإشارة: " #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection: " -msgstr "خطأ ÙÙŠ الإتصال" +msgstr "قم بتعديل الإتصال: " #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" -msgstr "" +msgstr "هل أنت(ÙŠ) متأكد(Ø©) أنك تود إزالة كل الإتصالات من الإشارة \"%s\"ØŸ" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" @@ -767,22 +762,19 @@ msgstr "إشارات" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" -msgstr "" +msgstr "هل أنت(ÙŠ) متأكد(Ø©) أنك تود إزالة كل الإتصالات من هذه الإشارة؟" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect All" -msgstr "قطع الاتصال" +msgstr "قطع الاتصال على الكل" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit..." -msgstr "المÙعدل" +msgstr "تعديل..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go To Method" -msgstr "قائمة الطرق" +msgstr "إذهب إلى الدالة" #: editor/create_dialog.cpp msgid "Change %s Type" @@ -915,7 +907,6 @@ msgid "Error loading:" msgstr "خطآ ÙÙŠ التØميل:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Load failed due to missing dependencies:" msgstr "Ùشل ÙÙŠ تØميل المشهد بسبب وجود تبعيات Ù…Ùقودة يعتمد المشهد عليها:" @@ -1068,9 +1059,8 @@ msgid "Uncompressing Assets" msgstr "ÙŠÙكك الضغط عن الأصول" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Package installed successfully!" -msgstr "الØزمة تم تثبيتها بنجاØ!" +msgstr "تم تتبيث الØزمة بنجاØ!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1216,9 +1206,8 @@ msgid "Add Bus" msgstr "أض٠بيوس" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "Ø¥ØÙظ نسق بيوس الصوت كـ..." +msgstr "أض٠مسار صوت (Audio Bus) جديد إلى هذا التصميم." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1387,7 +1376,7 @@ msgstr "تخزين الملÙ:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "" +msgstr "لم يوجد قالب التصدير ÙÙŠ المسار المتوقع:" #: editor/editor_export.cpp msgid "Packing" @@ -1398,12 +1387,16 @@ msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"المنصة المستهدÙØ© تØتاج لتشÙير ملمس 'ETC' Ù„ GLES2. قم بتمكين 'Import Etc' ÙÙŠ " +"إعدادات المشروع." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"المنصة المستهدÙØ© تØتاج لتشÙير ملمس \"ETC2\" Ù„ GLES3. قم بتمكين 'Import Etc " +"2' ÙÙŠ إعدادات المشروع." #: editor/editor_export.cpp msgid "" @@ -3899,6 +3892,11 @@ msgid "Delete Node" msgstr "إنشاء عقدة" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "تمكين/إيقا٠هذا المسار." @@ -4888,9 +4886,34 @@ msgid "Layout" msgstr "المخطط" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "أدخل Ù…ÙاتيØ" +msgid "Insert keys (based on mask)." +msgstr "أدخل Ù…ÙØªØ§Ø (مسارات موجودة بالÙعل)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "أض٠مÙØªØ§Ø Ø§Ù„Øركة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4963,6 +4986,52 @@ msgstr "تعديل البولي (Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©)" msgid "Set Handle" msgstr "Øدد المعامل" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "خطأ تØميل الصورة:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "لا بيكسل بشÙاÙية > 128 ÙÙŠ الصورة..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Øمل قناع الانبعاث" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Ø¥Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ الانبعاث" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "جسيمات" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "عدد النقاط المولدة:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "قناع الانبعاث" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "التقط من البيكسل" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "الوان الانبعاث" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5316,22 +5385,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "لا يمكن إنشاء سوى نقطة ÙˆØيدة داخل ParticlesMaterial معالج المواد" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "خطأ تØميل الصورة:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "لا بيكسل بشÙاÙية > 128 ÙÙŠ الصورة..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Øمل قناع الانبعاث" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Ø¥Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ الانبعاث" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5339,30 +5392,9 @@ msgstr "تØويل إلي %s" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "جسيمات" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "عدد النقاط المولدة:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "وقت التوليد (تانية):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "قناع الانبعاث" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "التقط من البيكسل" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "الوان الانبعاث" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "الوجوه لا تØتوي على منطقة!" @@ -5899,7 +5931,8 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " مرجع الصنÙ" #: editor/plugins/script_editor_plugin.cpp @@ -6740,6 +6773,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "إنشاء شبكة الخطوط العريضة" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "إنشاء بولي" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "إنشاء Ù…Ùضلع التنقل" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "أنشئ شكل Ù…Ùطبق" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "الميش Ùارغ!" @@ -6752,18 +6805,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "تØويل إلي %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "إنشاء شبكة الخطوط العريضة" +msgid "Convert to Polygon2D" +msgstr "تØويل إلي %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "إنشاء Ù…Ùضلع التنقل" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "أنشئ شكل Ù…Ùطبق" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7385,6 +7460,11 @@ msgid "Duplicate Nodes" msgstr "Ù…ÙØ§ØªÙŠØ Ù†Ø³Ø® التØريك" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "إنشاء عقدة" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8563,10 +8643,6 @@ msgid "Open documentation" msgstr "ÙÙØªØ Ù…Ø¤Ø®Ø±Ø§Ù‹" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10335,6 +10411,10 @@ msgstr "التعين للإنتظام." msgid "Varyings can only be assigned in vertex function." msgstr "يمكن تعيين المتغيرات Ùقط ÙÙŠ الذروة ." +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "أدخل Ù…ÙاتيØ" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "نمذج المشهد(المشاهد) المØددة كطÙÙ„ للعقدة المØددة." diff --git a/editor/translations/bg.po b/editor/translations/bg.po index a179f3b438..fb81a1793a 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -433,7 +433,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Стъпка (Ñек.):" #: editor/animation_track_editor.cpp @@ -441,6 +441,14 @@ msgstr "Стъпка (Ñек.):" msgid "Animation step value." msgstr "Изтриване на анимациÑта?" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3826,6 +3834,11 @@ msgid "Delete Node" msgstr "Избиране на вÑичко" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Покажи Любими" @@ -4811,7 +4824,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4883,6 +4920,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5234,52 +5317,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5798,7 +5844,7 @@ msgid "Save Theme As..." msgstr "Запази Темата Като..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6635,6 +6681,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Създайте нов/а %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Създаване на папка" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Създаване на папка" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Създаване на папка" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6647,17 +6713,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Създайте нов/а %s" +msgid "Convert to Polygon2D" +msgstr "ПремеÑтване на Полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Създаване на папка" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7274,6 +7361,11 @@ msgid "Duplicate Nodes" msgstr "Ðаправи дупликат на Key(s)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Избиране на вÑичко" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8465,10 +8557,6 @@ msgid "Open documentation" msgstr "Отвори документациÑта на Godot онлайн" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 3634ca82d2..4b7dd76be6 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -451,14 +451,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª (পিকà§à¦¸à§‡à¦²à¦¸à¦®à§‚হ):" +msgid "Snap:" +msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° তালিকাটি কারà§à¦¯à¦•à¦°à¥¤" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "à¦à¦« পি à¦à¦¸" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4062,6 +4070,11 @@ msgid "Delete Node" msgstr "নোড(সমূহ) অপসারণ করà§à¦¨" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "নোড(সমূহ) অপসারণ করà§à¦¨" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "বিকà§à¦·à§‡à¦ª-হীন মোড" @@ -5086,9 +5099,34 @@ msgid "Layout" msgstr "লেআউট/নকশা সংরকà§à¦·à¦£ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "চাবিসমূহ সনà§à¦¨à¦¿à¦¬à§‡à¦¶ করà§à¦¨" +msgid "Insert keys (based on mask)." +msgstr "চাবি সনà§à¦¨à¦¿à¦¬à§‡à¦¶ করà§à¦¨ (বিদà§à¦¯à¦®à¦¾à¦¨ টà§à¦°à§à¦¯à¦¾à¦•/পথসমূহ)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡ (Anim) চাবি যোগ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5161,6 +5199,56 @@ msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨ (বিনà§à¦¦à§ অপসা msgid "Set Handle" msgstr "হà§à¦¯à¦¾à¦¨à§à¦¡à§‡à¦² সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "সà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦¸à¦¹ কোনো পিকà§à¦¸à§‡à¦² নেই > ছবিতে ১২৮..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Emission Mask লোড করà§à¦¨" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Emission Mask পরিসà§à¦•à¦¾à¦° করà§à¦¨" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Particles" +msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "উৎপাদিত বিনà§à¦¦à§à¦° সংখà§à¦¯à¦¾:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Emission Mask সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "দৃশà§à¦¯ হতে তৈরি করবেন" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Emission-à¦à¦° সà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হ:" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5528,22 +5616,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ParticlesMaterial পà§à¦°à¦¸à§‡à¦¸ মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦²à§‡ বিনà§à¦¦à§ সà§à¦¥à¦¾à¦ªà¦¨ সমà§à¦à¦¬" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "সà§à¦¬à¦šà§à¦›à¦¤à¦¾à¦¸à¦¹ কোনো পিকà§à¦¸à§‡à¦² নেই > ছবিতে ১২৮..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Emission Mask লোড করà§à¦¨" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Emission Mask পরিসà§à¦•à¦¾à¦° করà§à¦¨" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5552,34 +5624,9 @@ msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..." #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy -msgid "Particles" -msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "উৎপাদিত বিনà§à¦¦à§à¦° সংখà§à¦¯à¦¾:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generation Time (sec):" msgstr "গড় সময় (সেঃ)" -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Emission Mask" -msgstr "Emission Mask সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Capture from Pixel" -msgstr "দৃশà§à¦¯ হতে তৈরি করবেন" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Emission Colors" -msgstr "Emission-à¦à¦° সà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হ:" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "পৃষà§à¦ সমূহ কোনো আকার নেই!" @@ -6134,7 +6181,8 @@ msgid "Save Theme As..." msgstr "থিম à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " কà§à¦²à¦¾à¦¸ রেফারেনà§à¦¸" #: editor/plugins/script_editor_plugin.cpp @@ -7014,6 +7062,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া মেস তৈরি করà§à¦¨" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Poly তৈরি করà§à¦¨" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Navigation Polygon তৈরি করà§à¦¨" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "অকলà§à¦¡à¦¾à¦° (occluder) পলিগন তৈরি করà§à¦¨" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "সংরকà§à¦·à¦£à§‡à¦° পথটি খালি!" @@ -7026,19 +7094,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "ফà§à¦°à§‡à¦®à¦¸à¦®à§‚হ সà§à¦¤à§‚প করà§à¦¨" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া মেস তৈরি করà§à¦¨" +msgid "Convert to Polygon2D" +msgstr "পলিগন সরান" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Navigation Polygon তৈরি করà§à¦¨" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "অকলà§à¦¡à¦¾à¦° (occluder) পলিগন তৈরি করà§à¦¨" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7674,6 +7764,11 @@ msgid "Duplicate Nodes" msgstr "নোড(সমূহ) পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করà§à¦¨" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "নোড(সমূহ) অপসারণ করà§à¦¨" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8932,10 +9027,6 @@ msgid "Open documentation" msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "নোড(সমূহ) অপসারণ করà§à¦¨" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "শীষà§à¦¯ নোড তৈরি করà§à¦¨" @@ -10861,12 +10952,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª (পিকà§à¦¸à§‡à¦²à¦¸à¦®à§‚হ):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "চাবিসমূহ সনà§à¦¨à¦¿à¦¬à§‡à¦¶ করà§à¦¨" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯(সমূহ)-কে নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ নোডের অংশ হিসেবে ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨à¥¤" -#~ msgid "FPS" -#~ msgstr "à¦à¦« পি à¦à¦¸" - #, fuzzy #~ msgid "Warnings:" #~ msgstr "সতরà§à¦•à¦¤à¦¾" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 75f6c53145..cd87bb8a46 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-04-08 10:35+0000\n" +"PO-Revision-Date: 2019-04-19 16:33+0000\n" "Last-Translator: roger <616steam@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" @@ -234,7 +234,7 @@ msgstr "Captura" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "El de més a prop" +msgstr "Més proper" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -429,13 +429,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupa les pistes per node o mostra-les en una llista." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Pas (s): " +#, fuzzy +msgid "Snap:" +msgstr "Alinea" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valor del pas d'Animació." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3836,9 +3845,8 @@ msgstr "Nodes Connectats" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Nodes Disconnected" -msgstr "Desconnectat" +msgstr "Nodes Desconnectats" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy @@ -3847,8 +3855,12 @@ msgstr "Animació" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" +msgstr "Eliminar Node" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" msgstr "Elimina els Nodes" #: editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -3857,9 +3869,8 @@ msgid "Toggle Filter On/Off" msgstr "Activa/Desactiva la Pista." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Change Filter" -msgstr "S'ha Modificat el Filtre de Locale" +msgstr "Canviar Filtre" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." @@ -4859,9 +4870,34 @@ msgid "Layout" msgstr "Desar Disseny" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Insereix Claus" +msgid "Insert keys (based on mask)." +msgstr "Insereix una Clau (Pistes existents)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Insereix una Clau" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4933,6 +4969,52 @@ msgstr "Edita el PolÃgon (Elimina un Punt)" msgid "Set Handle" msgstr "Estableix la Nansa" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Error en carregar la imatge:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Cap pÃxel amb transparència > 128 en la imatge..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Carrega una Mà scara d'Emissió" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Esborra la Mà scara d'Emissió" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "PartÃcules" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Recompte de punts generats:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Mà scara d'Emissió" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Captura des d'un PÃxel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Colors d'Emissió" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5285,22 +5367,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Només es poden establir punts en materials de procés ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Error en carregar la imatge:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Cap pÃxel amb transparència > 128 en la imatge..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Carrega una Mà scara d'Emissió" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Esborra la Mà scara d'Emissió" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5308,30 +5374,9 @@ msgstr "Converteix en majúscules" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "PartÃcules" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Recompte de punts generats:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Temps de generació (s):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Mà scara d'Emissió" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Captura des d'un PÃxel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Colors d'Emissió" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Les Cares no tenen à rea!" @@ -5866,7 +5911,8 @@ msgid "Save Theme As..." msgstr "Desa el Tema com a..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Referència de Classe" #: editor/plugins/script_editor_plugin.cpp @@ -6715,6 +6761,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Crea la Malla de Contorn" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Crear PolÃgon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Crea un PolÃgon de Navegació" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Crea un PolÃgon Oclusor" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "El camà per desar és buit!" @@ -6727,19 +6793,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "SpriteFrames" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Converteix a %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Crea la Malla de Contorn" +msgid "Convert to Polygon2D" +msgstr "Mou el PolÃgon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Crea un PolÃgon de Navegació" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Crea un PolÃgon Oclusor" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7354,6 +7442,11 @@ msgid "Duplicate Nodes" msgstr "Duplica els Nodes" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Eliminar Node" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8573,10 +8666,6 @@ msgid "Open documentation" msgstr "Obre la Documentació en lÃnia" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Elimina els Nodes" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Afegeix un Node Fill" @@ -10466,13 +10555,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#~ msgid "Snap (s): " +#~ msgstr "Pas (s): " + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Insereix Claus" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instancia les escenes seleccionades com a filles del node seleccionat." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Avisos:" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 49075fe390..63d5bea503 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -426,13 +426,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Seskupit stopy podle uzlu nebo je zobrazit jako jednoduchý seznam." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "PÅ™ichycenà (s): " +#, fuzzy +msgid "Snap:" +msgstr "PÅ™ichytit" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Hodnota animaÄnÃho kroku." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3794,6 +3803,11 @@ msgid "Delete Node" msgstr "Smazat uzel" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Odstranit uzel/uzly" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Aktivovat/Deaktivovat tuto stopu." @@ -4752,8 +4766,34 @@ msgid "Layout" msgstr "RozloženÃ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Vložit klÃÄe." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Vložit klÃÄ (existujÃcà stopy)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Animace: vložit klÃÄ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4823,6 +4863,52 @@ msgstr "Upravit polygon (Odstranit bod)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Chyba pÅ™i nahrávánà obrázku:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Žádný pixel s průhlednostà > 128 v obrázku..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "NaÄÃst emisnà masku" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "VyÄistit emisnà masku" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Částice" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "PoÄet vygenerovaných bodů:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Emisnà maska" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5178,52 +5264,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Chyba pÅ™i nahrávánà obrázku:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Žádný pixel s průhlednostà > 128 v obrázku..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "NaÄÃst emisnà masku" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "VyÄistit emisnà masku" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "PÅ™evést na CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Částice" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "PoÄet vygenerovaných bodů:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "ÄŒas generovánà (sec):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Emisnà maska" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5735,7 +5784,8 @@ msgid "Save Theme As..." msgstr "Uložit motiv jako..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Reference tÅ™Ãdy" #: editor/plugins/script_editor_plugin.cpp @@ -6567,6 +6617,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "VytvoÅ™it 2D mesh" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "VytvoÅ™it Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "VytvoÅ™it navigaÄnà polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "VytvoÅ™it Occluder Polygon" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite je prázdný!" @@ -6579,16 +6649,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Konvertovat na 2D mesh" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "VytvoÅ™it 2D mesh" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "PÅ™esunout polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "VytvoÅ™it navigaÄnà polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "VytvoÅ™it Occluder Polygon" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7188,6 +7282,11 @@ msgid "Duplicate Nodes" msgstr "Duplikovat uzel/uzly" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Smazat uzel" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8360,10 +8459,6 @@ msgid "Open documentation" msgstr "OtevÅ™Ãt dokumentaci" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Odstranit uzel/uzly" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "PÅ™idat podÅ™Ãzený uzel" @@ -10205,8 +10300,11 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" -#~ msgid "FPS" -#~ msgstr "FPS" +#~ msgid "Snap (s): " +#~ msgstr "PÅ™ichycenà (s): " + +#~ msgid "Insert keys." +#~ msgstr "Vložit klÃÄe." #~ msgid "Warnings:" #~ msgstr "VarovánÃ:" diff --git a/editor/translations/da.po b/editor/translations/da.po index 5096ed924a..ee8b415fe3 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -434,13 +434,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Grupper spor efter node eller vis dem som almindelig liste." #: editor/animation_track_editor.cpp -msgid "Snap (s): " +#, fuzzy +msgid "Snap:" msgstr "Trin: " #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Animation trin værdi." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3865,6 +3874,11 @@ msgid "Delete Node" msgstr "Vælg Node" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "SlÃ¥ spor til/fra." @@ -4850,8 +4864,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Anim Indsæt Nøgle" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Anim Indsæt Nøgle" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4924,6 +4963,52 @@ msgstr "Rediger Poly (Fjern Punkt)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5277,22 +5362,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5300,30 +5369,9 @@ msgstr "Konverter Til %s" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5856,7 +5904,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6698,6 +6746,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Opret Ny %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Opret Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Opret Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Opret Mappe" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6710,18 +6778,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Konverter Til %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Opret Ny %s" +msgid "Convert to Polygon2D" +msgstr "Konverter Til %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Opret Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7333,6 +7422,11 @@ msgid "Duplicate Nodes" msgstr "Dublikér nøgle(r)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Vælg Node" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8523,10 +8617,6 @@ msgid "Open documentation" msgstr "Ã…ben Seneste" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/de.po b/editor/translations/de.po index adae79c0e7..a9f174e98e 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -452,13 +452,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Spuren nach Node gruppieren oder nacheinander anzeigen." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Einrasten (s): " +#, fuzzy +msgid "Snap:" +msgstr "Einrasten" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Animationsschrittwert." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3863,6 +3872,11 @@ msgid "Delete Node" msgstr "Node löschen" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Node(s) löschen" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Filter ein-/ausschalten" @@ -4841,8 +4855,34 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Schlüsselbilder einfügen." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Schlüsselbilder einfügen (Einfg)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Schlüsselbild einfügen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4914,6 +4954,52 @@ msgstr "Polygon bearbeiten (Punkt entfernen)" msgid "Set Handle" msgstr "Wähle Griff" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Fehler beim Laden des Bilds:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Keine Pixel mit einer Transparenz > 128 im Bild..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Emissionsmaske laden" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Emissionsmaske leeren" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partikel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Anzahl generierter Punkte:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Emissionsmaske" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Von Pixel aufnehmen" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Emissionsfarben" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPU-Partikel" @@ -5268,52 +5354,15 @@ msgstr "" "werden" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Fehler beim Laden des Bilds:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Keine Pixel mit einer Transparenz > 128 im Bild..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Emissionsmaske laden" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Emissionsmaske leeren" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Zu CPU-Partikeln konvertieren" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Partikel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Anzahl generierter Punkte:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Erzeugungszeit (s):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Emissionsmaske" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Von Pixel aufnehmen" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Emissionsfarben" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Flächen enthalten keinen Bereich!" @@ -5825,7 +5874,8 @@ msgid "Save Theme As..." msgstr "Motiv speichern als..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Klassenreferenz" #: editor/plugins/script_editor_plugin.cpp @@ -6653,6 +6703,26 @@ msgid "Nameless gizmo" msgstr "Namenloser Anfasser" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "2D-Mesh erzeugen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Polygon3D erstellen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Kollisionspolygon erzeugen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Occluder-Polygon erzeugen" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite ist leer!" @@ -6667,16 +6737,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Zu 2D-Mesh umwandeln" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "2D-Mesh erzeugen" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Polygon verschieben" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Kollisionspolygon erzeugen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Occluder-Polygon erzeugen" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7264,6 +7361,11 @@ msgid "Duplicate Nodes" msgstr "Nodes duplizieren" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Node löschen" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Visual-Shader-Eingabetyp geändert" @@ -8486,10 +8588,6 @@ msgid "Open documentation" msgstr "Dokumentation öffnen" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Node(s) löschen" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Node hier anhängen" @@ -10390,13 +10488,16 @@ msgstr "Zuweisung an Uniform." msgid "Varyings can only be assigned in vertex function." msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." +#~ msgid "Snap (s): " +#~ msgstr "Einrasten (s): " + +#~ msgid "Insert keys." +#~ msgstr "Schlüsselbilder einfügen." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instantiiere gewählte Szene(n) als Unterobjekt des ausgewählten Nodes." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Warnungen:" @@ -11929,9 +12030,6 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." #~ msgid "Cannot go into subdir:" #~ msgstr "Unterordner kann nicht geöffnet werden:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Schlüsselbilder einfügen (Einfg)" - #~ msgid "Enable/Disable interpolation when looping animation." #~ msgstr "Aktivieren/Deaktivieren Interpolation, wenn Schleife aktiviert." diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 55e457c169..cf2e88000d 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -430,7 +430,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Selektiere Node(s) zum Importieren aus" #: editor/animation_track_editor.cpp @@ -438,6 +438,14 @@ msgstr "Selektiere Node(s) zum Importieren aus" msgid "Animation step value." msgstr "Animations-Node" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3805,6 +3813,11 @@ msgid "Delete Node" msgstr "Node(s) löschen" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Node(s) löschen" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4795,9 +4808,34 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Bild einfügen" +msgid "Insert keys (based on mask)." +msgstr "Bilder (innerhalb) einfügen" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim Bild einfügen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4869,6 +4907,55 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Emissions-Maske laden" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Clear Emission Mask" +msgstr "Inhalt der Emissions-Masken löschen" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Emissions-Maske setzen" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Emissions-Maske setzen" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5225,23 +5312,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Emissions-Maske laden" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Clear Emission Mask" -msgstr "Inhalt der Emissions-Masken löschen" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5249,32 +5319,9 @@ msgstr "Verbindung zu Node:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Emission Mask" -msgstr "Emissions-Maske setzen" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Emission Colors" -msgstr "Emissions-Maske setzen" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Flächen enthalten keinen Bereich!" @@ -5803,7 +5850,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6636,6 +6683,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Node erstellen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Node erstellen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Node erstellen" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Node erstellen" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6648,20 +6715,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "Verbindung zu Node:" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Convert to Polygon2D" msgstr "Verbindung zu Node:" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" +msgid "Create CollisionPolygon2D Sibling" msgstr "Node erstellen" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " msgstr "" @@ -7270,6 +7358,11 @@ msgid "Duplicate Nodes" msgstr "Node(s) duplizieren" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Node(s) löschen" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8461,10 +8554,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Node(s) löschen" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10270,6 +10359,10 @@ msgid "Varyings can only be assigned in vertex function." msgstr "" #, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Bild einfügen" + +#, fuzzy #~ msgid "OrientedPathFollow only works when set as a child of a Path node." #~ msgstr "" #~ "PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D " @@ -10431,6 +10524,3 @@ msgstr "" #~ msgid "Export all files in the project directory." #~ msgstr "Exportiere alle Dateien in das Projektverzeichnis." - -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Bilder (innerhalb) einfügen" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 5f92cabbee..f9408cfbbc 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -399,13 +399,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3659,6 +3667,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4610,7 +4623,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4681,6 +4718,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5031,52 +5114,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5580,7 +5626,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6398,6 +6444,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6410,15 +6472,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6989,6 +7071,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8138,10 +8224,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index ab99259302..b6cf0f79dc 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -430,13 +430,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Ομαδοποίηση κομματιών ανα κόμβο, ή εμφάνιση σε λίστα." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "ΚοÏμπωμα (s): " +#, fuzzy +msgid "Snap:" +msgstr "ΚοÏμπωμα" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Τιμή βήματος κίνησης." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3897,6 +3906,11 @@ msgid "Delete Node" msgstr "ΔιαγÏαφή Κόμβων" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "ΔιαγÏαφή Κόμβων" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Εναλλαγή ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï on/off." @@ -4885,8 +4899,34 @@ msgid "Layout" msgstr "Διάταξη" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Εισαγωγή κλειδιών." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Εισαγωγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï (ΥπαÏκτά κομμάτια)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim εισαγωγή κλειδιοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4959,6 +4999,52 @@ msgstr "ΕπεγεÏγασία πολυγώνου (ΑφαίÏεση σημείο msgid "Set Handle" msgstr "ΟÏισμός λαβής" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Σφάλμα κατά την φόÏτωση εικόνας:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Δεν υπάÏχουν εικονοστοιχεία με διαφάνεια >128 στην εικόνα..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "ΦόÏτωση μάσκας εκπομπής" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ΕκκαθάÏιση μάσκας εκπομπής" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Σωματίδια" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "ΑÏιθμός δημιουÏγημÎνων σημείων:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Μάσκα εκπομπής" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "ΚαταγÏαφή από εικονοστοιχείο" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "ΧÏώματα εκπομπής" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "Σωματίδια CPU" @@ -5314,52 +5400,15 @@ msgstr "" "ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Σφάλμα κατά την φόÏτωση εικόνας:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Δεν υπάÏχουν εικονοστοιχεία με διαφάνεια >128 στην εικόνα..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "ΦόÏτωση μάσκας εκπομπής" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ΕκκαθάÏιση μάσκας εκπομπής" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "ΜετατÏοπή σε σωματίδια CPU" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Σωματίδια" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "ΑÏιθμός δημιουÏγημÎνων σημείων:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "ΧÏόνος παÏαγωγής (sec):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Μάσκα εκπομπής" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "ΚαταγÏαφή από εικονοστοιχείο" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "ΧÏώματα εκπομπής" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Οι επιφάνειες Îχουν μηδενικό εμβαδόν!" @@ -5897,7 +5946,8 @@ msgid "Save Theme As..." msgstr "Αποθήκευση θÎματος ως..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " ΑναφοÏά κλασεων" #: editor/plugins/script_editor_plugin.cpp @@ -6750,6 +6800,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "ΔημιουÏγία πλÎγματος πεÏιγÏάμματος" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Δημιουγία πολυγώνου" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "ΔημιουÏγία πολυγώνου πλοήγησης" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "ΔημιουÏγία πολυγώνου εμποδίου" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Η διαδÏομή αποθήκευσης είναι άδεια!" @@ -6762,19 +6832,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "KαÏÎ Sprite" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "ΜετατÏοπή σε %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "ΔημιουÏγία πλÎγματος πεÏιγÏάμματος" +msgid "Convert to Polygon2D" +msgstr "Μετακίνηση πολυγώνου" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "ΔημιουÏγία πολυγώνου πλοήγησης" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "ΔημιουÏγία πολυγώνου εμποδίου" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7402,6 +7494,11 @@ msgid "Duplicate Nodes" msgstr "Διπλασιασμός κόμβων" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "ΔιαγÏαφή Κόμβων" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8635,10 +8732,6 @@ msgid "Open documentation" msgstr "Άνοιγμα ηλεκτÏονικής τεκμηÏίωσης της Godot" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "ΔιαγÏαφή Κόμβων" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Î Ïοσθήκη κόμβου ως παιδί" @@ -10536,14 +10629,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#~ msgid "Snap (s): " +#~ msgstr "ΚοÏμπωμα (s): " + +#~ msgid "Insert keys." +#~ msgstr "Εισαγωγή κλειδιών." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "ΔημιουÏγία στιγμιοτÏπων των επιλεγμÎνων σκηνών ως παιδιά του επιλεγμÎνου " #~ "κόμβου." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Î Ïοειδοποιήσεις:" diff --git a/editor/translations/es.po b/editor/translations/es.po index 22907ff2ea..f66b06cccd 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -42,8 +42,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-04-05 13:04+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2019-04-19 16:33+0000\n" +"Last-Translator: eon-s <emanuel.segretin@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -453,13 +453,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Snap (s): " +#, fuzzy +msgid "Snap:" +msgstr "Snap" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valor de step de animación." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -2513,7 +2522,7 @@ msgstr "Documentación en lÃnea" #: editor/editor_node.cpp msgid "Q&A" -msgstr "P&R" +msgstr "Preguntas y respuestas" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -3861,6 +3870,11 @@ msgid "Delete Node" msgstr "Eliminar Nodo" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Eliminar nodo(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Act./Desact. Filtro On/Off" @@ -4841,8 +4855,34 @@ msgid "Layout" msgstr "Disposición" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Insertar claves." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Insertar Claves (Ins)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Insertar clave de animación" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4914,6 +4954,52 @@ msgstr "Editar polÃgono (quitar punto)" msgid "Set Handle" msgstr "Establecer handle" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Error al cargar la imagen:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "No hay pÃxeles con transparencia > 128 en la imagen..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Cargar máscara de emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Borrar máscara de emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "PartÃculas" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Conteo de puntos generados:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Máscara de Emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturar desde pÃxel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Colores de Emisión" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5271,52 +5357,15 @@ msgstr "" "Solo se puede asignar un punto a un material de procesado ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Error al cargar la imagen:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "No hay pÃxeles con transparencia > 128 en la imagen..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Cargar máscara de emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Borrar máscara de emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Convertir a CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "PartÃculas" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Conteo de puntos generados:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Tiempo de generación (seg):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Máscara de Emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturar desde pÃxel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Colores de Emisión" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "¡Las caras no contienen área!" @@ -5828,7 +5877,8 @@ msgid "Save Theme As..." msgstr "Guardar tema como..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Referencia de clase" #: editor/plugins/script_editor_plugin.cpp @@ -6653,6 +6703,26 @@ msgid "Nameless gizmo" msgstr "Gizmo sin nombre" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Crear Mesh 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Crear Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Crear PolÃgono de Colisión" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Crear polÃgono oclusor" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "¡El sprite esta vacÃo!" @@ -6665,16 +6735,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Convertir a Mesh 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Crear Mesh 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Mover polÃgono" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Crear PolÃgono de Colisión" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Crear polÃgono oclusor" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7260,6 +7357,11 @@ msgid "Duplicate Nodes" msgstr "Duplicar Nodos" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Eliminar Nodo" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Cambiar Tipo de Entrada del Visual Shader" @@ -8483,10 +8585,6 @@ msgid "Open documentation" msgstr "Abrir documentación" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Eliminar nodo(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Añadir nodo hijo" @@ -10385,13 +10483,16 @@ msgstr "Asignación a uniform." msgid "Varyings can only be assigned in vertex function." msgstr "Solo se pueden asignar variaciones en funciones de vértice." +#~ msgid "Snap (s): " +#~ msgstr "Snap (s): " + +#~ msgid "Insert keys." +#~ msgstr "Insertar claves." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Advertencias:" @@ -11964,9 +12065,6 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." #~ msgid "Cannot go into subdir:" #~ msgstr "No se puede acceder al subdir:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Insertar Claves (Ins)" - #~ msgid "Top (Num7)" #~ msgstr "Cima (Num7)" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index da204947b0..e27603d799 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -423,13 +423,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Ajuste (s): " +#, fuzzy +msgid "Snap:" +msgstr "Esnapear" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valor de paso de animación." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3827,6 +3836,11 @@ msgid "Delete Node" msgstr "Eliminar Nodo" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Eliminar Nodo(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Act./Desact. Filtro On/Off" @@ -4806,8 +4820,34 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Insertar claves." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Insertar Claves (Ins)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Insertar Clave de Animación" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4879,6 +4919,52 @@ msgstr "Editar PolÃgono (Remover Punto)" msgid "Set Handle" msgstr "Setear Handle" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Error al cargar la imagen:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Sin pixeles con transparencia > 128 en imagen..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Cargar Máscara de Emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Limpiar Máscara de Emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "PartÃculas" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Conteo de Puntos Generados:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Máscara de Emisión" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturar desde Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Colores de Emisión" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5231,52 +5317,15 @@ msgstr "" "Solo se puede setear un punto en un material de proceso ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Error al cargar la imagen:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Sin pixeles con transparencia > 128 en imagen..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Cargar Máscara de Emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Limpiar Máscara de Emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Convertir A CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "PartÃculas" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Conteo de Puntos Generados:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Tiempo de Generación (seg):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Máscara de Emisión" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturar desde Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Colores de Emisión" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Las caras no contienen area!" @@ -5788,7 +5837,8 @@ msgid "Save Theme As..." msgstr "Guardar Tema Como..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Referencia de Clases" #: editor/plugins/script_editor_plugin.cpp @@ -6613,6 +6663,26 @@ msgid "Nameless gizmo" msgstr "Gizmo sin nombre" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Crear Mesh 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Crear Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Crear PolÃgono de Colisión" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Crear PolÃgono Oclusor" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "El sprite esta vacÃo!" @@ -6625,16 +6695,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "GeometrÃa inválida, no se puede reemplazar por mesh." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Convertir A Mesh 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Crear Mesh 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Mover PolÃgono" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Crear PolÃgono de Colisión" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Crear PolÃgono Oclusor" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7219,6 +7316,11 @@ msgid "Duplicate Nodes" msgstr "Duplicar Nodos" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Eliminar Nodo" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Se cambió el Tipo de Entrada de Visual Shader" @@ -8444,10 +8546,6 @@ msgid "Open documentation" msgstr "Abrir documentación" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Eliminar Nodo(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Agregar Nodo Hijo" @@ -10337,13 +10435,16 @@ msgstr "Asignación a uniform." msgid "Varyings can only be assigned in vertex function." msgstr "Solo se pueden asignar variaciones en funciones de vértice." +#~ msgid "Snap (s): " +#~ msgstr "Ajuste (s): " + +#~ msgid "Insert keys." +#~ msgstr "Insertar claves." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Advertencias:" @@ -11892,9 +11993,6 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." #~ msgid "Cannot go into subdir:" #~ msgstr "No se puede acceder al subdir:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Insertar Claves (Ins)" - #~ msgid "Top (Num7)" #~ msgstr "Cima (Num7)" diff --git a/editor/translations/et.po b/editor/translations/et.po index a58094bf47..455623f6aa 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -399,13 +399,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3659,6 +3667,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4610,7 +4623,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4681,6 +4718,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5031,52 +5114,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5580,7 +5626,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6398,6 +6444,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6410,15 +6472,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6989,6 +7071,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8138,10 +8224,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 6548423140..445b941a96 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -441,7 +441,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "گام(ها):" #: editor/animation_track_editor.cpp @@ -449,6 +449,14 @@ msgstr "گام(ها):" msgid "Animation step value." msgstr "گره انیمیشن" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3837,6 +3845,11 @@ msgid "Delete Node" msgstr "Øذ٠گره(ها)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Øذ٠گره(ها)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4826,8 +4839,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "کلید را در انیمیشن درج Ú©Ù†" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "کلید را در انیمیشن درج Ú©Ù†" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4900,6 +4938,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5254,22 +5338,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5277,30 +5345,9 @@ msgstr "اتصال به گره:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5832,7 +5879,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6686,6 +6733,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "ساختن %s جدید" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "انتخاب شده را تغییر مقیاس بده" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "انتخاب شده را تغییر مقیاس بده" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "ساختن پوشه" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "مسیر خالی است" @@ -6698,18 +6765,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "اتصال به گره:" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "ساختن %s جدید" +msgid "Convert to Polygon2D" +msgstr "اتصال به گره:" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "انتخاب شده را تغییر مقیاس بده" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7325,6 +7413,11 @@ msgid "Duplicate Nodes" msgstr "تکرار کلید‌های انیمیشن" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Øذ٠گره(ها)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8527,10 +8620,6 @@ msgid "Open documentation" msgstr "شمارش ها" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Øذ٠گره(ها)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "اÙزودن گره Ùرزند" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 7924d22ba0..117aaa6561 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -416,13 +416,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Ryhmitä raidat solmujen mukaan tai näytä ne tavallisena luettelona." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Askellus (s): " +#, fuzzy +msgid "Snap:" +msgstr "Tartu" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Animaation askelluksen arvo." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3801,6 +3810,11 @@ msgid "Delete Node" msgstr "Poista solmu" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Poista solmu(t)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Kytke suodin päälle/pois" @@ -4777,8 +4791,34 @@ msgid "Layout" msgstr "Asettelu" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Lisää avainruutuja." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Lisää avainruutu (olemassa olevat raidat)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Animaatio: Lisää avain" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4850,6 +4890,52 @@ msgstr "Muokkaa polygonia (poista piste)" msgid "Set Handle" msgstr "Aseta kahva" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Virhe ladattaessa kuvaa:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Kuvassa ei ole pikseleitä, joiden läpinäkyvyys on enemmän kuin 128…" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Lataa emissiomaski" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Tyhjennä emissiomaski" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partikkelit" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Luotujen pisteiden määrä:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Emission maski" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Nappaa pikselistä" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Emission väri" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUPartikkelit" @@ -5203,52 +5289,15 @@ msgstr "" "Piste voidaan asettaa ainoastaan ParticlesMaterial käsittelyn materiaaliin" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Virhe ladattaessa kuvaa:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Kuvassa ei ole pikseleitä, joiden läpinäkyvyys on enemmän kuin 128…" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Lataa emissiomaski" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Tyhjennä emissiomaski" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Muunna CPUPartikkeleiksi" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Partikkelit" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Luotujen pisteiden määrä:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Luontiaika (s):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Emission maski" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Nappaa pikselistä" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Emission väri" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Pinnat eivät sisällä aluetta!" @@ -5759,7 +5808,8 @@ msgid "Save Theme As..." msgstr "Tallenna teema nimellä..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Luokan referenssi" #: editor/plugins/script_editor_plugin.cpp @@ -6584,6 +6634,26 @@ msgid "Nameless gizmo" msgstr "Nimetön muokkain" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Luo 2D-mesh" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Luo Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Luo törmäyspolygoni" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Luo peittopolygoni" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite on tyhjä!" @@ -6596,16 +6666,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Virheellinen geometria, ei voida korvata meshillä." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Virheellinen geometria, ei voida korvata meshillä." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Virheellinen geometria, ei voida korvata meshillä." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Virheellinen geometria, ei voida korvata meshillä." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Muunna 2D-meshiksi" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Luo 2D-mesh" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Siirrä polygonia" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Luo törmäyspolygoni" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Luo peittopolygoni" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7190,6 +7287,11 @@ msgid "Duplicate Nodes" msgstr "Kahdenna solmut" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Poista solmu" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Visual Shaderin syötteen tyyppi vaihdettu" @@ -8406,10 +8508,6 @@ msgid "Open documentation" msgstr "Avaa dokumentaatio" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Poista solmu(t)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Lisää alisolmu" @@ -10279,12 +10377,15 @@ msgstr "Sijoitus uniformille." msgid "Varyings can only be assigned in vertex function." msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." +#~ msgid "Snap (s): " +#~ msgstr "Askellus (s): " + +#~ msgid "Insert keys." +#~ msgstr "Lisää avainruutuja." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Luo valituista skeneistä ilmentymä valitun solmun alle." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Varoitukset:" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 5160c5b3bc..aece9febdd 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -405,13 +405,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3665,6 +3673,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4616,7 +4629,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4687,6 +4724,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5037,52 +5120,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5586,7 +5632,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6404,6 +6450,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6416,15 +6478,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6995,6 +7077,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8144,10 +8230,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index a91f78a912..37175d7001 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -473,13 +473,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Grouper les pistes par nÅ“uds ou les afficher dans une liste simple." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Pas (s) : " +#, fuzzy +msgid "Snap:" +msgstr "Aligner" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valeur du pas d'animation." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "IPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3893,6 +3902,11 @@ msgid "Delete Node" msgstr "Supprimer un nÅ“ud" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Supprimer nÅ“ud(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Activer/désactiver le filtre" @@ -4873,8 +4887,34 @@ msgid "Layout" msgstr "Disposition sur l'écran" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Insérer les clefs." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Insérer une clé (pistes existantes)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Insérer une clé d'animation" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4946,6 +4986,52 @@ msgstr "Modifier le polygone (supprimer un point)" msgid "Set Handle" msgstr "Définir la poignée" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Erreur de chargement d'image :" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Pas de pixels avec transparence > 128 dans l'image..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Charger Masque d'Émission" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Effacer Masque d'Émission" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Particules" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Compte de Points Générés :" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Masque d'émission" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturer depuis Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Couleurs d'émission" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5305,52 +5391,15 @@ msgstr "" "Ne peut définir qu'un point dans un matériau de processus ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Erreur de chargement d'image :" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Pas de pixels avec transparence > 128 dans l'image..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Charger Masque d'Émission" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Effacer Masque d'Émission" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Convertir en CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Particules" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Compte de Points Générés :" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Temps de Génération (sec) :" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Masque d'émission" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturer depuis Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Couleurs d'émission" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Des faces ne contiennent pas de zone !" @@ -5862,7 +5911,8 @@ msgid "Save Theme As..." msgstr "Enregistrer le thème sous…" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Référence de classe" #: editor/plugins/script_editor_plugin.cpp @@ -6690,6 +6740,26 @@ msgid "Nameless gizmo" msgstr "Gadget sans nom" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Créer un maillage 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Créer un Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Créer le polygone de collision" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Créer un polygone occulteur" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Le sprite est vide !" @@ -6704,16 +6774,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Géométrie invalide, impossible de remplacer par un maillage." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Géométrie invalide, impossible de remplacer par un maillage." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Géométrie invalide, impossible de remplacer par un maillage." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Géométrie invalide, impossible de remplacer par un maillage." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Convertir en maillage 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Créer un maillage 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Déplacer le polygone" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Créer le polygone de collision" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Créer un polygone occulteur" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7300,6 +7397,11 @@ msgid "Duplicate Nodes" msgstr "Dupliquer le(s) nÅ“ud(s)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Supprimer un nÅ“ud" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Type d’entrée Visual Shader changée" @@ -8523,10 +8625,6 @@ msgid "Open documentation" msgstr "Ouvrir la documentation" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Supprimer nÅ“ud(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Ajouter un nÅ“ud enfant" @@ -10437,14 +10535,17 @@ msgstr "Affectation à l'uniforme." msgid "Varyings can only be assigned in vertex function." msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." +#~ msgid "Snap (s): " +#~ msgstr "Pas (s) : " + +#~ msgid "Insert keys." +#~ msgstr "Insérer les clefs." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instancie la(les) scène(s) sélectionnée(s) en tant qu'enfant(s) du nÅ“ud " #~ "sélectionné." -#~ msgid "FPS" -#~ msgstr "IPS" - #~ msgid "Warnings:" #~ msgstr "Avertissements :" diff --git a/editor/translations/he.po b/editor/translations/he.po index 1adcb6b56c..8ef45fd8d8 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -441,14 +441,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "צעד/×™×:" +msgid "Snap:" +msgstr "הצמדה" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "שקופיות ×”×”× ×¤×©×”" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3823,6 +3831,11 @@ msgid "Delete Node" msgstr "מחיקת שורה" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "החלפת מצב מועדפי×" @@ -4805,10 +4818,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "×”×›× ×¡ מפתח" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4877,6 +4915,52 @@ msgstr "עריכת מצולע (הסרת × ×§×•×“×”)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5229,22 +5313,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5252,30 +5320,9 @@ msgstr "המרה ל×ותיות גדולות" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5803,7 +5850,7 @@ msgid "Save Theme As..." msgstr "שמירת ערכת עיצוב בש×…" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6648,6 +6695,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "יצירת %s חדש" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "יצירת מצולע" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "יצירת מצולע" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "יצירת תיקייה" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6660,18 +6727,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "המרה ל×ותיות גדולות" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "יצירת %s חדש" +msgid "Convert to Polygon2D" +msgstr "הזזת מצולע" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "יצירת מצולע" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7280,6 +7368,11 @@ msgid "Duplicate Nodes" msgstr "שכפול" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "מחיקת שורה" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8465,10 +8558,6 @@ msgid "Open documentation" msgstr "פתיחת התיעוד המקוון של Godot" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10221,6 +10310,10 @@ msgid "Varyings can only be assigned in vertex function." msgstr "" #, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "צעד/×™×:" + +#, fuzzy #~ msgid "Warnings:" #~ msgstr "×זהרות" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 1758532805..f7bf57678d 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -424,13 +424,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3763,6 +3771,11 @@ msgid "Delete Node" msgstr "को हटा दें" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4724,10 +4737,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "चाबी यहां डालें" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4796,6 +4834,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5146,52 +5230,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5707,7 +5754,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6530,6 +6577,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "à¤à¤• नया बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "à¤à¤• नया बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6542,17 +6609,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "à¤à¤• नया बनाà¤à¤‚" +msgid "Convert to Polygon2D" +msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7143,6 +7231,11 @@ msgid "Duplicate Nodes" msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "को हटा दें" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8300,10 +8393,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 6cfdf720ba..a7501f9b14 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -404,13 +404,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3664,6 +3672,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4615,7 +4628,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4686,6 +4723,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5036,52 +5119,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5585,7 +5631,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6403,6 +6449,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6415,15 +6477,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6994,6 +7076,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8143,10 +8229,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 016e540184..2f1aa1b660 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -446,14 +446,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Lépés (mp):" +msgid "Snap:" +msgstr "Illesztés" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "Az animációs fa érvényes." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3935,6 +3943,11 @@ msgid "Delete Node" msgstr "Node létrehozás" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Zavarmentes mód váltása." @@ -4940,9 +4953,34 @@ msgid "Layout" msgstr "Elrendezés" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Kulcsok Beszúrása" +msgid "Insert keys (based on mask)." +msgstr "Kulcs Beszúrása (MeglévÅ‘ Nyomvonalakra)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Animáció kulcs beillesztés" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5015,6 +5053,52 @@ msgstr "Sokszög Szerkesztése (Pont EltávolÃtása)" msgid "Set Handle" msgstr "Fogantyú BeállÃtása" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Hiba a kép betöltésekor:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Nem létezik egyetlen pixel sem >128-as átlátszósággal a képben..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Kibocsátási Maszk Betöltése" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Kibocsátási Maszk Törlése" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Részecskék" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Generált Pontok Száma:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Kibocsátási Maszk" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Kinyerés PixelbÅ‘l" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Kibocsátási SzÃnek" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5369,22 +5453,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Csak egy ParticlesMaterial feldolgozó anyagba állÃthat pontot" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Hiba a kép betöltésekor:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Nem létezik egyetlen pixel sem >128-as átlátszósággal a képben..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Kibocsátási Maszk Betöltése" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Kibocsátási Maszk Törlése" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5392,30 +5460,9 @@ msgstr "Konvertálás Nagybetűsre" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Részecskék" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Generált Pontok Száma:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Generálási IdÅ‘ (mp):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Kibocsátási Maszk" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Kinyerés PixelbÅ‘l" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Kibocsátási SzÃnek" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Az oldalak nem tartalmaznak területet!" @@ -5953,7 +6000,8 @@ msgid "Save Theme As..." msgstr "Téma Mentése Másként..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Osztály Referencia" #: editor/plugins/script_editor_plugin.cpp @@ -6796,6 +6844,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Körvonalháló KészÃtése" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Sokszög Létrehozása" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Navigációs Sokszög Létrehozása" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Ãrnyékoló Sokszög Létrehozása" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "A háló üres!" @@ -6808,18 +6876,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Konvertálás Nagybetűsre" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Körvonalháló KészÃtése" +msgid "Convert to Polygon2D" +msgstr "Sokszög Mozgatása" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Navigációs Sokszög Létrehozása" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Ãrnyékoló Sokszög Létrehozása" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7433,6 +7523,11 @@ msgid "Duplicate Nodes" msgstr "Animáció kulcsok megkettÅ‘zése" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Node létrehozás" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8612,10 +8707,6 @@ msgid "Open documentation" msgstr "Godot online dokumentáció megnyitása" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10385,6 +10476,14 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Lépés (mp):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Kulcsok Beszúrása" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Kiválasztott Scene(k) példányosÃtása a kiválasztott Node gyermekeként." diff --git a/editor/translations/id.po b/editor/translations/id.po index a277a3b3e2..876990c0c1 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -430,13 +430,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa." #: editor/animation_track_editor.cpp -msgid "Snap (s): " +#, fuzzy +msgid "Snap:" msgstr "Snap (d): " #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Nilai Langkah Animasi." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3901,6 +3910,11 @@ msgid "Delete Node" msgstr "Metode Publik:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Alihkan track ini ke nyala/mati." @@ -4926,8 +4940,33 @@ msgid "Layout" msgstr "Simpan Penampilan" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Sisipkan Key Anim" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Sisipkan Key Anim" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5001,6 +5040,52 @@ msgstr "Sunting Bidang (Hapus Titik)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Galat saat memuat gambar:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partikel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5361,22 +5446,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Galat saat memuat gambar:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5384,30 +5453,9 @@ msgstr "Sambungkan Ke Node:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Partikel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5944,7 +5992,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6804,6 +6852,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Buat Baru %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Buat Bidang" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Buat Bidang" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Buat Folder" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6816,18 +6884,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Sambungkan Ke Node:" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Buat Baru %s" +msgid "Convert to Polygon2D" +msgstr "Sambungkan Ke Node:" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Buat Bidang" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7448,6 +7537,11 @@ msgid "Duplicate Nodes" msgstr "Duplikat Key" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Metode Publik:" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8669,10 +8763,6 @@ msgid "Open documentation" msgstr "Buka baru-baru ini" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 644f19939b..cc911642be 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -426,13 +426,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3699,6 +3707,11 @@ msgid "Delete Node" msgstr "Anim DELETE-lyklar" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4656,7 +4669,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4727,6 +4764,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5077,52 +5160,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5629,7 +5675,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6447,6 +6493,24 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Afrita val" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Breyta Viðbót" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6459,15 +6523,36 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Breyta Viðbót" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7052,6 +7137,11 @@ msgid "Duplicate Nodes" msgstr "TvÃteknir lyklar" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Anim DELETE-lyklar" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8205,10 +8295,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 30c4d6a3b9..3dbfa81714 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -37,8 +37,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-30 20:04+0000\n" -"Last-Translator: Marco Melorio <m.melorio@icloud.com>\n" +"PO-Revision-Date: 2019-04-14 13:04+0000\n" +"Last-Translator: Marco Galli <mrcgll98@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -446,13 +446,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Raggruppa le tracce per nodo o mostra una lista semplice." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Snap (s): " +#, fuzzy +msgid "Snap:" +msgstr "Snap" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valore del passo dell'animazione." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3851,6 +3860,11 @@ msgid "Delete Node" msgstr "Elimina Nodo" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Elimina Nodo(i)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Attiva/Disattiva il Filtro" @@ -4831,8 +4845,34 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Inserisci chiavi." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Inserisci Keys (Ins)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Inserisci una chiave d'animazione" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4904,6 +4944,52 @@ msgstr "Modifica Poly (Rimuovi Punto)" msgid "Set Handle" msgstr "Imposta Maniglia" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Errore di caricamento immagine:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Nessun pixel con trasparenza >128 nell'immagine..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Carica Maschera Emissione" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Cancella Maschera Emissione" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Particelle" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Conteggio Punti Generati:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Maschera Emissione" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Cattura da Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Colori Emissione" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5259,52 +5345,15 @@ msgstr "" "ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Errore di caricamento immagine:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Nessun pixel con trasparenza >128 nell'immagine..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Carica Maschera Emissione" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Cancella Maschera Emissione" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Converti in CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Particelle" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Conteggio Punti Generati:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Tempo di Generazione (sec):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Maschera Emissione" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Cattura da Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Colori Emissione" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Le facce non contengono area!" @@ -5818,7 +5867,8 @@ msgid "Save Theme As..." msgstr "Salva Tema Come..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Riferimento di Classe" #: editor/plugins/script_editor_plugin.cpp @@ -6645,6 +6695,26 @@ msgid "Nameless gizmo" msgstr "Gizmo senza nome" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Crea Mesh 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Crea Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Crea Poligono di Collisione" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Crea Poligono di occlusione" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Lo sprite è vuoto!" @@ -6659,16 +6729,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria non valida, impossibile sostituirla con una mesh." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Geometria non valida, impossibile sostituirla con una mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Geometria non valida, impossibile sostituirla con una mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Geometria non valida, impossibile sostituirla con una mesh." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Converti in Mesh 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Crea Mesh 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Sposta Poligono" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Crea Poligono di Collisione" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Crea Poligono di occlusione" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7255,6 +7352,11 @@ msgid "Duplicate Nodes" msgstr "Duplica Nodi" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Elimina Nodo" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Tipo di Input Visual Shader Cambiato" @@ -8475,10 +8577,6 @@ msgid "Open documentation" msgstr "Apri la documentazione" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Elimina Nodo(i)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Aggiungi Nodo Figlio" @@ -10376,12 +10474,15 @@ msgstr "Assegnazione all'uniforme." msgid "Varyings can only be assigned in vertex function." msgstr "Varyings può essere assegnato solo nella funzione del vertice." +#~ msgid "Snap (s): " +#~ msgstr "Snap (s): " + +#~ msgid "Insert keys." +#~ msgstr "Inserisci chiavi." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Istanzia le scene selezionate come figlie del nodo selezionato." -#~ msgid "FPS" -#~ msgstr "FPS" - #, fuzzy #~ msgid "Warnings:" #~ msgstr "Avvertimento" @@ -11928,9 +12029,6 @@ msgstr "Varyings può essere assegnato solo nella funzione del vertice." #~ msgid "Cannot go into subdir:" #~ msgstr "Impossibile accedere alla subdirectory:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Inserisci Keys (Ins)" - #~ msgid "Top (Num7)" #~ msgstr "Alto (Num7)" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 6ab3436f15..67a472c64d 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-19 15:04+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2019-04-19 16:33+0000\n" +"Last-Translator: Wataru Onuki <watonu@magadou.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -445,13 +445,22 @@ msgstr "" "ノードã”ã¨ã«ãƒˆãƒ©ãƒƒã‚¯ã‚’グループ化ã™ã‚‹ã‹ã€ãƒ—レーンãªãƒªã‚¹ãƒˆã¨ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚" #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "スナップ (秒): " +#, fuzzy +msgid "Snap:" +msgstr "スナップ" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "アニメーションステップã®å€¤ã€‚" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "フレームレート" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -2329,7 +2338,7 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®è¨å®š" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®š" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" @@ -3843,6 +3852,11 @@ msgid "Delete Node" msgstr "ノードを削除" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "ノードを削除" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã® オン/オフ を切り替ãˆã€‚" @@ -4827,8 +4841,34 @@ msgid "Layout" msgstr "レイアウト" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "ã‚ーを挿入ã™ã‚‹ã€‚" +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "ã‚ーを (æ—¢å˜ã®ãƒˆãƒ©ãƒƒã‚¯ã«) 挿入" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "アニメーションã‚ーを挿入" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -4904,6 +4944,55 @@ msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" msgid "Set Handle" msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "ç”»åƒèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "ç”»åƒå†…ã«é€æ˜Žåº¦ãŒ128以上ã®ãƒ”クセルãŒã‚ã‚Šã¾ã›ã‚“..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Load Emission Mask" +msgstr "発光(Emission)マスクをèªã¿è¾¼ã‚€" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Clear Emission Mask" +msgstr "発光(Emission)マスクをクリア" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "パーティクル" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "生æˆã—ãŸãƒã‚¤ãƒ³ãƒˆã®æ•°:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "発光(Emission)マスク" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "ピクセルã‹ã‚‰å–å¾—" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "発光(Emission)色" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUパーティクル" @@ -5281,55 +5370,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "ç”»åƒèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "ç”»åƒå†…ã«é€æ˜Žåº¦ãŒ128以上ã®ãƒ”クセルãŒã‚ã‚Šã¾ã›ã‚“..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Load Emission Mask" -msgstr "発光(Emission)マスクをèªã¿è¾¼ã‚€" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Clear Emission Mask" -msgstr "発光(Emission)マスクをクリア" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "CPUパーティクルã«å¤‰æ›" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "パーティクル" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "生æˆã—ãŸãƒã‚¤ãƒ³ãƒˆã®æ•°:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "生æˆæ™‚é–“ (秒):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "発光(Emission)マスク" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Capture from Pixel" -msgstr "ピクセルã‹ã‚‰å–å¾—" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "発光(Emission)色" - #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Faces contain no area!" @@ -5870,7 +5919,8 @@ msgid "Save Theme As..." msgstr "テーマをåå‰ã‚’ã¤ã‘ã¦ä¿å˜..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " クラスリファレンス" #: editor/plugins/script_editor_plugin.cpp @@ -6392,9 +6442,8 @@ msgid "This operation requires a single selected node." msgstr "一ã¤ãƒŽãƒ¼ãƒ‰ã‚’指定ã—ãªã„ã¨ã€ã“ã®æ“作ã¯ã§ãã¾ã›ã‚“" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock View Rotation" -msgstr "æƒ…å ±ã‚’è¡¨ç¤º" +msgstr "ビューã®å›žè»¢ã‚’固定" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -6602,7 +6651,7 @@ msgstr "トランスフォーム" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap object to floor" -msgstr "" +msgstr "オブジェクトを底é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -6719,6 +6768,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "アウトラインメッシュを生æˆ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Polygon3Dを生æˆ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "コリジョン ãƒãƒªã‚´ãƒ³ã‚’生æˆ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "オクルーダーãƒãƒªã‚´ãƒ³ã‚’生æˆ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "ä¿å˜ã™ã‚‹ãƒ‘スãŒã‚ã‚Šã¾ã›ã‚“!" @@ -6731,17 +6800,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "スプライト" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "2Dメッシュã«å¤‰æ›" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "アウトラインメッシュを生æˆ" +msgid "Convert to Polygon2D" +msgstr "ãƒãƒªã‚´ãƒ³ã‚’移動" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "コリジョン ãƒãƒªã‚´ãƒ³ã‚’生æˆ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "オクルーダーãƒãƒªã‚´ãƒ³ã‚’生æˆ" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7361,6 +7453,11 @@ msgid "Duplicate Nodes" msgstr "ノードを複製" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "ノードを削除" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -7410,6 +7507,8 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"プラットフォーム'%s' ã¸ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n" +"エクスãƒãƒ¼ãƒˆç”¨ãƒ†ãƒ³ãƒ—レートãŒå˜åœ¨ã—ãªã„ã‹ã€ã‚ã‚‹ã„ã¯ç•°å¸¸ã§ã‚るよã†ã§ã™ã€‚" #: editor/project_export.cpp msgid "" @@ -7417,6 +7516,9 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" +"プラットフォーム'%s' ã¸ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n" +"エクスãƒãƒ¼ãƒˆç”¨ãƒ—リセットã‚ã‚‹ã„ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆè¨å®šã«å•é¡ŒãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾" +"ã™ã€‚" #: editor/project_export.cpp #, fuzzy @@ -7724,9 +7826,8 @@ msgid "Unnamed Project" msgstr "åç„¡ã—ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project at '%s'." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ã¾ã›ã‚“" +msgstr "次ã®å ´æ‰€ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ã¾ã›ã‚“ '%s'。" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -7771,7 +7872,6 @@ msgid "" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in \"Project Settings\" under " @@ -7779,7 +7879,7 @@ msgid "" msgstr "" "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã€ã‚·ãƒ¼ãƒ³ ファイルã§ã¯ã‚ã‚Šã¾ã›ã‚“ã€æœ‰åŠ¹ãªã‚‚ã®ã‚’é¸æŠžã—ã¦ã„" "ã¾ã™ã‹ï¼Ÿ\n" -"'アプリケーション' カテゴリã®ä¸‹ã®'プãƒã‚¸ã‚§ã‚¯ãƒˆã®è¨å®š'ã§å¤‰æ›´ã§ãã¾ã™ã€‚" +"'アプリケーション' カテゴリã®ä¸‹ã®'プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®š'ã§å¤‰æ›´ã§ãã¾ã™ã€‚" #: editor/project_manager.cpp msgid "" @@ -8609,10 +8709,6 @@ msgid "Open documentation" msgstr "ドã‚ュメントを開ã" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "ノードを削除" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "åãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ " @@ -10551,12 +10647,15 @@ msgstr "uniform ã¸ã®å‰²ã‚Šå½“ã¦ã€‚" msgid "Varyings can only be assigned in vertex function." msgstr "Varyingã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +#~ msgid "Snap (s): " +#~ msgstr "スナップ (秒): " + +#~ msgid "Insert keys." +#~ msgstr "ã‚ーを挿入ã™ã‚‹ã€‚" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ã‚’é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®åã¨ã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã—ã¾ã™ã€‚" -#~ msgid "FPS" -#~ msgstr "フレームレート" - #~ msgid "Warnings:" #~ msgstr "è¦å‘Š:" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index cb8aed504b..26eabd113b 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -441,13 +441,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "დáƒáƒáƒ¯áƒ’უფე ჩáƒáƒœáƒáƒ¬áƒ”რები კვáƒáƒœáƒ«áƒ”ბის მიხედვით áƒáƒœ áƒáƒ©áƒ•áƒ”ნე რáƒáƒ’áƒáƒ ც უბრáƒáƒšáƒ სიáƒ." #: editor/animation_track_editor.cpp -msgid "Snap (s): " +#, fuzzy +msgid "Snap:" msgstr "ნáƒáƒ‘იჯი (s): " #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ‘იჯის ღირებულებáƒ." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3758,6 +3767,11 @@ msgid "Delete Node" msgstr "წáƒáƒ¨áƒšáƒ" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის ჩáƒáƒ თვრ/ გáƒáƒ›áƒáƒ თვáƒ" @@ -4723,8 +4737,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "áƒáƒœáƒ˜áƒ› გáƒáƒ¡áƒáƒ¦áƒ”ბის ჩáƒáƒ§áƒ”ნებáƒ" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "áƒáƒœáƒ˜áƒ› გáƒáƒ¡áƒáƒ¦áƒ”ბის ჩáƒáƒ§áƒ”ნებáƒ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4796,6 +4835,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5146,52 +5231,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5706,7 +5754,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6532,6 +6580,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "áƒáƒ®áƒáƒšáƒ˜ %s შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6544,17 +6612,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "áƒáƒ®áƒáƒšáƒ˜ %s შექმნáƒ" +msgid "Convert to Polygon2D" +msgstr "შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "შექმნáƒ" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7146,6 +7235,11 @@ msgid "Duplicate Nodes" msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "წáƒáƒ¨áƒšáƒ" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8301,10 +8395,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index c50d35d69b..eb7964f81d 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -422,13 +422,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "노드 별로 ê·¸ë£¹ì„ íŠ¸ëž™ 하거나 ì¼ë°˜ 목ë¡ìœ¼ë¡œ 표시합니다." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "스냅: " +#, fuzzy +msgid "Snap:" +msgstr "스냅" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "ì• ë‹ˆë©”ì´ì…˜ 단계 ê°’." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "초당 í”„ë ˆìž„" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3792,6 +3801,11 @@ msgid "Delete Node" msgstr "노드 ì‚ì œ" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "노드 ì‚ì œ" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "í•„í„° 켜기/ë„기 í† ê¸€" @@ -4758,8 +4772,34 @@ msgid "Layout" msgstr "ë ˆì´ì•„웃" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "키 삽입." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "키 삽입 (Ins 키)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 키 삽입" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4831,6 +4871,52 @@ msgstr "í´ë¦¬ê³¤ 편집 (ì ì‚ì œ)" msgid "Set Handle" msgstr "핸들 ì„¤ì •" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "ì´ë¯¸ì§€ 불러오기 오류:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "ì´ë¯¸ì§€ì— 투명ë„ê°€ 128보다 í° í”½ì…€ì´ ì—†ìŠµë‹ˆë‹¤..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ì—미션 ë§ˆìŠ¤í¬ ì •ë¦¬" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "파티í´" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "ìƒì„±ëœ í¬ì¸íŠ¸ 개수:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "ì—미션 마스í¬(Emission Mask)" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "픽셀로부터 캡ì³" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "ì—미션 ì¹¼ë¼" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPU파티í´" @@ -5181,52 +5267,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "ì˜¤ì§ ParticlesMaterial 프로세스 메테리얼 ì•ˆì˜ í¬ì¸íŠ¸ë§Œ ì„¤ì • 가능" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "ì´ë¯¸ì§€ 불러오기 오류:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "ì´ë¯¸ì§€ì— 투명ë„ê°€ 128보다 í° í”½ì…€ì´ ì—†ìŠµë‹ˆë‹¤..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ì—미션 ë§ˆìŠ¤í¬ ì •ë¦¬" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "CPU파티í´ë¡œ 변환" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "파티í´" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "ìƒì„±ëœ í¬ì¸íŠ¸ 개수:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "ìƒì„± 시간 (ì´ˆ):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "ì—미션 마스í¬(Emission Mask)" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "픽셀로부터 캡ì³" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "ì—미션 ì¹¼ë¼" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "페ì´ìŠ¤ê°€ ì˜ì—ì„ ê°€ì§€ê³ ìžˆì§€ 않습니다!" @@ -5736,7 +5785,8 @@ msgid "Save Theme As..." msgstr "테마 다른 ì´ë¦„으로 ì €ìž¥..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " í´ëž˜ìŠ¤ ë ˆí¼ëŸ°ìŠ¤" #: editor/plugins/script_editor_plugin.cpp @@ -6562,6 +6612,26 @@ msgid "Nameless gizmo" msgstr "ì´ë¦„없는 오브ì íŠ¸ì˜ ì¤‘ì‹¬ì " #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "2D 메시 만들기" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "í´ë¦¬ê³¤3D 만들기" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "내비게ì´ì…˜ ì¶©ëŒ í´ë¦¬ê³¤ 만들기" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Occluder í´ë¦¬ê³¤ 만들기" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "스프ë¼ì´íŠ¸ê°€ 비었습니다!" @@ -6574,16 +6644,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ìƒ, 메시로 ëŒ€ì²´í• ìˆ˜ 없습니다." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ìƒ, 메시로 ëŒ€ì²´í• ìˆ˜ 없습니다." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ìƒ, 메시로 ëŒ€ì²´í• ìˆ˜ 없습니다." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ìƒ, 메시로 ëŒ€ì²´í• ìˆ˜ 없습니다." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "스프ë¼ì´íŠ¸" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "2D 메시로 ì „í™˜" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "2D 메시 만들기" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "í´ë¦¬ê³¤ ì´ë™" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "내비게ì´ì…˜ ì¶©ëŒ í´ë¦¬ê³¤ 만들기" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Occluder í´ë¦¬ê³¤ 만들기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7169,6 +7266,11 @@ msgid "Duplicate Nodes" msgstr "노드 ë³µì œ" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "노드 ì‚ì œ" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "비주얼 ì…°ì´ë” ìž…ë ¥ 타입 변경ë¨" @@ -8372,10 +8474,6 @@ msgid "Open documentation" msgstr "문서 열기" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "노드 ì‚ì œ" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "ìžì‹ 노드 추가" @@ -10226,12 +10324,15 @@ msgstr "ê· ì¼í•˜ê²Œ 배치함." msgid "Varyings can only be assigned in vertex function." msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 ì§€ì •í• ìˆ˜ 있습니다." +#~ msgid "Snap (s): " +#~ msgstr "스냅: " + +#~ msgid "Insert keys." +#~ msgstr "키 삽입." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "ì„ íƒëœ ì”¬ì„ ì„ íƒëœ ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ì¸ìŠ¤í„´ìŠ¤ 합니다." -#~ msgid "FPS" -#~ msgstr "초당 í”„ë ˆìž„" - #~ msgid "Warnings:" #~ msgstr "ê²½ê³ :" @@ -11709,9 +11810,6 @@ msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 ì§€ì •í• ìˆ˜ 있습니다. #~ msgid "Cannot go into subdir:" #~ msgstr "하위 ë””ë ‰í† ë¦¬ë¡œ ì´ë™í• 수 없습니다:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "키 삽입 (Ins 키)" - #~ msgid "Top (Num7)" #~ msgstr "윗면 (넘버패드7)" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 27fa42d705..22fe1747e6 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -425,7 +425,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Žingsnis(iai):" #: editor/animation_track_editor.cpp @@ -433,6 +433,14 @@ msgstr "Žingsnis(iai):" msgid "Animation step value." msgstr "Animacija" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3743,6 +3751,11 @@ msgid "Delete Node" msgstr "IÅ¡trinti EfektÄ…" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4715,7 +4728,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4787,6 +4824,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5137,52 +5220,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5701,7 +5747,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6524,6 +6570,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Sukurti NaujÄ…" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Keisti Poligono SkalÄ™" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Keisti Poligono SkalÄ™" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Sukurti" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6536,17 +6602,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Sukurti NaujÄ…" +msgid "Convert to Polygon2D" +msgstr "Keisti Poligono SkalÄ™" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Keisti Poligono SkalÄ™" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7142,6 +7229,11 @@ msgid "Duplicate Nodes" msgstr "Duplikuoti" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "IÅ¡trinti EfektÄ…" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8307,10 +8399,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 4c46135e35..a8acaaf300 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -424,13 +424,22 @@ msgstr "" "SagrupÄ“t celiņus atkarÄ«bÄ no mezgliem vai rÄdÄ«t tos vienkÄrÅ¡Ä sarakstÄ." #: editor/animation_track_editor.cpp -msgid "Snap (s): " +#, fuzzy +msgid "Snap:" msgstr "Solis (s): " #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "AnimÄcijas soļa vÄ“rtÄ«ba." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3736,6 +3745,11 @@ msgid "Delete Node" msgstr "IzdzÄ“st" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4697,10 +4711,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim ievietot atslÄ“gievietni" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4769,6 +4808,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5119,52 +5204,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5679,7 +5727,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6505,6 +6553,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Izveidot Jaunu %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Izveidot" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Izveidot" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Izveidot" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6517,17 +6585,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Izveidot Jaunu %s" +msgid "Convert to Polygon2D" +msgstr "Izveidot" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Izveidot" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7121,6 +7210,11 @@ msgid "Duplicate Nodes" msgstr "DublicÄ“t atslÄ“gvietnes" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "IzdzÄ“st" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8274,10 +8368,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index bd3832641d..30d76b28d3 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -397,13 +397,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3657,6 +3665,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4608,7 +4621,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4679,6 +4716,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5029,52 +5112,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5578,7 +5624,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6396,6 +6442,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6408,15 +6470,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6987,6 +7069,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8136,10 +8222,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index d029bdaacd..215ca3d2cc 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -405,13 +405,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3665,6 +3673,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4616,7 +4629,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4687,6 +4724,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5037,52 +5120,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5586,7 +5632,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6404,6 +6450,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6416,15 +6478,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6995,6 +7077,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8144,10 +8230,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 61fb10d582..f253cca02b 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -417,13 +417,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3683,6 +3691,11 @@ msgid "Delete Node" msgstr "Semua Pilihan" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4638,7 +4651,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4709,6 +4746,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5059,52 +5142,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5608,7 +5654,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6426,6 +6472,23 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Semua Pilihan" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6438,15 +6501,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7024,6 +7107,11 @@ msgid "Duplicate Nodes" msgstr "Anim Menduakan Kunci" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Semua Pilihan" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8175,10 +8263,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 405d71e43b..26bd0cc890 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -2,7 +2,7 @@ # Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. -# Allan Nordhøy <epost@anotheragency.no>, 2017-2018. +# Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019. # Anonymous <GentleSaucepan@protonmail.com>, 2017. # Elias <eliasnykrem@gmail.com>, 2018. # flesk <eivindkn@gmail.com>, 2017, 2019. @@ -12,12 +12,13 @@ # Norwegian Disaster <stian.furu.overbye@gmail.com>, 2017. # passeride <lukas@passeride.com>, 2017. # Byzantin <kasper-hoel@hotmail.com>, 2018. +# Hans-Marius ØverÃ¥s <hansmariusoveras@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-02-13 16:10+0000\n" -"Last-Translator: NicolaiF <nico-fre@hotmail.com>\n" +"PO-Revision-Date: 2019-04-23 15:48+0000\n" +"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -25,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.5-dev\n" +"X-Generator: Weblate 3.7-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -39,9 +40,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Ikke nok byte til dekodingsbyte, eller ugyldig format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %i (not passed) in expression" -msgstr "Ikke gyldig inndata %i (ikke bestÃ¥tt) i utrykket" +msgstr "Ugyldig inndata %i (ikke bestÃ¥tt) i utrykket" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -467,7 +467,7 @@ msgstr "Grupper spor etter node eller vis dem i en enkel liste." #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Steg:" #: editor/animation_track_editor.cpp @@ -475,6 +475,14 @@ msgstr "Steg:" msgid "Animation step value." msgstr "Animasjonstre er gyldig." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4001,6 +4009,11 @@ msgid "Delete Node" msgstr "Kutt Noder" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Vis/skjul distraksjonsfri modus." @@ -5015,9 +5028,34 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Sett inn Nøkler" +msgid "Insert keys (based on mask)." +msgstr "Sett inn Nøkkel (Eksisterende Spor)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim Sett Inn Nøkkel" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5091,6 +5129,52 @@ msgstr "Rediger Poly (Fjern Punkt)" msgid "Set Handle" msgstr "Sett Handle" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Feil ved innlasting av bilde:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Ingen piksler med gjennomsiktighet > 128 i bilde..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partikler" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5446,22 +5530,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Feil ved innlasting av bilde:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Ingen piksler med gjennomsiktighet > 128 i bilde..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5469,30 +5537,9 @@ msgstr "Konverter til store versaler" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Partikler" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -6038,7 +6085,8 @@ msgid "Save Theme As..." msgstr "Lagre Tema Som..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Klassereferanse" #: editor/plugins/script_editor_plugin.cpp @@ -6887,6 +6935,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Lag ny %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Lag Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Lag Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Lag mappe" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6899,18 +6967,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Konverter til store versaler" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Lag ny %s" +msgid "Convert to Polygon2D" +msgstr "Flytt Polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Lag Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7532,6 +7621,11 @@ msgid "Duplicate Nodes" msgstr "Anim Dupliser Nøkler" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Kutt Noder" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8239,7 +8333,7 @@ msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "" +msgstr "Generelt" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -8727,10 +8821,6 @@ msgid "Open documentation" msgstr "Ã…pne Godots nettbaserte dokumentasjon" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10528,6 +10618,10 @@ msgid "Varyings can only be assigned in vertex function." msgstr "" #, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Sett inn Nøkler" + +#, fuzzy #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Instanser den valgte scene(r) som barn av den valgte noden." diff --git a/editor/translations/nl.po b/editor/translations/nl.po index c0e046dc9b..6eb5a47d21 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -31,12 +31,13 @@ # Stijn Hinlopen <f.a.hinlopen@gmail.com>, 2019. # jef dered <themen098s@vivaldi.net>, 2019. # Alex H. <sandertjeh13@hotmail.com>, 2019. +# edouardgr <edouard.gruyters@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-28 09:36+0000\n" -"Last-Translator: Alex H. <sandertjeh13@hotmail.com>\n" +"PO-Revision-Date: 2019-04-25 11:54+0000\n" +"Last-Translator: edouardgr <edouard.gruyters@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -44,7 +45,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.6-dev\n" +"X-Generator: Weblate 3.7-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -450,13 +451,21 @@ msgstr "Sporen weergeven op basis van nodes of als lijst." #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Stap(pen):" +msgid "Snap:" +msgstr "Snap" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Animatie stap waarde." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3895,6 +3904,12 @@ msgid "Delete Node" msgstr "Alles Selecteren" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Delete Node(s)" +msgstr "Verwijder knooppunt(en)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Aan-uitschakelaar Track." @@ -4887,9 +4902,34 @@ msgid "Layout" msgstr "Indeling" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Voer Sleutels In" +msgid "Insert keys (based on mask)." +msgstr "Voeg Sleutel in (Bestaande Banen)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim Key Invoegen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4962,6 +5002,52 @@ msgstr "Bewerk Poly (Verwijder punt)" msgid "Set Handle" msgstr "Stel Handgreep In" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Error bij het laden van afbeelding:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Geen pixels met transparantie > 128 in afbeelding..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Laad Emissie Masker" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Leeg Emissie Masker" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partikels" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Telling Gegenereerde Punten:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Emissie Masker" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Neem uit Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Kleuren Emissie" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5324,22 +5410,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Kan punt alleen plaatsen in een PartikelsMateriaal proces materiaal" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Error bij het laden van afbeelding:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Geen pixels met transparantie > 128 in afbeelding..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Laad Emissie Masker" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Leeg Emissie Masker" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5347,30 +5417,9 @@ msgstr "Converteer Naar Hoofdletters" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Partikels" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Telling Gegenereerde Punten:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Genereer Tijd (sec):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Emissie Masker" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Neem uit Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Kleuren Emissie" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Vlakken bevatten geen gebied!" @@ -5916,7 +5965,8 @@ msgid "Save Theme As..." msgstr "Thema Opslaan Als..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Klasse Referentie" #: editor/plugins/script_editor_plugin.cpp @@ -6774,6 +6824,26 @@ msgstr "Naamloos apparaat" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Creëer Omlijning Mesh" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Creëer Poly" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Creëer Navigatie Polygoon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Creëer Occluder Polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Mesh is leeg!" @@ -6787,18 +6857,43 @@ msgstr "Ongeldige geometrie, kan niet worden vervangen door Mesh." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Ongeldige geometrie, kan niet worden vervangen door Mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Ongeldige geometrie, kan niet worden vervangen door Mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Ongeldige geometrie, kan niet worden vervangen door Mesh." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite" msgstr "Sprite-Frames" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Verbind Aan Node:" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Creëer Omlijning Mesh" +msgid "Convert to Polygon2D" +msgstr "Beweeg Polygon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Creëer Navigatie Polygoon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Creëer Occluder Polygon" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7417,6 +7512,11 @@ msgid "Duplicate Nodes" msgstr "Dupliceer Graaf Knooppunt(en)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Alles Selecteren" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Visuele Shader Invoertype Gewijzigd" @@ -8534,7 +8634,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "Instantie Scene(s)" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" @@ -8542,7 +8642,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Clear Script" -msgstr "" +msgstr "Script vrijmaken" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -8579,7 +8679,7 @@ msgstr "Klinkt logisch!" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" -msgstr "" +msgstr "Verwijder knooppunt(en)?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -8664,8 +8764,9 @@ msgid "" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Error saving scene." -msgstr "" +msgstr "Fout scene opslaan." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." @@ -8686,16 +8787,13 @@ msgid "Open documentation" msgstr "Open Godot online documentatie" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Change Type" -msgstr "" +msgstr "Verander Type" #: editor/scene_tree_dock.cpp #, fuzzy @@ -8721,12 +8819,13 @@ msgid "Copy Node Path" msgstr "Kopiëer Nodes" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Delete (No Confirm)" -msgstr "" +msgstr "Verwijder (Geen bevestiging)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node" -msgstr "" +msgstr "Voeg nieuwe knooppunt aan" #: editor/scene_tree_dock.cpp msgid "" @@ -8740,7 +8839,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "" +msgstr "Verwijder script van selecteerde knooppunt." #: editor/scene_tree_dock.cpp #, fuzzy @@ -8748,8 +8847,9 @@ msgid "Remote" msgstr "Verwijderen" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Local" -msgstr "" +msgstr "Lokaal" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -8761,8 +8861,9 @@ msgid "Toggle Visible" msgstr "Toggle Verborgen Bestanden" #: editor/scene_tree_editor.cpp +#, fuzzy msgid "Node configuration warning:" -msgstr "" +msgstr "Knooppunt configuratie waarschuwing:" #: editor/scene_tree_editor.cpp msgid "" @@ -10563,14 +10664,19 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Stap(pen):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Voer Sleutels In" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Maak een nieuwe kopie van de geselecteerde scene(s) als kind van de " #~ "geselecteerde knoop." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Waarschuwingen:" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 530417f63c..7923ebe539 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -37,8 +37,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-04-05 13:04+0000\n" -"Last-Translator: PrzemysÅ‚aw Pierzga <przemyslawpierzga@gmail.com>\n" +"PO-Revision-Date: 2019-04-25 11:54+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -47,7 +47,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.6-dev\n" +"X-Generator: Weblate 3.7-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -445,13 +445,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Grupuj Å›cieżki po wÄ™zÅ‚ach lub wyÅ›wietl je jako prostÄ… listÄ™." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "PrzyciÄ…ganie (s): " +#, fuzzy +msgid "Snap:" +msgstr "PrzyciÄ…gaj" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Wartość kroku animacji." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "Klatki na sekundÄ™" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3829,6 +3838,11 @@ msgid "Delete Node" msgstr "UsuÅ„ wÄ™zeÅ‚" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "UsuÅ„ wÄ™zeÅ‚ (wÄ™zÅ‚y)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "PrzeÅ‚Ä…cz filtrowanie" @@ -4807,8 +4821,34 @@ msgid "Layout" msgstr "UkÅ‚ad" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Wstaw klucze." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Wstaw klucz (istniejÄ…ce Å›cieżki)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Wstaw klatkÄ™ kluczowÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4861,7 +4901,7 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" -"PrzeciÄ…gnij i upuść + Shift: dodaj wÄ™zeÅ‚ równorzÄ™dny\n" +"PrzeciÄ…gnij i upuść + Shift: Dodaj wÄ™zeÅ‚ równorzÄ™dny\n" "PrzeciÄ…gnij i upuść + Alt: ZmieÅ„ typ wÄ™zÅ‚a" #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -4880,6 +4920,52 @@ msgstr "Edytuj wielokÄ…t (usuÅ„ punkty)" msgid "Set Handle" msgstr "Ustaw Uchwyt" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "BÅ‚Ä…d wczytywania obrazu:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Brak pikseli z przeźroczystoÅ›ciÄ… > 128 w obrazie..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Wczytaj maskÄ™ emisji" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "UsuÅ„ maskÄ™ emisji" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "CzÄ…steczki" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Wygeneruj chmurÄ™ punktów:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Maska emisji" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Przechwytywanie z piksela" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Kolor emisji" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CzÄ…steczki CPU" @@ -5230,52 +5316,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Punkt można wstawić tylko w materiaÅ‚ przetwarzania ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "BÅ‚Ä…d wczytywania obrazu:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Brak pikseli z przeźroczystoÅ›ciÄ… > 128 w obrazie..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Wczytaj maskÄ™ emisji" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "UsuÅ„ maskÄ™ emisji" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Przekonwertuj na czÄ…steczki CPU" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "CzÄ…steczki" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Wygeneruj chmurÄ™ punktów:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Czas generowania (sek):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Maska emisji" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Przechwytywanie z piksela" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Kolor emisji" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Åšciana nie ma powierzchni!" @@ -5785,7 +5834,8 @@ msgid "Save Theme As..." msgstr "Zapisz motyw jako..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " - referencja klasy" #: editor/plugins/script_editor_plugin.cpp @@ -6035,7 +6085,7 @@ msgstr "WciÄ™cie w prawo" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "Ustaw komentarz" +msgstr "PrzeÅ‚Ä…cz komentarz" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" @@ -6610,6 +6660,26 @@ msgid "Nameless gizmo" msgstr "Uchwyt bez nazwy" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Utwórz siatkÄ™ 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Utwórz WielokÄ…t3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Utwórz wielokÄ…t kolizji" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Stwórz Occluder Polygon" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite jest pusty!" @@ -6623,16 +6693,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "NieprawidÅ‚owa geometria, nie można zastÄ…pić przez siatkÄ™." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "NieprawidÅ‚owa geometria, nie można zastÄ…pić przez siatkÄ™." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "NieprawidÅ‚owa geometria, nie można zastÄ…pić przez siatkÄ™." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "NieprawidÅ‚owa geometria, nie można zastÄ…pić przez siatkÄ™." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Konwertuj do siatki 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Utwórz siatkÄ™ 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "PrzesuÅ„ WielokÄ…t" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Utwórz wielokÄ…t kolizji" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Stwórz Occluder Polygon" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7217,12 +7314,17 @@ msgid "Duplicate Nodes" msgstr "Duplikuj wÄ™zÅ‚y" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "UsuÅ„ wÄ™zeÅ‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Typ wejÅ›cia shadera wizualnego zmieniony" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "WierzchoÅ‚ek" +msgstr "WierzchoÅ‚ki" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Fragment" @@ -8433,10 +8535,6 @@ msgid "Open documentation" msgstr "Otwórz dokumentacjÄ™" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "UsuÅ„ wÄ™zeÅ‚ (wÄ™zÅ‚y)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Dodaj wÄ™zeÅ‚" @@ -10310,12 +10408,15 @@ msgstr "Przypisanie do uniformu." msgid "Varyings can only be assigned in vertex function." msgstr "Varying może być przypisane tylko w funkcji wierzchoÅ‚ków." +#~ msgid "Snap (s): " +#~ msgstr "PrzyciÄ…ganie (s): " + +#~ msgid "Insert keys." +#~ msgstr "Wstaw klucze." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Utwórz instancjÄ™ wybranej sceny/scen jako dziecko wybranego wÄ™zÅ‚a." -#~ msgid "FPS" -#~ msgstr "Klatki na sekundÄ™" - #~ msgid "Warnings:" #~ msgstr "Ostrzeżenia:" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index dea945f474..0aa4cbbca8 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -428,13 +428,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3763,6 +3771,11 @@ msgid "Delete Node" msgstr "Slit th' Node" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4729,7 +4742,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4801,6 +4838,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5154,52 +5237,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5719,7 +5765,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6551,6 +6597,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6563,15 +6629,37 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Discharge ye' Function" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7177,6 +7265,11 @@ msgid "Duplicate Nodes" msgstr "Rename Variable" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Slit th' Node" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8342,10 +8435,6 @@ msgid "Open documentation" msgstr "Yer functions:" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 0deb9619d0..9dc52df2be 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -56,12 +56,14 @@ # Davi <wokep.ma.wavid@gmail.com>, 2019. # Endrick Gustavo <endrickgb@hotmail.com>, 2019. # Hans M. Boron <hansmateusboron@gmail.com>, 2019. +# Gustavo Bolanho <jdmapas@gmail.com>, 2019. +# Nilton Bendini Junior <almascelulas@bol.com.br>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2019-04-08 10:35+0000\n" -"Last-Translator: Hans M. Boron <hansmateusboron@gmail.com>\n" +"PO-Revision-Date: 2019-04-19 16:33+0000\n" +"Last-Translator: Nilton Bendini Junior <almascelulas@bol.com.br>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -259,7 +261,7 @@ msgstr "Tempo (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Ligar/Desligar trilha" +msgstr "Alternar Trilha Ativado" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -313,7 +315,7 @@ msgstr "Deletar Chave(s)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "Alterar Modo de Atualização da Animação:" +msgstr "Alterar Modo de Atualização da Animação" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" @@ -369,9 +371,8 @@ msgid "Change Animation Step" msgstr "Alterar FPS da Animação" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rearrange Tracks" -msgstr "Reordenar Faixas" +msgstr "Reordenar Trilhas" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." @@ -416,13 +417,12 @@ msgid "Track is not of type Spatial, can't insert key" msgstr "Trilha não é do tipo Espacial,não pode inserir chave" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "Trilha de transformação 3D" +msgstr "Adicionar Chave de Transformação de Trilha" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "Adicionar Trilha" +msgstr "Adicionar Trilha Chave" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." @@ -430,9 +430,8 @@ msgstr "" "Caminho da trilha é inválido,então não pode adicionar uma chave de método." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "Trilha de método de chamada" +msgstr "Adiciona Método de Trilha Chave" #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -469,13 +468,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupe as trilhas pelo nó ou exiba-as como lista simples." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Snap (s): " +#, fuzzy +msgid "Snap:" +msgstr "Snap" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valor do passo de animação." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -594,17 +602,16 @@ msgid "Copy" msgstr "Copiar" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Clipes de Ãudio:" +msgstr "Adiciona Clipe de Trilha de Ãudio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "Alterar Deslocamento do InÃcio de Clipe da Trilha de Ãudio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "Alterar deslocamento de fim do clipe de faixa de áudio" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -1236,7 +1243,7 @@ msgstr "Adicionar Canal" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "Adiciona um novo Canal de Ãudio a esse layout." +msgstr "Adicionar novo Canal de Ãudio a esse layout." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1427,6 +1434,8 @@ msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"A plataforma de destino requer compactação de textura 'ETC2' para GLES3. " +"Ativar 'Importar Etc 2' nas Configurações do Projeto." #: editor/editor_export.cpp msgid "" @@ -1435,6 +1444,10 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"A plataforma de destino requer compactação de textura 'ETC' para o driver " +"retornar ao GLES2.\n" +"Ativar 'Importar Etc' em Configurações do Projeto ou desabilitar 'Driver " +"Fallback Enabled' (Recuperação de driver ativada)." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1557,23 +1570,20 @@ msgid "Move Favorite Down" msgstr "Mover Favorito Abaixo" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Previous Folder" -msgstr "Chão Anterior" +msgstr "Pasta Anterior" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Next Folder" -msgstr "Próximo Chão" +msgstr "Próxima Pasta" #: editor/editor_file_dialog.cpp msgid "Go to parent folder" msgstr "Ir para pasta pai" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "(Un)favorite current folder." -msgstr "Não foi possÃvel criar a pasta." +msgstr "(Des)favoritar pasta atual." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1806,9 +1816,8 @@ msgid "Project export failed with error code %d." msgstr "Falha na exportação do projeto com código de erro %d." #: editor/editor_node.cpp -#, fuzzy msgid "Imported resources can't be saved." -msgstr "Recursos Importados" +msgstr "Recursos Importados não podem ser salvos." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp @@ -3684,18 +3693,16 @@ msgstr "Carregar..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Move Node Point" -msgstr "Mover pontos" +msgstr "Mover o ponto do nó" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Change BlendSpace1D Limits" msgstr "Alterar limites do BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Labels" -msgstr "Alterar Tempo de Mistura" +msgstr "Alterar rótulos BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3706,24 +3713,21 @@ msgstr "" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Node Point" -msgstr "Adicionar Nó" +msgstr "Adicionar ponto de Nó" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Animation Point" -msgstr "Adicionar Animação" +msgstr "Adicionar ponto de Animação" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" -msgstr "Remover Ponto do Caminho" +msgstr "Remover Ponto BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" -msgstr "" +msgstr "Mover ponto de nó BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3769,29 +3773,24 @@ msgid "Triangle already exists" msgstr "Triângulo já existe" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Triangle" -msgstr "Adicionar Variável" +msgstr "Adicionar Triângulo" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Limits" -msgstr "Alterar Tempo de Mistura" +msgstr "Alterar limites de BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Labels" -msgstr "Alterar Tempo de Mistura" +msgstr "Alterar rótulos de BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Point" -msgstr "Remover Ponto do Caminho" +msgstr "Remover Ponto do BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Triangle" -msgstr "Remover Variável" +msgstr "Remover Triangulo do BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." @@ -3802,9 +3801,8 @@ msgid "No triangles exist, so no blending can take place." msgstr "Não existem triângulos, então nenhuma mistura pode acontecer." #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Toggle Auto Triangles" -msgstr "Alternar Auto Carregamentos de Globais" +msgstr "Alternar Triângulos Automáticos" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." @@ -3837,9 +3835,8 @@ msgid "Output node can't be added to the blend tree." msgstr "Nós de saÃda não pode ser adicionado à árvore de mistura." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Add Node to BlendTree" -msgstr "Adicionar Nó(s) a Partir da Ãrvore" +msgstr "Adicionar Nó(s) a Partir da Ãrvore (BlendTree)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -3863,9 +3860,8 @@ msgid "Nodes Disconnected" msgstr "Nós Desconectados" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Set Animation" -msgstr "Nova animação" +msgstr "Definir Animação" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -3873,14 +3869,17 @@ msgid "Delete Node" msgstr "Excluir Nó" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Excluir Nó(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" -msgstr "Ligar/desligar esta trilha." +msgstr "Ligar/Desligar Filtro" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Change Filter" -msgstr "FIltro de Idiomas Alterado" +msgstr "Alterar Filtro" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." @@ -3905,9 +3904,8 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Renamed" -msgstr "Nome do nó" +msgstr "Nó Renomeado" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -4138,14 +4136,12 @@ msgid "Cross-Animation Blend Times" msgstr "Tempos de Mistura de Animação Cruzada" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Move Node" -msgstr "Modo Mover" +msgstr "Mover Nó" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Add Transition" -msgstr "Adicionar Tradução" +msgstr "Adicionar Transição" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4181,9 +4177,8 @@ msgid "No playback resource set at path: %s." msgstr "Sem recurso de playback definido no caminho: %s." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Removed" -msgstr "Removido:" +msgstr "Nó Removido" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition Removed" @@ -4626,7 +4621,8 @@ msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" -"Filhos de contêineres tem sua âncora e margens sobrescritos pelos seus pais." +"Filhos de contêineres tem suas ancoragens e valores de margem sobrescritos " +"pelos seus pais." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -4859,8 +4855,34 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Inserir chaves." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Inserir Chaves (Ins)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Inserir Chave na Anim" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4932,6 +4954,52 @@ msgstr "Editar PolÃgono (Remover Ponto)" msgid "Set Handle" msgstr "Definir Manipulador" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Erro ao carregar imagem:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Nenhum pixel com transparência > 128 na imagem." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Carregar Máscara de Emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Limpar Máscara de Emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "PartÃculas" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Gerar Contagem de Pontos:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Máscara de Emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturar a partir do Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Cores de Emissão" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "Particulas CPU" @@ -5285,52 +5353,15 @@ msgstr "" "Só é permitido colocar um ponto em um material processador ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Erro ao carregar imagem:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Nenhum pixel com transparência > 128 na imagem." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Carregar Máscara de Emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Limpar Máscara de Emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Converter para Particulas CPU" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "PartÃculas" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Gerar Contagem de Pontos:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Gerando Tempo (seg):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Máscara de Emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturar a partir do Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Cores de Emissão" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "As faces não têm área!" @@ -5842,7 +5873,8 @@ msgid "Save Theme As..." msgstr "Salvar Tema Como..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Referência de Classes" #: editor/plugins/script_editor_plugin.cpp @@ -5974,11 +6006,11 @@ msgstr "Abrir a documentação online da Godot" #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" -msgstr "" +msgstr "Solicitar documentos" #: editor/plugins/script_editor_plugin.cpp msgid "Help improve the Godot documentation by giving feedback" -msgstr "" +msgstr "Ajude a melhorar a documentação do Godot dando seu feedback" #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -6176,14 +6208,12 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto não tem ossos, crie alguns nós filhos Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Create Rest Pose from Bones" -msgstr "Faça Resto Pose (De Ossos)" +msgstr "Criar postura de descanso para os Ossos" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Set Rest Pose to Bones" -msgstr "Faça Resto Pose (De Ossos)" +msgstr "Definir a postura de repouso para os Ossos" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" @@ -6338,9 +6368,8 @@ msgid "Rear" msgstr "Traseira" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Align with View" -msgstr "Alinhar com Visão" +msgstr "Alinhar com a Vista" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -6447,9 +6476,8 @@ msgid "XForm Dialog" msgstr "Diálogo XForm" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes To Floor" -msgstr "Encaixar na grade" +msgstr "Encaixar Nó(s) no Chão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode (Q)" @@ -6671,6 +6699,26 @@ msgid "Nameless gizmo" msgstr "Coisa sem nome" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Crie uma malha 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Criar PolÃgono3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Criar polÃgono de colisão" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Criar PolÃgono de Oclusão" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite está vazio!" @@ -6684,16 +6732,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria inválida, não é possÃvel substituir por malha." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Geometria inválida, não é possÃvel substituir por malha." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Geometria inválida, não é possÃvel substituir por malha." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Geometria inválida, não é possÃvel substituir por malha." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Converter para malha 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Crie uma malha 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Mover PolÃgono" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Criar polÃgono de colisão" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Criar PolÃgono de Oclusão" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7045,13 +7120,12 @@ msgid "Merge from Scene" msgstr "Fundir a partir de Cena" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Next Coordinate" -msgstr "Próximo Chão" +msgstr "Próxima Coordenada" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "Selecione a próxima forma, subtile ou Tile." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Previous Coordinate" @@ -7059,7 +7133,7 @@ msgstr "Coordenada Anterior" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "Selecione a forma, subtile ou tile anterior." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -7263,26 +7337,28 @@ msgstr "Conjunto de Telha" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "Definir Nome Uniforme" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set Input Default Port" -msgstr "Definir como Padrão para '%s'" +msgstr "Definir Porta Padrão de Entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node to Visual Shader" -msgstr "VisualShader" +msgstr "Adicionar Nó ao Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" msgstr "Duplicar Nó(s)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Excluir Nó" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "Tipo de Entrada de Shader Visual Alterado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -7301,14 +7377,12 @@ msgid "VisualShader" msgstr "VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property" -msgstr "Editar prioridade da telha" +msgstr "Editar Propriedade Visual" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Visual Shader Mode Changed" -msgstr "Alterações de Shader" +msgstr "Modo Visual Shader Alterado" #: editor/project_export.cpp msgid "Runnable" @@ -7327,9 +7401,10 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"Falha ao exportar o projeto para a plataforma '% s'.\n" +"Os modelos de exportação parecem estar ausentes ou inválidos." #: editor/project_export.cpp -#, fuzzy msgid "" "Failed to export the project for platform '%s'.\n" "This might be due to a configuration issue in the export preset or your " @@ -7349,7 +7424,7 @@ msgstr "Exportando tudo" #: editor/project_export.cpp msgid "The given export path doesn't exist:" -msgstr "O caminho de exportação informado não existe." +msgstr "O caminho de exportação informado não existe:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" @@ -8500,10 +8575,6 @@ msgid "Open documentation" msgstr "Abrir a documentação" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Excluir Nó(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Adicionar Nó Filho" @@ -9678,7 +9749,7 @@ msgstr "Identificador está ausente." #: platform/iphone/export/export.cpp msgid "Identifier segments must be of non-zero length." -msgstr "Os segmentos de identificador devem ter comprimento diferente de zero." +msgstr "Segmentos identificadores devem ter comprimento diferente de zero." #: platform/iphone/export/export.cpp msgid "The character '%s' is not allowed in Identifier." @@ -10097,6 +10168,8 @@ msgid "" "GIProbes are not supported by the GLES2 video driver.\n" "Use a BakedLightmap instead." msgstr "" +"GIProbes não são suportados pelo driver de vÃdeo GLES2.\n" +"Use um BakedLightmap em vez disso." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -10277,6 +10350,10 @@ msgid "" "If you dont't intend to add a script, then please use a plain 'Control' node " "instead." msgstr "" +"O contêiner por si só não serve para nada, a menos que um script configure " +"seu comportamento de posicionamento de filhos.\n" +"Se você não pretende adicionar um script, por favor use um nó simples " +"'Control'." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -10288,7 +10365,7 @@ msgstr "Confirme Por Favor..." #: scene/gui/file_dialog.cpp msgid "Go to parent folder." -msgstr "Ir para diretório pai" +msgstr "Ir para diretório (pasta) pai." #: scene/gui/popup.cpp msgid "" @@ -10374,12 +10451,15 @@ msgstr "Atribuição à uniforme." msgid "Varyings can only be assigned in vertex function." msgstr "Variáveis só podem ser atribuÃdas na função de vértice." +#~ msgid "Snap (s): " +#~ msgstr "Snap (s): " + +#~ msgid "Insert keys." +#~ msgstr "Inserir chaves." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Instanciar a(s) cena(s) selecionada como filho do nó selecionado." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Avisos:" @@ -11897,9 +11977,6 @@ msgstr "Variáveis só podem ser atribuÃdas na função de vértice." #~ msgid "Cannot go into subdir:" #~ msgstr "Não é possÃvel ir ao subdiretório:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Inserir Chaves (Ins)" - #~ msgid "Top (Num7)" #~ msgstr "Cima (Num7)" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index 0c8ad8dce9..f9e93885d9 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -427,13 +427,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupar faixas por nó ou exibi-las como lista simples." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "Ajuste (s): " +#, fuzzy +msgid "Snap:" +msgstr "Ajustar" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Valor passo da Animação." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3816,6 +3825,11 @@ msgid "Delete Node" msgstr "Apagar Nó" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Apagar Nó(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Alternar Filtro On/Off" @@ -4789,8 +4803,34 @@ msgid "Layout" msgstr "Esquema" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Inserir chaves." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Inserir Chave (Pistas existentes)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim Inserir Chave" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4862,6 +4902,52 @@ msgstr "Editar Poly (Remover Ponto)" msgid "Set Handle" msgstr "Definir Manipulador" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Erro ao carregar imagem:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Sem pixeis com transparência > 128 na imagem..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Carregar máscara de emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Limpar máscara de emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "PartÃculas" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Contagem de Pontos gerados:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Máscara de emissão" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturar a partir do pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Cores de emissão" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5212,52 +5298,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Só pode definir um Ponto num Material ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Erro ao carregar imagem:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Sem pixeis com transparência > 128 na imagem..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Carregar máscara de emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Limpar máscara de emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Converter em CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "PartÃculas" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Contagem de Pontos gerados:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Tempo de geração (s):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Máscara de emissão" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturar a partir do pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Cores de emissão" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "As faces não contêm Ãrea!" @@ -5767,7 +5816,8 @@ msgid "Save Theme As..." msgstr "Guardar tema como..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Referência de classe" #: editor/plugins/script_editor_plugin.cpp @@ -6592,6 +6642,26 @@ msgid "Nameless gizmo" msgstr "Bugiganga sem Nome" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Criar Malha 2D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Criar Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Criar PolÃgono de Colisão" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Criar PolÃgono oclusor" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite está vazia!" @@ -6604,16 +6674,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria inválida, não substituÃvel por malha." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Geometria inválida, não substituÃvel por malha." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Geometria inválida, não substituÃvel por malha." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Geometria inválida, não substituÃvel por malha." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Converter para Malha 2D" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Criar Malha 2D" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Mover PolÃgono" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Criar PolÃgono de Colisão" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Criar PolÃgono oclusor" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7198,6 +7295,11 @@ msgid "Duplicate Nodes" msgstr "Duplicar Nós" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Apagar Nó" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Alterado Tipo de Entrada do Visual Shader" @@ -8414,10 +8516,6 @@ msgid "Open documentation" msgstr "Abrir documentação" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Apagar Nó(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Adicionar Nó filho" @@ -10296,13 +10394,16 @@ msgstr "Atribuição a uniforme." msgid "Varyings can only be assigned in vertex function." msgstr "Variações só podem ser atribuÃdas na função vértice." +#~ msgid "Snap (s): " +#~ msgstr "Ajuste (s): " + +#~ msgid "Insert keys." +#~ msgstr "Inserir chaves." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "" #~ "Instancie a(s) Cena(s) selecionada(s) como filha(s) do Nó selecionado." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "Avisos:" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 807d02dc5d..dbc222bbbf 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -439,14 +439,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Pas (s):" +msgid "Snap:" +msgstr "Aliniere" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "Arborele AnimaÈ›iei este valid." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3929,6 +3937,11 @@ msgid "Delete Node" msgstr "Creează Nod" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Comutează modul fără distrageri." @@ -4930,9 +4943,34 @@ msgid "Layout" msgstr "Schemă" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Inserează Note" +msgid "Insert keys (based on mask)." +msgstr "Inserează Notă (Melodii existente)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim InseraÈ›i Cheie" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5005,6 +5043,52 @@ msgstr "Editează Poligon (Elimină Punct)" msgid "Set Handle" msgstr "Setează Mâner" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Eroare la încărcarea imaginii:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Nici un pixel cu transparenÈ›a > 128 în imagine..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "ÃŽncărcare Mască de Emisie" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Curăță Masca de Emisie" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Particule" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Număr de Puncte Generate:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Mască de Emisie" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Capturare din Pixel" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Culori de Emisie" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5359,52 +5443,15 @@ msgstr "" "ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Eroare la încărcarea imaginii:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Nici un pixel cu transparenÈ›a > 128 în imagine..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "ÃŽncărcare Mască de Emisie" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Curăță Masca de Emisie" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Particule" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Număr de Puncte Generate:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Timp de Generare (sec):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Mască de Emisie" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Capturare din Pixel" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Culori de Emisie" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Unele feÈ›e nu conÈ›in zonă!" @@ -5942,7 +5989,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6782,6 +6829,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Creează Mesh de Contur" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Crează Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Creare Poligon de Navigare" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Creează Poligon de Ocluziune" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Mesh-ul este gol!" @@ -6794,17 +6861,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Sprite" +msgid "Invalid geometry, can't create polygon." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Creează Mesh de Contur" +msgid "Convert to Mesh2D" +msgstr "ConverteÈ™te ÃŽn..." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Deplasare poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Creare Poligon de Navigare" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Creează Poligon de Ocluziune" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7416,6 +7506,11 @@ msgid "Duplicate Nodes" msgstr "Anim Clonare Chei" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Creează Nod" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8600,10 +8695,6 @@ msgid "Open documentation" msgstr "Deschide Recente" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10359,6 +10450,14 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Pas (s):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Inserează Note" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "InstanÈ›iază scena(ele) selectată ca un copil al nodului selectat." diff --git a/editor/translations/ru.po b/editor/translations/ru.po index f950d99eec..b9794177bb 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -42,12 +42,13 @@ # LeLuCh B0й <alekx@alumni.nottingham.ac.uk>, 2019. # ÐÑ€Ñений Солодков <arsen332211@gmail.com>, 2019. # Nikita <yakrobat@protonmail.com>, 2019. +# LAT_Rio <AlSenya@yandex.ru>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-04-07 08:04+0000\n" -"Last-Translator: Chaosus89 <chaosus89@gmail.com>\n" +"PO-Revision-Date: 2019-04-14 13:04+0000\n" +"Last-Translator: LAT_Rio <AlSenya@yandex.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -453,13 +454,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "Группировать треки по узлам или показывать их как проÑтой ÑпиÑок." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "ПривÑзка (Ñек): " +#, fuzzy +msgid "Snap:" +msgstr "ПривÑзка" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Значение шага анимации." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -1217,9 +1227,8 @@ msgid "Add Bus" msgstr "Добавить" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "Сохранить раÑкладку звуковой шины как..." +msgstr "Добавить новую звуковую шину Ð´Ð»Ñ Ñтой раÑкладки." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1560,9 +1569,8 @@ msgid "Go to parent folder" msgstr "Перейти к родительÑкой папке" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "(Un)favorite current folder." -msgstr "Ðевозможно Ñоздать папку." +msgstr "Добавить или удалить текущую папку из избранных." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -2564,9 +2572,8 @@ msgid "Save & Restart" msgstr "Сохранить и перезапуÑтить" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window redraws." -msgstr "ВращаетÑÑ, когда окно редактора перериÑовываетÑÑ!" +msgstr "ВращаетÑÑ, когда окно редактора перериÑовываетÑÑ." #: editor/editor_node.cpp msgid "Update Always" @@ -3845,6 +3852,11 @@ msgid "Delete Node" msgstr "Удалить узел" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Удалить узел(узлы)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Переключить фильтр вкл/выкл" @@ -4818,8 +4830,34 @@ msgid "Layout" msgstr "Макет" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Ð’Ñтавить ключи." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Ð’Ñтавить ключи (Ins)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Ð’Ñтавить ключ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4891,6 +4929,52 @@ msgstr "Редактировать полигон (удалить точку)" msgid "Set Handle" msgstr "Задать обработчик" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Ошибка при загрузке изображениÑ:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Ðикаких пикÑелей Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñтью > 128 в изображении..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "МаÑка выброÑа загружена" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "МаÑка выброÑа очищена" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "ЧаÑтицы" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "КоличеÑтво Ñоздаваемых точек:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "МаÑка излучениÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Из пикÑелÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Цвета излучениÑ" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "ЦПУЧаÑтицы" @@ -5241,52 +5325,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Возможно уÑтановить точку только в ParticlesMaterial материал" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Ошибка при загрузке изображениÑ:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Ðикаких пикÑелей Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñтью > 128 в изображении..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "МаÑка выброÑа загружена" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "МаÑка выброÑа очищена" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Преобразовать в CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "ЧаÑтицы" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "КоличеÑтво Ñоздаваемых точек:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ (Ñек):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "МаÑка излучениÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Из пикÑелÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Цвета излучениÑ" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Грани не Ñодержат зоны!" @@ -5797,7 +5844,8 @@ msgid "Save Theme As..." msgstr "Сохранить тему как..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " СÑылка на КлаÑÑ" #: editor/plugins/script_editor_plugin.cpp @@ -6133,12 +6181,12 @@ msgstr "У Ñтого Ñкелета нет коÑтей, Ñоздайте Ð´Ð¾Ñ #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" -msgstr "Сделать позу Ð¿Ð¾ÐºÐ¾Ñ (из коÑтей)" +msgstr "Создать Позу ÐŸÐ¾ÐºÐ¾Ñ Ð¸Ð· КоÑтей" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Set Rest Pose to Bones" -msgstr "Сделать позу Ð¿Ð¾ÐºÐ¾Ñ (из коÑтей)" +msgstr "Задать Позу ÐŸÐ¾ÐºÐ¾Ñ ÐšÐ¾ÑÑ‚Ñм" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" @@ -6295,7 +6343,7 @@ msgstr "Зад" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Align with View" -msgstr "СовмеÑтить Ñ Ð²Ð¸Ð´Ð¾Ð¼" +msgstr "ВыравнÑÑ‚ÑŒ Ñ Ð¾Ð±Ð»Ð°Ñтью проÑмотра" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -6405,7 +6453,7 @@ msgstr "XForm диалоговое окно" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Snap Nodes To Floor" -msgstr "ПривÑзать к полу" +msgstr "ПодравнÑÑ‚ÑŒ Узел Ñ ÐŸÐ¾Ð»Ð¾Ð¼" #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode (Q)" @@ -6625,7 +6673,27 @@ msgstr "ПоÑле" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Nameless gizmo" -msgstr "БезымÑнный штуковина" +msgstr "БезымÑнный гизмо" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Создать 2D Mesh" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Создать Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Создать полигон Ñтолкновений" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Создан затенÑющий полигон" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" @@ -6641,16 +6709,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Спрайт" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Преобразовать в 2D Mesh" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Создать 2D Mesh" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Передвинуть полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Создать полигон Ñтолкновений" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Создан затенÑющий полигон" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7002,18 +7097,16 @@ msgid "Merge from Scene" msgstr "СлиÑние из Ñцены" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Next Coordinate" -msgstr "Следующий Ñтаж" +msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÐšÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð°" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." msgstr "Выберите Ñледующую фигуру, Ñлемент тайла или тайл." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Previous Coordinate" -msgstr "Предыдущий Ñтаж" +msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐšÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð°" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." @@ -7032,9 +7125,8 @@ msgid "Erase bitmask." msgstr "Стереть битовую маÑку." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new rectangle." -msgstr "Создать новый узел." +msgstr "Создать новый прÑмоугольник." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." @@ -7174,14 +7266,12 @@ msgid "Clear Tile Bitmask" msgstr "ОчиÑтить Битовую МаÑку Плитки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Concave" -msgstr "Передвинуть полигон" +msgstr "Сделать Полигон Вогнутым" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Convex" -msgstr "Передвинуть полигон" +msgstr "Сделать Полигон Выпуклым" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Tile" @@ -7230,17 +7320,20 @@ msgstr "Задать единообразное имÑ" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Set Input Default Port" -msgstr "УÑтановить по умолчанию Ð´Ð»Ñ '%s'" +msgstr "Задать Порт по умолчанию Ð´Ð»Ñ Ð’Ð²Ð¾Ð´Ð°" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node to Visual Shader" -msgstr "VisualShader" +msgstr "Добавить Узел в Визуальный Шейдер" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" -msgstr "Дублировать узел(узлы)" +msgstr "Дублировать узлы" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Удалить узел" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" @@ -7265,12 +7358,12 @@ msgstr "Визуальный Шейдер" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Edit Visual Property" -msgstr "Редактировать приоритет тайла" +msgstr "Редактировать Визуальное СвойÑтво" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Visual Shader Mode Changed" -msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑˆÐµÐ¹Ð´ÐµÑ€Ð¾Ð²" +msgstr "Режим Визуального Шейдера был изменен" #: editor/project_export.cpp msgid "Runnable" @@ -7313,7 +7406,7 @@ msgstr "ÐкÑпорт вÑех" #: editor/project_export.cpp #, fuzzy msgid "The given export path doesn't exist:" -msgstr "Путь не ÑущеÑтвует." +msgstr "Данный путь ÑкÑпорта не ÑущеÑтвует:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" @@ -7620,12 +7713,13 @@ msgid "" "Warning: You will not be able to open the project with previous versions of " "the engine anymore." msgstr "" -"Файл наÑтроек проекта был Ñгенерирован Ñтарой верÑией движка и должен быть " -"преобразован Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑии:\n" +"Файл наÑтроек проекта не указывает верÑию верÑии движка, на котором он был " +"Ñгенерирован:\n" "\n" "%s\n" "\n" -"Ð’Ñ‹ хотите преобразовать его?\n" +"ЕÑли вы продолжите, то он будет преобразован в формат текущей верÑии " +"движка.\n" "Внимание: Ð’Ñ‹ больше не Ñможете открыть проект предыдущими верÑиÑми движка." #: editor/project_manager.cpp @@ -8356,9 +8450,8 @@ msgid "Instantiated scenes can't become root" msgstr "Мгновенные Ñцены не могут быть корневыми" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make node as Root" -msgstr "Создать корневой узел Ñцены" +msgstr "Сделать узел корневым" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" @@ -8399,7 +8492,7 @@ msgstr "Сделать локальным" #: editor/scene_tree_dock.cpp #, fuzzy msgid "New Scene Root" -msgstr "Создать корневой узел Ñцены" +msgstr "Ðовый Корневой Узел Сцены" #: editor/scene_tree_dock.cpp msgid "Create Root Node:" @@ -8466,10 +8559,6 @@ msgid "Open documentation" msgstr "Открыть документацию" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Удалить узел(узлы)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Добавить дочерний узел" @@ -8831,23 +8920,20 @@ msgid "Set From Tree" msgstr "УÑтановить из дерева" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Erase Shortcut" -msgstr "Переход ИЗ" +msgstr "Удалить ПривÑзанную Кнопку" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Restore Shortcut" -msgstr "ГорÑчие клавиши" +msgstr "ВоÑÑтановить ПривÑзанную Кнопку" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Change Shortcut" -msgstr "Изменить привÑзку" +msgstr "Изменить ПривÑзанную Кнопку" #: editor/settings_config_dialog.cpp msgid "Shortcuts" -msgstr "ГорÑчие клавиши" +msgstr "ПривÑзанные кнопки" #: editor/settings_config_dialog.cpp msgid "Binding" @@ -10346,12 +10432,15 @@ msgstr "Ðазначить форму." msgid "Varyings can only be assigned in vertex function." msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только в функции вершины." +#~ msgid "Snap (s): " +#~ msgstr "ПривÑзка (Ñек): " + +#~ msgid "Insert keys." +#~ msgstr "Ð’Ñтавить ключи." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Добавить выбранную Ñцену(Ñ‹), в качеÑтве потомка выбранного узла." -#~ msgid "FPS" -#~ msgstr "FPS" - #~ msgid "Warnings:" #~ msgstr "ПредупреждениÑ:" @@ -11891,9 +11980,6 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð #~ msgid "Cannot go into subdir:" #~ msgstr "Ðевозможно перейти в подпапку:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "Ð’Ñтавить ключи (Ins)" - #~ msgid "Top (Num7)" #~ msgstr "Вид Ñверху (Num 7)" diff --git a/editor/translations/si.po b/editor/translations/si.po index dab5cb3e0f..581ab36ee0 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -417,13 +417,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3682,6 +3690,11 @@ msgid "Delete Node" msgstr "යà¶à·”රු මක෠දමන්න" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "ලුහුබදින්න෠සක්â€à¶»à·’ය/අක්â€à¶»à·’ය." @@ -4635,10 +4648,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Anim යà¶à·”රක් ඇà¶à·”ලà¶à·Š කරන්න" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4706,6 +4744,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5056,52 +5140,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5605,7 +5652,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6424,6 +6471,24 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "à·ƒà·à¶¯à¶±à·Šà¶±" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "à·ƒà·à¶¯à¶±à·Šà¶±" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6436,15 +6501,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7021,6 +7106,11 @@ msgid "Duplicate Nodes" msgstr "යà¶à·”රු පිටපà¶à·Š කරන්න" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "යà¶à·”රු මක෠දමන්න" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8170,10 +8260,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index a664935a69..862f095dd3 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -421,13 +421,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3755,6 +3763,11 @@ msgid "Delete Node" msgstr "VÅ¡etky vybrané" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4724,10 +4737,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Animácia VložiÅ¥ KľúÄ" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4796,6 +4834,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5152,52 +5236,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5717,7 +5764,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6547,6 +6594,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "VytvoriÅ¥ adresár" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "VytvoriÅ¥ adresár" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "VytvoriÅ¥ adresár" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "VytvoriÅ¥ adresár" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6559,19 +6626,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" +msgid "Convert to Polygon2D" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" msgstr "VytvoriÅ¥ adresár" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " msgstr "" @@ -7175,6 +7263,11 @@ msgid "Duplicate Nodes" msgstr "DuplikovaÅ¥ výber" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8343,10 +8436,6 @@ msgid "Open documentation" msgstr "Popis:" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index a18d140b17..23d7e5ebee 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -441,7 +441,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Korak (s):" #: editor/animation_track_editor.cpp @@ -449,6 +449,14 @@ msgstr "Korak (s):" msgid "Animation step value." msgstr "Drevo animacije je veljavno." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3914,6 +3922,11 @@ msgid "Delete Node" msgstr "Izberi Gradnik" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Preklop naÄin pisanja brez motenj." @@ -4915,8 +4928,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "V Animacijo Vstavi KljuÄ" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "V Animacijo Vstavi KljuÄ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4988,6 +5026,52 @@ msgstr "Uredi Poligon (Odstrani ToÄko)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5338,52 +5422,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5917,7 +5964,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6757,6 +6804,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Ustvari Nov %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Ustvarite Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Ustvarite Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Ustvarite Mapo" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Model je prazen!" @@ -6769,17 +6836,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Sprite" +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Ustvari Nov %s" +msgid "Convert to Mesh2D" +msgstr "Pretvori V..." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Odstrani Poligon in ToÄko" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Ustvarite Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7393,6 +7482,11 @@ msgid "Duplicate Nodes" msgstr "Animacija Podvoji kljuÄe" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Izberi Gradnik" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8572,10 +8666,6 @@ msgid "Open documentation" msgstr "Odpri Nedavne" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index f3b24cc2f5..d52ebdcd96 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -407,13 +407,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Vlera e hapit për animacionin." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3793,6 +3801,11 @@ msgid "Delete Node" msgstr "Fshi Nyjen" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4744,10 +4757,35 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Vendos Key" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" msgstr "" @@ -4815,6 +4853,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5165,52 +5249,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5714,7 +5761,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6532,6 +6579,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Krijo %s të ri" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Krijo një Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Krijo një Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Krijo një Folder" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6544,15 +6611,37 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" +msgstr "Konverto në %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "Krijo një Poligon" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7123,6 +7212,11 @@ msgid "Duplicate Nodes" msgstr "Dyfisho Nyjet" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Fshi Nyjen" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8272,10 +8366,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 31ff003c25..57e05ca847 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -442,14 +442,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Један корак (Ñек.):" +msgid "Snap:" +msgstr "Залепи" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "Ðнимационо дрво је важеће." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3942,6 +3950,11 @@ msgid "Delete Node" msgstr "Ðаправи чвор" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Укљ./ИÑкљ. режим без Ñметње." @@ -4937,9 +4950,34 @@ msgid "Layout" msgstr "РаÑпоред" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Убаци кључеве" +msgid "Insert keys (based on mask)." +msgstr "Убаци кључ (поÑтојеће траке)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Уметни кључ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5012,6 +5050,52 @@ msgstr "Уреди полигон (обриши тачку)" msgid "Set Handle" msgstr "ПоÑтави дршку" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Грешка при учитавању Ñлике:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "У Ñлици нема пикÑела Ñа транÑпарентношћу већом од 128..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Учитај маÑку емиÑије" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ОчиÑти маÑку емиÑије" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "ЧеÑтице" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Број генериÑаних тачака:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "МаÑка емиÑије" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Сними од пикÑела" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Боје емиÑије" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5366,22 +5450,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Тачка Ñе Ñамо може поÑтавити у ParticlesMaterial процеÑни материјал" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Грешка при учитавању Ñлике:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "У Ñлици нема пикÑела Ñа транÑпарентношћу већом од 128..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Учитај маÑку емиÑије" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ОчиÑти маÑку емиÑије" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5389,30 +5457,9 @@ msgstr "Претвори у велика Ñлова" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "ЧеÑтице" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Број генериÑаних тачака:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Време генериÑања (Ñек.):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "МаÑка емиÑије" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Сними од пикÑела" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Боје емиÑије" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Стране не Ñадрже облаÑÑ‚!" @@ -5954,7 +6001,8 @@ msgid "Save Theme As..." msgstr "Сачувај тему као..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " референца клаÑе" #: editor/plugins/script_editor_plugin.cpp @@ -6811,6 +6859,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Ðаправи ивичну мрежу" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Ðаправи полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Ðаправи навигациони полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Ðаправи оÑенчен полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Мрежа је празна!" @@ -6823,19 +6891,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "Ðалепи оквир" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Претвори у велика Ñлова" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Ðаправи ивичну мрежу" +msgid "Convert to Polygon2D" +msgstr "Помери полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Ðаправи навигациони полигон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Ðаправи оÑенчен полигон" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7467,6 +7557,11 @@ msgid "Duplicate Nodes" msgstr "Дуплирај чвор/ове графа" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Ðаправи чвор" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8663,10 +8758,6 @@ msgid "Open documentation" msgstr "Отвори Godot онлајн документацију" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -10442,12 +10533,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Један корак (Ñек.):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Убаци кључеве" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Ðаправи Ñледећу Ñцену/е као дете одабраног чвора." -#~ msgid "FPS" -#~ msgstr "FPS" - #, fuzzy #~ msgid "Font Size:" #~ msgstr "Поглед иÑпред" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 39d66c018c..ac3590e494 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -423,13 +423,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3697,6 +3705,11 @@ msgid "Delete Node" msgstr "Animacija ObriÅ¡i KljuÄeve" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4653,8 +4666,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Animacija dodaj kljuÄ" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Animacija dodaj kljuÄ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4726,6 +4764,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5076,52 +5160,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5630,7 +5677,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6451,6 +6498,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Napravi" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Napravi" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Napravi" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Napravi" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6463,19 +6530,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" +msgid "Convert to Polygon2D" msgstr "Napravi" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Napravi" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " msgstr "" @@ -7065,6 +7153,11 @@ msgid "Duplicate Nodes" msgstr "Animacija Uduplaj KljuÄeve" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Animacija ObriÅ¡i KljuÄeve" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8217,10 +8310,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 822a6f9388..63a6d6e6c7 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -432,7 +432,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "Steg (s):" #: editor/animation_track_editor.cpp @@ -440,6 +440,14 @@ msgstr "Steg (s):" msgid "Animation step value." msgstr "Animation" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4159,6 +4167,12 @@ msgid "Delete Node" msgstr "Ta bort Nod(er)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Delete Node(s)" +msgstr "Ta bort Nod(er)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Växla distraktionsfritt läge." @@ -5165,8 +5179,33 @@ msgid "Layout" msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Anim Infoga Nyckel" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Anim Infoga Nyckel" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5242,6 +5281,53 @@ msgstr "Redigera Polygon (ta bort punkt)" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Particles" +msgstr "Partiklar" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5603,22 +5689,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5626,31 +5696,9 @@ msgstr "Konvertera till Versaler" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Particles" -msgstr "Partiklar" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -6185,7 +6233,7 @@ msgid "Save Theme As..." msgstr "Spara Tema Som..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7077,6 +7125,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Skapa Ny" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Skapa Prenumeration" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Skapa Prenumeration" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Skapa Mapp" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Sökvägen är tom" @@ -7089,18 +7157,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Konvertera till %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Skapa Ny" +msgid "Convert to Polygon2D" +msgstr "Konvertera till %s" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Skapa Prenumeration" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7725,6 +7814,11 @@ msgid "Duplicate Nodes" msgstr "Duplicera Nod(er)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Ta bort Nod(er)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8966,11 +9060,6 @@ msgstr "Öppna Senaste" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Delete Node(s)" -msgstr "Ta bort Nod(er)" - -#: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add Child Node" msgstr "Lägg till Barn-Node" @@ -10842,9 +10931,6 @@ msgstr "" #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Instansiera valda scen(er) som barn till vald Node." -#~ msgid "FPS" -#~ msgstr "FPS" - #, fuzzy #~ msgid "Warnings:" #~ msgstr "Varning" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 1bb5f50fe1..17e837d5b1 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -418,13 +418,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3686,6 +3694,11 @@ msgid "Delete Node" msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•à®³à¯" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4642,7 +4655,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4713,6 +4750,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5063,52 +5146,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5613,7 +5659,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6431,6 +6477,23 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•à®³à¯" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6443,15 +6506,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -7029,6 +7112,11 @@ msgid "Duplicate Nodes" msgstr "அசைவூடà¯à®Ÿà¯ போலிபசà¯à®šà®¾à®µà®¿à®•à®³à¯" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•à®³à¯" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8180,10 +8268,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 9b70573576..b5f7015c88 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -405,13 +405,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3665,6 +3673,11 @@ msgid "Delete Node" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4616,7 +4629,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4687,6 +4724,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5037,52 +5120,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5586,7 +5632,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6404,6 +6450,22 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6416,15 +6478,35 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" +msgid "Create LightOccluder2D Sibling" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp @@ -6995,6 +7077,10 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8144,10 +8230,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 79ad3c5357..5b1470e970 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -448,14 +448,22 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Snap (พิà¸à¹€à¸‹à¸¥):" +msgid "Snap:" +msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation step value." msgstr "ผังà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸–ูà¸à¸•à¹‰à¸à¸‡" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "เฟรมต่à¸à¸§à¸´à¸™à¸²à¸—ี" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3891,6 +3899,11 @@ msgid "Delete Node" msgstr "ลบโหนด" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "ลบโหนด" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" @@ -4890,9 +4903,34 @@ msgid "Layout" msgstr "เลย์เà¸à¸²à¸•à¹Œ" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "เพิ่มคีย์" +msgid "Insert keys (based on mask)." +msgstr "เพิ่มคีย์ (à¹à¸—ร็à¸à¸—ี่มีà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "à¹à¸—รà¸à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4965,6 +5003,52 @@ msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม (ลบจุà msgid "Set Handle" msgstr "ปรับขนาดรูปร่าง" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "ผิดพลาดขณะโหลดรูป:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "รูปไม่มีพิà¸à¹€à¸‹à¸¥à¹ƒà¸”ที่ความโปร่งà¹à¸ªà¸‡ > 128 ..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "โหลด Mask à¸à¸²à¸£à¸›à¸°à¸—ุ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "à¸à¸™à¸¸à¸ าค" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "จำนวนจุดที่สร้างขึ้น:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Mask à¸à¸²à¸£à¸›à¸°à¸—ุ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "ใช้สีพิà¸à¹€à¸‹à¸¥" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "สีà¸à¸²à¸£à¸›à¸°à¸—ุ" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5317,22 +5401,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "สามารถà¸à¸³à¸«à¸™à¸”จุดให้à¹à¸à¹ˆ ParticlesMaterial เท่านั้น" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "ผิดพลาดขณะโหลดรูป:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "รูปไม่มีพิà¸à¹€à¸‹à¸¥à¹ƒà¸”ที่ความโปร่งà¹à¸ªà¸‡ > 128 ..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "โหลด Mask à¸à¸²à¸£à¸›à¸°à¸—ุ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5340,30 +5408,9 @@ msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•à¸±à¸§à¸žà¸´à¸¡à¸žà¹Œà¹ƒà¸«à¸à¹ˆ" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "à¸à¸™à¸¸à¸ าค" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "จำนวนจุดที่สร้างขึ้น:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "เวลาในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ (วินาที):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Mask à¸à¸²à¸£à¸›à¸°à¸—ุ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "ใช้สีพิà¸à¹€à¸‹à¸¥" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "สีà¸à¸²à¸£à¸›à¸°à¸—ุ" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "หน้าไม่มีพื้นที่!" @@ -5901,7 +5948,8 @@ msgid "Save Theme As..." msgstr "บันทึà¸à¸˜à¸µà¸¡à¹€à¸›à¹‡à¸™" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " ตำราà¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸„ลาส" #: editor/plugins/script_editor_plugin.cpp @@ -6752,6 +6800,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "สร้างเส้นขà¸à¸š Mesh" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "สร้างรูปหลายเหลี่ยม" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "สร้างรูปทรงนำทาง" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸šà¸±à¸™à¸—ึà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²!" @@ -6764,19 +6832,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "SpriteFrames" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™ %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "สร้างเส้นขà¸à¸š Mesh" +msgid "Convert to Polygon2D" +msgstr "ย้ายรูปหลายเหลี่ยม" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "สร้างรูปทรงนำทาง" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7405,6 +7495,11 @@ msgid "Duplicate Nodes" msgstr "ทำซ้ำโหนด" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "ลบโหนด" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8609,10 +8704,6 @@ msgid "Open documentation" msgstr "เปิดคู่มืà¸" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "ลบโหนด" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "เพิ่มโหนดลูà¸" @@ -10432,12 +10523,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Snap (พิà¸à¹€à¸‹à¸¥):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "เพิ่มคีย์" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "à¸à¸´à¸™à¸ªà¹à¸•à¸™à¸‹à¹Œà¸‰à¸²à¸à¸—ี่เลืà¸à¸à¹ƒà¸«à¹‰à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸à¸‚à¸à¸‡à¹‚หนดที่เลืà¸à¸" -#~ msgid "FPS" -#~ msgstr "เฟรมต่à¸à¸§à¸´à¸™à¸²à¸—ี" - #, fuzzy #~ msgid "Warnings:" #~ msgstr "คำเตืà¸à¸™" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 6ee2fd344a..30f753d6ab 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -23,12 +23,14 @@ # ege1212 <owlphp@gmail.com>, 2019. # Ömer YAZICIOÄžLU <oyazicioglu@gmail.com>, 2019. # Mertcan Duman <mertcan.dmn16@gmail.com>, 2019. +# Furkan Türkal <furkan.turkal@hotmail.com>, 2019. +# Aiden Demir <dnm00110011@hotmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-19 15:04+0000\n" -"Last-Translator: Mertcan Duman <mertcan.dmn16@gmail.com>\n" +"PO-Revision-Date: 2019-04-14 13:04+0000\n" +"Last-Translator: Aiden Demir <dnm00110011@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -52,17 +54,16 @@ msgstr "Byte kodu çözmek için yetersiz byte, ya da Geçersiz format." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Geçersiz girdi, ifadede %i (geçirilmedi)" +msgstr "%i ifadesindeki girdi geçersiz" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" -"\"self\" ifadesi kullanılamaz çünkü örnekleme \"null\" yani tanımlanmadı." +msgstr "\"self\" ifadesi kullanılamaz, çünkü nesne \"null\" (tanımlandı)." #: core/math/expression.cpp #, fuzzy msgid "Invalid operands to operator %s, %s and %s." -msgstr "%s düğümünde geçersiz indeks özelliÄŸi ismi '%s'." +msgstr "Geçersiz iÅŸlenen operatörler %s, %s ve %s" #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -90,33 +91,28 @@ msgid "Balanced" msgstr "DengelenmiÅŸ" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" -msgstr "ayna" +msgstr "Ayna" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" msgstr "Anahtar Gir" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Seçimi ÇoÄŸalt" +msgstr "Seçilen TuÅŸu/TuÅŸları ÇoÄŸalt" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Delete Selected Key(s)" -msgstr "Seçilenleri Sil" +msgstr "Seçilen TuÅŸu/TuÅŸları Sil" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Add Bezier Point" -msgstr "Nokta Ekle" +msgstr "Bezier Noktası Ekle" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "Noktayı Taşı" +msgstr "Bezier Noktalarını Taşı" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -285,9 +281,8 @@ msgid "Duplicate Key(s)" msgstr "Düğüm(leri) ÇoÄŸalt" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Key(s)" -msgstr "Düğümleri Sil" +msgstr "TuÅŸları Sil" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" @@ -344,7 +339,6 @@ msgid "Anim Insert Key" msgstr "Animasyon Anahtar Gir" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Step" msgstr "Animasyon Adımını DeÄŸiÅŸtir" @@ -446,13 +440,21 @@ msgstr "Ä°zleri düğüme göre grupla veya onları düz liste olarak göster." #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " -msgstr "Yapış (Noktalara):" +msgid "Snap:" +msgstr "Yapış" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Animasyon adım deÄŸeri." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "FPS" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -487,17 +489,14 @@ msgid "Duplicate Transposed" msgstr "Tersine ÇevrilmiÅŸi ÇoÄŸalt" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" msgstr "Seçilenleri Sil" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" msgstr "Sonraki Adıma Git" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" msgstr "Önceki Adıma Git" @@ -752,12 +751,10 @@ msgid "Disconnect" msgstr "BaÄŸlantıyı kes" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect Signal: " msgstr "BaÄŸlantı Sinyali: " #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection: " msgstr "BaÄŸlantıları Düzenle " @@ -779,7 +776,6 @@ msgid "Disconnect All" msgstr "Tüm BaÄŸlantıları Kes" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit..." msgstr "Düzenle" @@ -918,9 +914,8 @@ msgid "Error loading:" msgstr "Yüklerken hata:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Load failed due to missing dependencies:" -msgstr "Sahnedeki kayıp bağımlılıklar yüzünden sahneyi yükleme baÅŸarısız oldu:" +msgstr "Yükleme eksik baÄŸlamlar yüzünden baÅŸarısız oldu:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1218,9 +1213,8 @@ msgid "Add Bus" msgstr "Bus ekle" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "Audio Bus YerleÅŸim Düzenini Farklı Kaydet..." +msgstr "" #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1388,27 +1382,30 @@ msgid "Storing File:" msgstr "Dosya Depolama:" #: editor/editor_export.cpp -#, fuzzy msgid "No export template found at the expected path:" msgstr "" -"Hiçbir dışa aktarım kalıbı bulunamadı.\n" -"Dışa aktarım kalıplarını indirin ve yükleyin..." #: editor/editor_export.cpp msgid "Packing" msgstr "Çıkınla" #: editor/editor_export.cpp +#, fuzzy msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"Hedef platform GLES2 için 'ETC' doku sıkıştırma gerektirir. Proje " +"Ayarları'nda 'Import Etc' etkinleÅŸtirin." #: editor/editor_export.cpp +#, fuzzy msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"Hedef platform GLES3 için 'ETC2' doku sıkıştırma gerektirir. Proje " +"Ayarları'nda 'Import Etc 2' etkinleÅŸtirin." #: editor/editor_export.cpp msgid "" @@ -3927,6 +3924,11 @@ msgid "Delete Node" msgstr "Düğümleri Sil" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Düğümleri Sil" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Dikkat-Dağıtmayan Kipine geç." @@ -4930,9 +4932,34 @@ msgid "Layout" msgstr "YerleÅŸim Düzeni" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Anahtar Gir (Var Olan Ä°zler)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "Anahtarları Gir" +msgid "Auto Insert Key" +msgstr "Animasyon Anahtar Gir" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5005,6 +5032,52 @@ msgstr "Çokluyu Düzenleyin (Noktayı Silin)" msgid "Set Handle" msgstr "Tutamacı Ayarla" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Resim yüklenirken hata:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Saydamlığı olan nokta yok > 128 bedizde..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Yayma Maskesini Yükle" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Yayma Maskesini Temizle" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Parçacıklar" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Ãœretilen Nokta Sayısı:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "Emisyon Maskesi" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Pikselden Yakala" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Emisyon Renkleri" + #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy msgid "CPUParticles" @@ -5357,22 +5430,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Nokta sadece ParçacıkMateryal iÅŸlem materyalinin içinde ayarlanabilir" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Resim yüklenirken hata:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Saydamlığı olan nokta yok > 128 bedizde..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Yayma Maskesini Yükle" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Yayma Maskesini Temizle" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5380,30 +5437,9 @@ msgstr "Büyük Harfe Dönüştür" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "Parçacıklar" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "Ãœretilen Nokta Sayısı:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Nesil Süresi (sn):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "Emisyon Maskesi" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Pikselden Yakala" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Emisyon Renkleri" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Yüzler alan içermez!" @@ -5941,7 +5977,8 @@ msgid "Save Theme As..." msgstr "Temayı Farklı Kaydet..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " Sınıf BaÅŸvurusu" #: editor/plugins/script_editor_plugin.cpp @@ -6792,6 +6829,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "Anahat Örüntüsü OluÅŸtur" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Çoklu OluÅŸturun" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Yönlendirici Çokgeni OluÅŸtur" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Engelleyici Çokgeni OluÅŸtur" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "Kayıt yolu boÅŸ!" @@ -6804,19 +6861,41 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Sprite" msgstr "GörüntüKareleri" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "Åžuna Dönüştür %s" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Anahat Örüntüsü OluÅŸtur" +msgid "Convert to Polygon2D" +msgstr "Çokgeni Taşı" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Yönlendirici Çokgeni OluÅŸtur" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Engelleyici Çokgeni OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7444,6 +7523,11 @@ msgid "Duplicate Nodes" msgstr "Düğüm(leri) ÇoÄŸalt" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Düğümleri Sil" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8658,10 +8742,6 @@ msgid "Open documentation" msgstr "Çevrimiçi Godot dökümanlarını aç" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Düğümleri Sil" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Çocuk Düğüm Ekle" @@ -10545,12 +10625,17 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#, fuzzy +#~ msgid "Snap (s): " +#~ msgstr "Yapış (Noktalara):" + +#, fuzzy +#~ msgid "Insert keys." +#~ msgstr "Anahtarları Gir" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Seçilen sahneyi/sahneleri seçilen düğüme çocuk olarak örneklendir." -#~ msgid "FPS" -#~ msgstr "FPS" - #, fuzzy #~ msgid "Warnings:" #~ msgstr "Uyarılar" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 0929e66b29..637c1ffac4 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -425,13 +425,22 @@ msgstr "" "Групувати доріжки за вузлами або показувати Ñ—Ñ… у форматі проÑтого ÑпиÑку." #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ (Ñ): " +#, fuzzy +msgid "Snap:" +msgstr "ПрилипаннÑ" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÑ€Ð¾ÐºÑƒ анімації." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "Кадри за Ñекунду" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3819,6 +3828,11 @@ msgid "Delete Node" msgstr "Вилучити вузол" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Вилучити вузли" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "Увімкнути або вимкнути фільтр" @@ -4796,8 +4810,34 @@ msgid "Layout" msgstr "Макет" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "Ð’Ñтавити ключі." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Ð’Ñтавити ключ (Ñ–Ñнуючі доріжки)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "Ð’Ñтавити ключ анімації" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4870,6 +4910,52 @@ msgstr "Редагувати полігон (вилучити точку)" msgid "Set Handle" msgstr "Ð’Ñтановити обробник" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "Ð’ зображенні немає пікÑелів з прозоріÑÑ‚ÑŽ > 128..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "Завантажити маÑку випромінюваннÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ОчиÑтити маÑку випромінюваннÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "ЧаÑтинки" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "КількіÑÑ‚ÑŒ генерованих точок:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "МаÑка випромінюваннÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "Захопити з пікÑелÑ" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "Кольори випромінюваннÑ" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUParticles" @@ -5221,52 +5307,15 @@ msgstr "" "ПоÑтавити точку можна тільки в процедурному матеріалі ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "Ð’ зображенні немає пікÑелів з прозоріÑÑ‚ÑŽ > 128..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "Завантажити маÑку випромінюваннÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ОчиÑтити маÑку випромінюваннÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "Перетворити на CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "ЧаÑтинки" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "КількіÑÑ‚ÑŒ генерованих точок:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "Ð§Ð°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ— (Ñек):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "МаÑка випромінюваннÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "Захопити з пікÑелÑ" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "Кольори випромінюваннÑ" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Грані не міÑÑ‚ÑÑ‚ÑŒ ділÑнки!" @@ -5777,7 +5826,8 @@ msgid "Save Theme As..." msgstr "Зберегти тему Ñк..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° клаÑ" #: editor/plugins/script_editor_plugin.cpp @@ -6603,6 +6653,26 @@ msgid "Nameless gizmo" msgstr "Штука без назви" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Створити плоÑку Ñітку" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Створити Polygon3D" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Створити полігон зіткненнÑ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Створено затінювальний полігон" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Спрайт порожній!" @@ -6617,16 +6687,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Ðекоректна геометріÑ, неможливо замінити Ñіткою." #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "Ðекоректна геометріÑ, неможливо замінити Ñіткою." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "Ðекоректна геометріÑ, неможливо замінити Ñіткою." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "Ðекоректна геометріÑ, неможливо замінити Ñіткою." + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Спрайт" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "Перетворити на плоÑку Ñітку" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "Створити плоÑку Ñітку" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "ПереміÑтити полігон" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Створити полігон зіткненнÑ" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "Створено затінювальний полігон" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7215,6 +7312,11 @@ msgid "Duplicate Nodes" msgstr "Дублювати вузли" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Вилучити вузол" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "Змінено тип Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ шейдера" @@ -8436,10 +8538,6 @@ msgid "Open documentation" msgstr "Відкрити документацію" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Вилучити вузли" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Додати дочірній вузол" @@ -10326,12 +10424,15 @@ msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ñ€Ñ–Ð´Ð½Ð¾Ð³Ð¾." msgid "Varyings can only be assigned in vertex function." msgstr "Змінні величини можна пов'Ñзувати лише із функцією вузлів." +#~ msgid "Snap (s): " +#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ (Ñ): " + +#~ msgid "Insert keys." +#~ msgstr "Ð’Ñтавити ключі." + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "Додати вибрану Ñцену(и), Ñк нащадка вибраного вузла." -#~ msgid "FPS" -#~ msgstr "Кадри за Ñекунду" - #~ msgid "Warnings:" #~ msgstr "ПопередженнÑ:" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 72cbf7eb88..cf4d0fe630 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -413,13 +413,21 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -msgid "Snap (s): " +msgid "Snap:" msgstr "" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3714,6 +3722,11 @@ msgid "Delete Node" msgstr ".اینیمیشن Ú©ÛŒ کیز Ú©Ùˆ ڈیلیٹ کرو" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "" @@ -4680,7 +4693,31 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4752,6 +4789,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5105,52 +5188,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5667,7 +5713,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6494,6 +6540,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "سب سکریپشن بنائیں" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "سب سکریپشن بنائیں" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "سب سکریپشن بنائیں" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "سب سکریپشن بنائیں" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6506,19 +6572,40 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" +msgid "Convert to Polygon2D" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" msgstr "سب سکریپشن بنائیں" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " msgstr "" @@ -7113,6 +7200,11 @@ msgid "Duplicate Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr ".اینیمیشن Ú©ÛŒ کیز Ú©Ùˆ ڈیلیٹ کرو" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8272,10 +8364,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 74bd1df7eb..d18046ad52 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -436,7 +436,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "BÆ°á»›c (s):" #: editor/animation_track_editor.cpp @@ -444,6 +444,14 @@ msgstr "BÆ°á»›c (s):" msgid "Animation step value." msgstr "Phóng Animation." +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3798,6 +3806,11 @@ msgid "Delete Node" msgstr "Xóa Node(s)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Xóa Node(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "Báºt tắt Ưa thÃch" @@ -4777,8 +4790,33 @@ msgid "Layout" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "Chèn Key Anim" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "Chèn Key Anim" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4850,6 +4888,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5200,52 +5284,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5764,7 +5811,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6594,6 +6641,26 @@ msgid "Nameless gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "Tạo %s Má»›i" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "Tạo" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "Tạo" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "Tạo Folder" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "" @@ -6606,17 +6673,38 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "Tạo %s Má»›i" +msgid "Convert to Polygon2D" +msgstr "Xóa Animation" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "Tạo" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7216,6 +7304,11 @@ msgid "Duplicate Nodes" msgstr "Nhân đôi Node(s)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "Xóa Node(s)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8382,10 +8475,6 @@ msgid "Open documentation" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "Xóa Node(s)" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index e79ca6a36d..3e03b0e8ff 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -43,12 +43,13 @@ # Song DongHui <14729626293@163.com>, 2019. # simano clio <sim2cle@gmail.com>, 2019. # ByonkoGalilei <byonko@qq.com>, 2019. +# qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>, 2019. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2019-04-08 10:35+0000\n" -"Last-Translator: ByonkoGalilei <byonko@qq.com>\n" +"PO-Revision-Date: 2019-04-23 15:48+0000\n" +"Last-Translator: qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -56,7 +57,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.6-dev\n" +"X-Generator: Weblate 3.7-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -67,7 +68,7 @@ msgstr "convert函数å‚数类型éžæ³•ï¼Œè¯·ä¼ 入以“TYPE_â€æ‰“å¤´çš„å¸¸é‡ #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "没有足够的å—节æ¥è§£ç æˆ–æ ¼å¼ä¸æ£ç¡®ã€‚" +msgstr "没有足够的å—节æ¥è§£ç æˆ–æ— æ•ˆçš„æ ¼å¼ã€‚" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -75,27 +76,27 @@ msgstr "表达å¼ä¸æœ‰éžæ³•çš„输入 %i (未通过)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "è‡ªèº«æ— æ³•ä½¿ç”¨å› ä¸ºå®žä¾‹ä¸ºç©º" +msgstr "selfæ— æ³•ä½¿ç”¨å› ä¸ºå®žä¾‹ä¸ºç©º(ä¸é€šè¿‡)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "è¿ç®—符%s,%s和%sçš„æ“ä½œæ•°æ— æ•ˆã€‚" +msgstr "æ“作符的æ“ä½œæ•°æ— æ•ˆ%s, %s and %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "æ— æ•ˆå†…å˜åœ°å€ç±»åž‹ %s,基类 %s" +msgstr "æ— æ•ˆç±»åž‹ç´¢å¼• %s,从基类 %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "对基础类型 %s éžæ³•çš„å…·å索引 '%s'" +msgstr "从基类 %s æ— æ•ˆçš„å称索引 '%s'" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "ï¼šæ— æ•ˆå‚数类型: '%s'" +msgstr "æž„é€ çš„å‚æ•°æ— æ•ˆï¼š '%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "在对 '%s' 的调用ä¸:" +msgstr "对'%s'调用 :" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -132,7 +133,7 @@ msgstr "移动è´å¡žå°”顶点" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "å¤åˆ¶å…³é”®å¸§" +msgstr "动画å¤åˆ¶å…³é”®å¸§" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" @@ -140,7 +141,7 @@ msgstr "åˆ é™¤å…³é”®å¸§" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "修改动画关键帧的时间" +msgstr "修改动画关键帧的时长" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -412,9 +413,8 @@ msgid "Track path is invalid, so can't add a method key." msgstr "è·Ÿè¸ªè·¯å¾„æ— æ•ˆï¼Œæ‰€ä»¥ä¸èƒ½æ·»åŠ 方法帧。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "调用方法轨é“" +msgstr "æ·»åŠ æ–¹æ³•è½¨é“é”®" #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -450,13 +450,22 @@ msgid "Group tracks by node or display them as plain list." msgstr "按节点分组或将它们显示为普通列表。" #: editor/animation_track_editor.cpp -msgid "Snap (s): " -msgstr "å¸é™„: " +#, fuzzy +msgid "Snap:" +msgstr "å¸é™„" #: editor/animation_track_editor.cpp msgid "Animation step value." msgstr "动画æ¥è¿›å€¼ã€‚" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "帧数" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -1299,7 +1308,7 @@ msgstr "ä¸åœ¨èµ„æºè·¯å¾„下。" #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "æ·»åŠ Autoload" +msgstr "æ·»åŠ è‡ªåŠ¨åŠ è½½" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp @@ -2439,7 +2448,7 @@ msgstr "在线文档" #: editor/editor_node.cpp msgid "Q&A" -msgstr "é—®ç”" +msgstr "常è§é—®é¢˜ä¸Žç”案" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -3590,19 +3599,16 @@ msgstr "åŠ è½½..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Move Node Point" -msgstr "移动点" +msgstr "移动节点" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Limits" -msgstr "更改混åˆæ—¶é—´" +msgstr "更改混åˆç©ºé—´1Dé™åˆ¶" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Labels" -msgstr "更改混åˆæ—¶é—´" +msgstr "更改混åˆç©ºé—´1Dæ ‡ç¾" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3612,24 +3618,21 @@ msgstr "æ¤ç±»åž‹çš„节点ä¸èƒ½è¢«ä½¿ç”¨ã€‚ä»…å…è®¸ä½¿ç”¨æ ¹èŠ‚ç‚¹ã€‚" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Node Point" -msgstr "æ·»åŠ èŠ‚ç‚¹" +msgstr "æ·»åŠ èŠ‚ç‚¹é¡¶ç‚¹" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Animation Point" -msgstr "æ·»åŠ åŠ¨ç”»" +msgstr "æ·»åŠ åŠ¨ç”»ç‚¹" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" -msgstr "移除路径顶点" +msgstr "移除混åˆç©ºé—´1D顶点" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" -msgstr "" +msgstr "移动混åˆç©ºé—´1D节点顶点" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3678,24 +3681,20 @@ msgid "Add Triangle" msgstr "æ·»åŠ ä¸‰è§’é¢" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Limits" -msgstr "更改混åˆæ—¶é—´" +msgstr "更改混åˆç©ºé—´2Dé™åˆ¶" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Labels" -msgstr "更改混åˆæ—¶é—´" +msgstr "更改混åˆç©ºé—´2Dæ ‡ç¾" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Point" -msgstr "移除路径顶点" +msgstr "移除混åˆç©ºé—´2D顶点" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Triangle" -msgstr "åˆ é™¤å˜é‡" +msgstr "移除混åˆç©ºé—´2D三角形" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." @@ -3740,9 +3739,8 @@ msgid "Output node can't be added to the blend tree." msgstr "输出节点ä¸èƒ½è¢«æ·»åŠ 到混åˆæ ‘。" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Add Node to BlendTree" -msgstr "ä»Žæ ‘ä¸æ·»åŠ 节点" +msgstr "在åˆæˆæ ‘ä¸æ·»åŠ 节点" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -3770,11 +3768,15 @@ msgstr "设置动画" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" msgstr "åˆ é™¤èŠ‚ç‚¹" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "åˆ é™¤èŠ‚ç‚¹" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" msgstr "打开/å…³é—过滤器" @@ -4732,8 +4734,34 @@ msgid "Layout" msgstr "布局" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert keys." -msgstr "æ’入帧。" +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "æ’入关键帧( 创建轨é“)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "æ’入关键帧" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -4805,6 +4833,52 @@ msgstr "编辑多边形(移除顶点)" msgid "Set Handle" msgstr "设置处ç†ç¨‹åº" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "åŠ è½½å›¾ç‰‡å‡ºé”™:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "图片ä¸æ²¡æœ‰é€æ˜Žåº¦> 128çš„åƒç´ ..." + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "åŠ è½½Emission Mask(å‘å°„å±è”½ï¼‰" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "清除Emission Mask(å‘å°„å±è”½ï¼‰" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "ç²’å" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "生æˆé¡¶ç‚¹è®¡æ•°:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "å‘å…‰é®ç½©ï¼ˆmask)" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "从åƒç´ æ•æ‰" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "å‘光颜色" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "CPUç²’å" @@ -5155,52 +5229,15 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "å¯ä»¥è®¾ç½®ParticlesMaterial 点的æè´¨" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "åŠ è½½å›¾ç‰‡å‡ºé”™:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "图片ä¸æ²¡æœ‰é€æ˜Žåº¦> 128çš„åƒç´ ..." - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "åŠ è½½Emission Mask(å‘å°„å±è”½ï¼‰" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "清除Emission Mask(å‘å°„å±è”½ï¼‰" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" msgstr "转æ¢ä¸º CPUç²’å" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "ç²’å" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "生æˆé¡¶ç‚¹è®¡æ•°:" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "生æˆæ—¶é—´ï¼ˆç§’):" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "å‘å…‰é®ç½©ï¼ˆmask)" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "从åƒç´ æ•æ‰" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "å‘光颜色" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "é¢ä¸å«æœ‰åŒºåŸŸï¼" @@ -5704,7 +5741,8 @@ msgid "Save Theme As..." msgstr "主题å¦å˜ä¸º..." #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +#, fuzzy +msgid "%s Class Reference" msgstr " 类引用" #: editor/plugins/script_editor_plugin.cpp @@ -6198,9 +6236,8 @@ msgid "Rear" msgstr "åŽæ–¹" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Align with View" -msgstr "与视图对é½" +msgstr "对é½è§†å›¾" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -6530,6 +6567,26 @@ msgid "Nameless gizmo" msgstr "未命åçš„Gizmo" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "创建 2D ç½‘æ ¼" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "创建3D多边形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "创建碰撞多边形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "æ·»åŠ é®å…‰å¤šè¾¹å½¢" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" msgstr "Sprite 是空的ï¼" @@ -6542,16 +6599,43 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "æ— æ•ˆçš„å‡ ä½•ä½“ï¼Œæ— æ³•ä½¿ç”¨ç½‘æ ¼æ›¿æ¢ã€‚" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "æ— æ•ˆçš„å‡ ä½•ä½“ï¼Œæ— æ³•ä½¿ç”¨ç½‘æ ¼æ›¿æ¢ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "æ— æ•ˆçš„å‡ ä½•ä½“ï¼Œæ— æ³•ä½¿ç”¨ç½‘æ ¼æ›¿æ¢ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "æ— æ•ˆçš„å‡ ä½•ä½“ï¼Œæ— æ³•ä½¿ç”¨ç½‘æ ¼æ›¿æ¢ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "Sprite ç²¾çµ" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Convert to 2D Mesh" +#, fuzzy +msgid "Convert to Mesh2D" msgstr "转æ¢ä¸º 2D ç½‘æ ¼" #: editor/plugins/sprite_editor_plugin.cpp -msgid "Create 2D Mesh" -msgstr "创建 2D ç½‘æ ¼" +#, fuzzy +msgid "Convert to Polygon2D" +msgstr "移动多边形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "创建碰撞多边形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "æ·»åŠ é®å…‰å¤šè¾¹å½¢" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -6916,7 +7000,7 @@ msgstr "上一个åæ ‡" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "选择上一个形状,åç –å—ï¼Œæˆ–ç –å—。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -7121,7 +7205,7 @@ msgstr "瓦片集" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "设置统一å称" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" @@ -7136,8 +7220,13 @@ msgid "Duplicate Nodes" msgstr "å¤åˆ¶èŠ‚点" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "åˆ é™¤èŠ‚ç‚¹" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "å¯è§†ç€è‰²å™¨è¾“入类型已更改" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -7180,6 +7269,8 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"æ— æ³•å¯¼å‡ºå¹³å°'ï¼…s'的项目。\n" +"导出模æ¿ä¼¼ä¹Žä¸¢å¤±æˆ–æ— æ•ˆã€‚" #: editor/project_export.cpp msgid "" @@ -7187,6 +7278,8 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" +"æ— æ³•å¯¼å‡ºå¹³å°'ï¼…s'的项目。\n" +"å¯èƒ½ç”±äºŽå¯¼å‡ºé¢„设或导出设置内的é…置有问题。" #: editor/project_export.cpp msgid "Release" @@ -8317,10 +8410,6 @@ msgid "Open documentation" msgstr "打开Godot文档" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "åˆ é™¤èŠ‚ç‚¹" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "æ·»åŠ å节点" @@ -9830,7 +9919,7 @@ msgstr "" msgid "" "Plane shapes don't work well and will be removed in future versions. Please " "don't use them." -msgstr "" +msgstr "å¹³é¢å½¢çŠ¶æ— 法æ£å¸¸å·¥ä½œï¼Œæœªæ¥ç‰ˆæœ¬å°†è¢«åˆ 除。请勿使用。" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -9851,6 +9940,8 @@ msgid "" "GIProbes are not supported by the GLES2 video driver.\n" "Use a BakedLightmap instead." msgstr "" +"GLES2视频驱动程åºä¸æ”¯æŒå…¨å±€å…‰ç…§æŽ¢æµ‹å™¨ã€‚\n" +"请改用已烘焙ç¯å…‰è´´å›¾ã€‚" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -10017,6 +10108,8 @@ msgid "" "If you dont't intend to add a script, then please use a plain 'Control' node " "instead." msgstr "" +"除éžåœ¨è„šæœ¬å†…é…置其å项的放置行为,å¦åˆ™å®¹å™¨æœ¬èº«æ²¡æœ‰ç”¨å¤„。\n" +"如果您ä¸æ‰“ç®—æ·»åŠ è„šæœ¬ï¼Œè¯·ä½¿ç”¨ç®€å•çš„“控件â€èŠ‚点。" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -10109,12 +10202,15 @@ msgstr "对uniform的赋值。" msgid "Varyings can only be assigned in vertex function." msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" +#~ msgid "Snap (s): " +#~ msgstr "å¸é™„: " + +#~ msgid "Insert keys." +#~ msgstr "æ’入帧。" + #~ msgid "Instance the selected scene(s) as child of the selected node." #~ msgstr "将选ä¸çš„场景实例为选ä¸èŠ‚点的å节点。" -#~ msgid "FPS" -#~ msgstr "帧数" - #~ msgid "Warnings:" #~ msgstr "è¦å‘Šï¼š" @@ -11638,9 +11734,6 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" #~ msgid "Cannot go into subdir:" #~ msgstr "æ— æ³•æ‰“å¼€ç›®å½•:" -#~ msgid "Insert Keys (Ins)" -#~ msgstr "æ’入关键帧( 创建轨é“)" - #~ msgid "Perspective (Num5)" #~ msgstr "é€è§†ï¼ˆNum5)" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 2abca01297..45b43c3ce6 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -2,15 +2,14 @@ # Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. -# # Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017. -# +# cnieFIT <dtotncq@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-13 14:44+0100\n" -"Last-Translator: zx-wt <ZX_WT@ymail.com>\n" +"PO-Revision-Date: 2019-04-10 00:46+0000\n" +"Last-Translator: cnieFIT <dtotncq@gmail.com>\n" "Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant_HK/>\n" "Language: zh_HK\n" @@ -18,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.2\n" +"X-Generator: Weblate 3.6-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -447,7 +446,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "é¸æ“‡æ¨¡å¼" #: editor/animation_track_editor.cpp @@ -455,6 +454,14 @@ msgstr "é¸æ“‡æ¨¡å¼" msgid "Animation step value." msgstr "新增動畫" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3966,6 +3973,11 @@ msgid "Delete Node" msgstr "ä¸é¸" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "(ä¸ï¼‰é¡¯ç¤ºæœ€æ„›" @@ -4962,8 +4974,33 @@ msgid "Layout" msgstr "儲å˜ä½ˆå±€" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Insert keys (based on mask)." +msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." +msgid "Auto Insert Key" msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5035,6 +5072,52 @@ msgstr "" msgid "Set Handle" msgstr "" +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" msgstr "" @@ -5392,22 +5475,6 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5415,30 +5482,9 @@ msgstr "轉為..." #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" msgstr "" -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" - #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "" @@ -5970,7 +6016,7 @@ msgid "Save Theme As..." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" +msgid "%s Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -6550,9 +6596,8 @@ msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Doppler Enable" -msgstr "啟用" +msgstr "啟用多普拉效應" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" @@ -6829,6 +6874,26 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy +msgid "Create Mesh2D" +msgstr "新增" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "縮放selection" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "縮放selection" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "新增資料夾" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" msgstr "路徑為空" @@ -6841,18 +6906,39 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" +msgid "Convert to Mesh2D" msgstr "轉為..." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "新增" +msgid "Convert to Polygon2D" +msgstr "轉為..." + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "縮放selection" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " @@ -7469,6 +7555,11 @@ msgid "Duplicate Nodes" msgstr "複製動畫幀" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "ä¸é¸" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" msgstr "" @@ -8676,10 +8767,6 @@ msgid "Open documentation" msgstr "開啓最近的" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 8fdb7e8db0..6f858474a2 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-03-30 20:04+0000\n" +"PO-Revision-Date: 2019-04-25 11:54+0000\n" "Last-Translator: cnieFIT <dtotncq@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" @@ -27,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.6-dev\n" +"X-Generator: Weblate 3.7-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -41,9 +41,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "輸入的解碼å—節ä¸è¶³ã€æˆ–ç‚ºç„¡æ•ˆæ ¼å¼ã€‚" #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %i (not passed) in expression" -msgstr "所輸入的 %i 於表ç¾å¼ä¸ç„¡æ•ˆ" +msgstr "é‹ç®—å¼ä¸çš„輸入 %i 無效 (未傳éž)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -96,12 +95,12 @@ msgstr "刪除所é¸ç•«æ ¼" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "æ·»åŠ è²å¡žçˆ¾é»ž" #: editor/animation_bezier_editor.cpp #, fuzzy msgid "Move Bezier Points" -msgstr "移除" +msgstr "移動è²å¡žçˆ¾é»ž" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -207,11 +206,11 @@ msgstr "æ›´æ–°æ¨¡å¼ (如何è¨ç½®æ¤å±¬æ€§)" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" -msgstr "" +msgstr "æ’值模å¼" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "" +msgstr "循環包裹模å¼ï¼ˆå¾žå¾ªç’°é–‹å§‹æ’å…¥çµæŸï¼‰" #: editor/animation_track_editor.cpp #, fuzzy @@ -242,11 +241,11 @@ msgstr "觸發器" #: editor/animation_track_editor.cpp msgid "Capture" -msgstr "" +msgstr "æ•ç²" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "最近的" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -378,11 +377,11 @@ msgstr "æ·»åŠ å‹•ç•«è»Œ" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "軌é“路徑無效, å› æ¤ç„¡æ³•æ·»åŠ éµã€‚" #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "軌é“ä¸æ˜¯ç©ºé–“é¡žåž‹, ä¸èƒ½æ’å…¥éµ" #: editor/animation_track_editor.cpp #, fuzzy @@ -396,7 +395,7 @@ msgstr "æ·»åŠ å‹•ç•«è»Œ" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "跟蹤路徑無效, å› æ¤ç„¡æ³•æ·»åŠ 方法éµã€‚" #: editor/animation_track_editor.cpp #, fuzzy @@ -405,7 +404,7 @@ msgstr "動畫新增軌跡與按éµ" #: editor/animation_track_editor.cpp msgid "Method not found in object: " -msgstr "" +msgstr "在å°è±¡ä¸æ‰¾ä¸åˆ°æ–¹æ³•ï¼š " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -413,7 +412,7 @@ msgstr "移動關éµç•«æ ¼" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "" +msgstr "剪貼æ¿ç‚ºç©º" #: editor/animation_track_editor.cpp #, fuzzy @@ -422,24 +421,24 @@ msgstr "貼上åƒæ•¸" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" -msgstr "" +msgstr "縮尺éµ" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "這個é¸é …ä¸é©ç”¨æ–¼è²å¡žçˆ¾ç·¨è¼¯ï¼Œå› 為它åªæ˜¯ä¸€å€‹å–®è»Œã€‚" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "僅顯示樹ä¸æ‰€é¸ç¯€é»žçš„軌跡。" #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "" +msgstr "按節點å°è»Œè·¡åˆ†çµ„或將其顯示為普通清單。" #: editor/animation_track_editor.cpp #, fuzzy -msgid "Snap (s): " +msgid "Snap:" msgstr "æ¥é©Ÿ :" #: editor/animation_track_editor.cpp @@ -447,6 +446,14 @@ msgstr "æ¥é©Ÿ :" msgid "Animation step value." msgstr "動畫空間。" +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "FPS" +msgstr "" + #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -454,7 +461,7 @@ msgstr "動畫空間。" #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "編輯" #: editor/animation_track_editor.cpp #, fuzzy @@ -507,11 +514,11 @@ msgstr "清除動畫" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "" +msgstr "é¸æ“‡è¦è¨å®šå‹•ç•«çš„節點:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "使用è²å¡žçˆ¾æ›²ç·š" #: editor/animation_track_editor.cpp #, fuzzy @@ -560,7 +567,7 @@ msgstr "縮放比例:" #: editor/animation_track_editor.cpp msgid "Select tracks to copy:" -msgstr "" +msgstr "é¸æ“‡è¦è¤‡è£½çš„軌é“:" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -568,7 +575,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "" +msgstr "複製" #: editor/animation_track_editor_plugins.cpp #, fuzzy @@ -577,11 +584,11 @@ msgstr "æ·»åŠ å‹•ç•«è»Œ" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "更改音訊軌é“剪輯起始å移" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "更改音訊曲目剪輯çµæŸå移" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -649,11 +656,11 @@ msgstr "é‡è¨ç¸®æ”¾å¤§å°" #: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp msgid "Warnings" -msgstr "" +msgstr "è¦å‘Š" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "行號和列號。" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" @@ -761,7 +768,7 @@ msgstr "連接..." #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" -msgstr "" +msgstr "確定è¦å¾žâ€œ%sâ€è¨Šè™Ÿä¸åˆ 除所有連接嗎?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" @@ -769,7 +776,7 @@ msgstr "信號" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" -msgstr "" +msgstr "確定è¦åˆ 除æ¤è¨Šè™Ÿçš„所有連接嗎?" #: editor/connections_dialog.cpp #, fuzzy @@ -778,7 +785,7 @@ msgstr "æ–·ç·š" #: editor/connections_dialog.cpp msgid "Edit..." -msgstr "" +msgstr "編輯…" #: editor/connections_dialog.cpp #, fuzzy @@ -839,8 +846,8 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" -"å ´æ™¯ '%s' 已被變更\n" -"é‡æ–°è¼‰å…¥æ‰èƒ½ä½¿è®Šæ›´ç”Ÿæ•ˆ" +"å ´æ™¯ '%s' 已被變更.\n" +"é‡æ–°è¼‰å…¥æ‰èƒ½ä½¿å…¶ç”Ÿæ•ˆ." #: editor/dependency_editor.cpp msgid "" @@ -950,7 +957,7 @@ msgstr "沒有明定æ“有者的資æºï¼š" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "å¤ç«‹è³‡æ–™ç®¡ç†å™¨" #: editor/dependency_editor.cpp msgid "Delete selected files?" @@ -1276,11 +1283,11 @@ msgstr "ä¸æ£ç¢ºçš„åå—。åå—ä¸èƒ½èˆ‡ç¾æœ‰çš„ engine class åè¡çªã€‚" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." -msgstr "å稱已å˜åœ¨, ä¸èƒ½è·Ÿå·²ç¶“å˜åœ¨çš„內建類別é‡è¤‡" +msgstr "無效å稱.ä¸èƒ½èˆ‡ç¾æœ‰çš„內置類型å稱沖çª." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." -msgstr "å稱已å˜åœ¨, ä¸èƒ½è·Ÿå·²ç¶“å˜åœ¨çš„全域變數å稱é‡è¤‡" +msgstr "無效å稱.ä¸èƒ½è·Ÿå·²ç¶“å˜åœ¨çš„全局常é‡å稱é‡è¤‡." #: editor/editor_autoload_settings.cpp #, fuzzy @@ -1316,15 +1323,15 @@ msgstr "é‡æ–°æŽ’列 Autoload" #: editor/editor_autoload_settings.cpp msgid "Invalid Path." -msgstr "無效的路徑" +msgstr "無效的路徑." #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "檔案ä¸å˜åœ¨" +msgstr "檔案ä¸å˜åœ¨." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "在資æºè·¯å¾‘ä¸æ‰¾ä¸åˆ°" +msgstr "ä¸åœ¨è³‡æºè·¯å¾‘ä¸ã€‚" #: editor/editor_autoload_settings.cpp #, fuzzy @@ -1394,7 +1401,7 @@ msgstr "å稱:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "無法新增資料夾" +msgstr "無法新增資料夾." #: editor/editor_dir_dialog.cpp msgid "Choose" @@ -1410,7 +1417,7 @@ msgstr "" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "包è£ä¸" #: editor/editor_export.cpp msgid "" @@ -1436,17 +1443,17 @@ msgstr "" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "找ä¸åˆ°è‡ªå®šç¾©èª¿è©¦ç¯„本。" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "找ä¸åˆ°è‡ªå®šç¾©ç™¼ä½ˆç¯„本。" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" -msgstr "" +msgstr "找ä¸åˆ°ç¯„本檔案:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1546,15 +1553,15 @@ msgstr "切æ›æ¨¡å¼" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "èšç„¦è·¯å¾‘" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "å‘上移動收è—" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "å‘下移動收è—" #: editor/editor_file_dialog.cpp #, fuzzy @@ -1578,11 +1585,11 @@ msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "" +msgstr "ä»¥ç¸®ç•¥åœ–ç¶²æ ¼å½¢å¼æŸ¥çœ‹é …目。" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." -msgstr "" +msgstr "以清單形å¼æŸ¥çœ‹é …目。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1604,7 +1611,7 @@ msgstr "å¿…é ˆä½¿ç”¨æœ‰æ•ˆçš„å‰¯æª”å。" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "掃ææº" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -1625,19 +1632,19 @@ msgstr "繼承:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "" +msgstr "繼承:" #: editor/editor_help.cpp msgid "Brief Description:" -msgstr "" +msgstr "ç°¡è¦èªªæ˜Žï¼š" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "性質" #: editor/editor_help.cpp msgid "Properties:" -msgstr "" +msgstr "效能:" #: editor/editor_help.cpp msgid "Methods" @@ -1664,15 +1671,15 @@ msgstr "訊號:" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "" +msgstr "枚舉" #: editor/editor_help.cpp msgid "Enumerations:" -msgstr "" +msgstr "枚舉:" #: editor/editor_help.cpp msgid "enum " -msgstr "" +msgstr "枚舉 " #: editor/editor_help.cpp msgid "Constants" @@ -1753,7 +1760,7 @@ msgstr "å–代全部" #: editor/editor_help_search.cpp msgid "Classes Only" -msgstr "" +msgstr "僅é™é¡ž" #: editor/editor_help_search.cpp #, fuzzy @@ -1772,15 +1779,15 @@ msgstr "定數" #: editor/editor_help_search.cpp msgid "Properties Only" -msgstr "" +msgstr "僅屬性" #: editor/editor_help_search.cpp msgid "Theme Properties Only" -msgstr "" +msgstr "僅é™ä¸»é¡Œå±¬æ€§" #: editor/editor_help_search.cpp msgid "Member Type" -msgstr "" +msgstr "æˆå“¡é¡žåž‹" #: editor/editor_help_search.cpp #, fuzzy @@ -1789,11 +1796,11 @@ msgstr "Class:" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "" +msgstr "屬性:" #: editor/editor_inspector.cpp msgid "Set" -msgstr "" +msgstr "集åˆ" #: editor/editor_inspector.cpp msgid "Set Multiple:" @@ -1824,12 +1831,12 @@ msgstr "專案輸出失敗,錯誤代碼是 %d。" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "無法ä¿å˜å°Žå…¥çš„資æºã€‚" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "確定" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" @@ -1839,7 +1846,7 @@ msgstr "儲å˜è³‡æºéŒ¯èª¤!" msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." -msgstr "" +msgstr "無法ä¿å˜æ¤è³‡æºï¼Œå› 為它ä¸å±¬æ–¼å·²ç·¨è¼¯çš„å ´æ™¯ã€‚å…ˆè®“å®ƒå”¯ä¸€ã€‚" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -1860,7 +1867,7 @@ msgstr "儲å˜ä¸ç™¼ç”Ÿäº†éŒ¯èª¤ã€‚" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "無法打開“%sâ€ã€‚檔案å¯èƒ½å·²è¢«ç§»å‹•æˆ–åˆ é™¤ã€‚" #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -1910,39 +1917,39 @@ msgstr "" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "無法覆蓋ä»è™•æ–¼æ‰“é–‹ç‹€æ…‹çš„å ´æ™¯ï¼" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "ç„¡æ³•åŠ è¼‰è¦åˆä½µçš„ç¶²æ ¼åº«ï¼" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "ä¿å˜MeshLibrary時出錯ï¼" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "ç„¡æ³•åŠ è¼‰Tileset進行åˆä½µï¼" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "ä¿å˜tileset時出錯ï¼" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "嘗試ä¿å˜ä½ˆå±€æ™‚出錯ï¼" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "" +msgstr "覆蓋默èªç·¨è¼¯å™¨ä½ˆå±€ã€‚" #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "找ä¸åˆ°ä½ˆå±€å稱ï¼" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "已將默èªä½ˆå±€é‚„原為基本è¨å®šã€‚" #: editor/editor_node.cpp msgid "" @@ -1950,6 +1957,8 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"æ¤è³‡æºå±¬æ–¼å·²å°Žå…¥çš„å ´æ™¯, å› æ¤ä¸å¯ç·¨è¼¯ã€‚\n" +"è«‹é–±è®€èˆ‡å°Žå…¥å ´æ™¯ç›¸é—œçš„æ–‡æª”, 以便更好地çžè§£æ¤å·¥ä½œæµã€‚" #: editor/editor_node.cpp msgid "" @@ -1980,7 +1989,7 @@ msgstr "" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "沒有è¦é‹è¡Œçš„å·²å®šç¾©å ´æ™¯ã€‚" #: editor/editor_node.cpp msgid "" @@ -2009,7 +2018,7 @@ msgstr "在é‹è¡Œå ´æ™¯å‰ï¼Œè«‹å…ˆå˜æª”。" #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "無法啟動å程åº" +msgstr "無法啟動å進程!" #: editor/editor_node.cpp msgid "Open Scene" @@ -2017,15 +2026,15 @@ msgstr "é–‹å•Ÿå ´æ™¯" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "æ‰“é–‹åŸºæœ¬å ´æ™¯" #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "å¿«é€Ÿé–‹å•Ÿå ´æ™¯" +msgstr "å¿«é€Ÿé–‹å•Ÿå ´æ™¯..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "" +msgstr "快速打開腳本…" #: editor/editor_node.cpp #, fuzzy @@ -2034,15 +2043,15 @@ msgstr "å¦å˜æ–°æª”" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "關閉å‰æ˜¯å¦ä¿å˜å°â€œ%sâ€çš„更改?" #: editor/editor_node.cpp msgid "Saved %s modified resource(s)." -msgstr "" +msgstr "å·²ä¿å˜%s個已修改的資æºã€‚" #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "ä¿å˜å ´æ™¯éœ€è¦æ ¹ç¯€é»žã€‚" #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2066,7 +2075,7 @@ msgstr "在è¨ç½®å ´æ™¯å‰ï¼Œç„¡æ³•å®Œæˆè©²æŒ‡å®šæ“作。" #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "å°Žå‡ºç¶²æ ¼åº«" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." @@ -2074,7 +2083,7 @@ msgstr "在è¨ç½®æ ¹ç¯€é»ž(root node)å‰ï¼Œç„¡æ³•å®Œæˆè©²æŒ‡å®šæ“作。" #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "導出ç£è²¼é›†" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." @@ -2086,7 +2095,7 @@ msgstr "ç›®å‰çš„å ´æ™¯å°šæœªå˜æª”,ä»è¦é–‹å•Ÿå—Žï¼Ÿ" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "無法é‡æ–°è¼‰å…¥æœªå˜æª”çš„å ´æ™¯" +msgstr "無法é‡æ–°è¼‰å…¥æœªå˜æª”çš„å ´æ™¯." #: editor/editor_node.cpp msgid "Revert" @@ -2518,7 +2527,7 @@ msgstr "æš«åœå ´æ™¯" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "åœæ¢æ¤å ´æ™¯" +msgstr "åœæ¢æ¤å ´æ™¯." #: editor/editor_node.cpp editor/editor_profiler.cpp msgid "Stop" @@ -2679,32 +2688,32 @@ msgstr "æ›´æ–°" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "版本:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Author:" -msgstr "" +msgstr "作者:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "狀態:" #: editor/editor_plugin_settings.cpp msgid "Edit:" -msgstr "" +msgstr "編輯:" #: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp #: editor/rename_dialog.cpp msgid "Start" -msgstr "" +msgstr "開始" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "措施:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "幀時間 (秒)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" @@ -2712,7 +2721,7 @@ msgstr "å¹³å‡æ™‚é–“ (秒)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "å¹€%" #: editor/editor_profiler.cpp msgid "Physics Frame %" @@ -2724,7 +2733,7 @@ msgstr "時間:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "包容" #: editor/editor_profiler.cpp msgid "Self" @@ -2752,7 +2761,7 @@ msgstr "層" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "ä½ %d, 值 %d" #: editor/editor_properties.cpp msgid "[Empty]" @@ -2771,7 +2780,7 @@ msgstr "無效的路徑" msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." -msgstr "" +msgstr "所é¸è³‡æºï¼ˆ%s)與æ¤å†…容(%s)所需的任何類型都ä¸åŒ¹é…。" #: editor/editor_properties.cpp msgid "" @@ -2832,7 +2841,7 @@ msgstr "相ä¾æ€§ç·¨è¼¯å™¨" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" -msgstr "" +msgstr "é¸å®šçš„節點ä¸æ˜¯è¦–å£!" #: editor/editor_properties_array_dict.cpp msgid "Size: " @@ -2872,7 +2881,7 @@ msgstr "" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "將您的é‚輯寫在_run()方法ä¸ã€‚" #: editor/editor_run_script.cpp msgid "There is an edited scene already." @@ -3121,7 +3130,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "" +msgstr "無法移動/é‡å‘½å資æºæ ¹ç›®éŒ„。" #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." @@ -3197,7 +3206,7 @@ msgstr "移除" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." -msgstr "" +msgstr "編輯ä¾è³´é ……" #: editor/filesystem_dock.cpp msgid "View Owners..." @@ -3435,11 +3444,11 @@ msgstr "æ£åœ¨å°Žå…¥å ´æ™¯â€¦" #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "" +msgstr "生æˆå…‰ç…§åœ–" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " -msgstr "" +msgstr "ç‚ºç¶²æ ¼ç”Ÿæˆï¼š " #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -3447,11 +3456,11 @@ msgstr "æ£åœ¨é‹è¡Œè‡ªå®šç¾©è…³æœ¬â€¦" #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "ç„¡æ³•åŠ è¼‰å°Žå…¥å¾Œè…³æœ¬ï¼š" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "" +msgstr "導入後腳本無效/å·²æ壞(檢查控制å°ï¼‰ï¼š" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" @@ -3719,7 +3728,7 @@ msgstr "移除" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" -msgstr "" +msgstr "移動 BlendSpace1D 節點點" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3729,6 +3738,8 @@ msgid "" "AnimationTree is inactive.\n" "Activate to enable playback, check node warnings if activation fails." msgstr "" +"動畫樹處於éžæ´»å‹•ç‹€æ…‹ã€‚\n" +"激活以啟用æ’放, 如果啟動失敗, 請檢查節點è¦å‘Šã€‚" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -3869,6 +3880,11 @@ msgid "Delete Node" msgstr "刪除" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy msgid "Toggle Filter On/Off" msgstr "切æ›æœ€æ„›" @@ -3902,7 +3918,7 @@ msgstr "節點å稱:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node..." -msgstr "" +msgstr "æ·»åŠ ç¯€é»ž..。" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -3912,32 +3928,32 @@ msgstr "éŽæ¿¾æª”案..." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Enable filtering" -msgstr "" +msgstr "啟用篩é¸" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "切æ›è‡ªå‹•æ’放" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "æ–°å‹•ç•«å稱:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "新增動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "更改動畫å稱:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Delete Animation?" -msgstr "" +msgstr "刪除動畫?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "移除動畫" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -3952,23 +3968,23 @@ msgstr "Autoload「%sã€å·²ç¶“å˜åœ¨!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "é‡å‘½åå‹•ç•«" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" -msgstr "" +msgstr "æ··åˆä¸‹ä¸€å€‹æ›´æ”¹" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "更改混åˆæ™‚é–“" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "載入動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "複製動畫" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -3982,56 +3998,56 @@ msgstr "在資æºè·¯å¾‘ä¸æ‰¾ä¸åˆ°" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "粘貼的動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "粘貼動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to edit!" -msgstr "" +msgstr "沒有è¦ç·¨è¼¯çš„å‹•ç•«!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "" +msgstr "從當å‰ä½ç½®å‘後æ’放所é¸å‹•ç•«ã€‚(A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "從çµå°¾å‘後æ’放é¸å®šçš„動畫。(Shift+a)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "" +msgstr "åœæ¢å‹•ç•«å›žæ”¾ã€‚(S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "從é 開始æ’放é¸å–ä¸çš„動畫。(Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "" +msgstr "從當å‰ä½ç½®æ’放é¸å®šçš„動畫。(D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "å‹•ç•«ä½ç½®ï¼ˆç§’)。" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "" +msgstr "在全域範åœå…§ç¸®æ”¾ç¯€é»žçš„å‹•ç•«æ’放。" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "" +msgstr "動畫工具" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "å‹•ç•«" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "新增" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -4045,19 +4061,19 @@ msgstr "開啟資料夾" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "" +msgstr "在æ’放機ä¸é¡¯ç¤ºå‹•ç•«æ¸…單。" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "載入åŽè‡ªå‹•æ’放" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Onion Skinning" -msgstr "" +msgstr "洋葱皮" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Enable Onion Skinning" -msgstr "" +msgstr "啟用洋葱皮" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -4066,39 +4082,39 @@ msgstr "æè¿°:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Past" -msgstr "" +msgstr "è·³éŽ" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Future" -msgstr "" +msgstr "未來" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Depth" -msgstr "" +msgstr "深度" #: editor/plugins/animation_player_editor_plugin.cpp msgid "1 step" -msgstr "" +msgstr "1æ¥" #: editor/plugins/animation_player_editor_plugin.cpp msgid "2 steps" -msgstr "" +msgstr "2æ¥" #: editor/plugins/animation_player_editor_plugin.cpp msgid "3 steps" -msgstr "" +msgstr "3æ¥" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Differences Only" -msgstr "" +msgstr "僅差異" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Force White Modulate" -msgstr "" +msgstr "強制白色調節" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Include Gizmos (3D)" -msgstr "" +msgstr "包括3D控制器" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pin AnimationPlayer" @@ -4106,11 +4122,11 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" -msgstr "" +msgstr "創建新動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" -msgstr "" +msgstr "å‹•ç•«å稱:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -4118,54 +4134,54 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Error!" -msgstr "" +msgstr "錯誤ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "" +msgstr "æ··åˆæ™‚é–“:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "下一個(自動隊列):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "跨動畫混åˆæ™‚é–“" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Move Node" -msgstr "移動 Autoload" +msgstr "移動節點" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Add Transition" -msgstr "è½‰å ´" +msgstr "æ·»åŠ è½‰æ›" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "" +msgstr "æ·»åŠ ç¯€é»ž" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" -msgstr "" +msgstr "çµæŸ" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" -msgstr "" +msgstr "ç«‹å³" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" -msgstr "" +msgstr "åŒæ¥" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" -msgstr "" +msgstr "在末尾" #: editor/plugins/animation_state_machine_editor.cpp msgid "Travel" -msgstr "" +msgstr "行程" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." @@ -4179,12 +4195,12 @@ msgstr "在資æºè·¯å¾‘ä¸æ‰¾ä¸åˆ°" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Removed" -msgstr "已刪除:" +msgstr "已刪除節點" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Transition Removed" -msgstr "è½‰å ´" +msgstr "已刪除轉æ›" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" @@ -4221,68 +4237,67 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition: " -msgstr "è½‰å ´" +msgstr "è½‰å ´: " #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "AnimationTree" -msgstr "" +msgstr "動畫樹" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" -msgstr "" +msgstr "æ–°å稱:" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "縮放:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "æ·¡å…¥(秒):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "淡出(秒):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "æ··åˆ" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Mix" -msgstr "" +msgstr "æ··åˆ" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Auto Restart:" -msgstr "" +msgstr "自動é‡æ–°é–‹å§‹:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Restart (s):" -msgstr "" +msgstr "é‡æ–°é–‹å§‹(秒):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "" +msgstr "隨機é‡æ–°é–‹å§‹(秒):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "開始ï¼" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "數é‡ï¼š" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend 0:" -msgstr "" +msgstr "æ··åˆ 0:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend 1:" -msgstr "" +msgstr "æ··åˆ 1:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "X-Fade Time (s):" @@ -4290,112 +4305,112 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Current:" -msgstr "" +msgstr "當å‰ï¼š" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Add Input" -msgstr "" +msgstr "æ·»åŠ è¼¸å…¥" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Clear Auto-Advance" -msgstr "" +msgstr "清除Auto-Advance" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Set Auto-Advance" -msgstr "" +msgstr "è¨å®šè‡ªå‹•å‰é€²" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Delete Input" -msgstr "" +msgstr "刪除輸入事件" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "" +msgstr "動畫樹有效。" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "" +msgstr "動畫樹無效。" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "動畫節點" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "å–®é …ç¯€é»ž" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "æ··åˆç¯€é»ž" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "æ··åˆ2 節點" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "æ··åˆ3 節點" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "æ··åˆ4 節點" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "時間尺度節點" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "時間æœç´¢ç¯€é»ž" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "è½‰å ´ç¯€é»ž" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Import Animations..." -msgstr "" +msgstr "導入動畫…" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "編輯節點篩é¸" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." -msgstr "" +msgstr "篩é¸â€¦" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" -msgstr "" +msgstr "內容:" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "éŽæ¿¾æª”案..." +msgstr "查看檔案" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" -msgstr "" +msgstr "無法解æžä¸»æ©Ÿå稱:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "連接錯誤, è«‹é‡è©¦ã€‚" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" -msgstr "" +msgstr "無法連接到主機:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "" +msgstr "主機沒有響應:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" -msgstr "" +msgstr "請求失敗, 返回代碼:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "請求失敗, é‡å®šå‘次數太多" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -4403,58 +4418,56 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "é 期:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "ç²å¾—:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed sha256 hash check" -msgstr "" +msgstr "sha256哈希值檢查失敗" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "資æºä¸‹è¼‰éŒ¯èª¤:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Downloading (%s / %s)..." -msgstr "載入時發生錯誤:" +msgstr "æ£åœ¨ä¸‹è¼‰ (%s / %s)…" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "Downloading..." -msgstr "載入時發生錯誤:" +msgstr "æ£åœ¨ä¸‹è¼‰â€¦â€¦" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving..." -msgstr "" +msgstr "解æžä¸â€¦" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Error making request" -msgstr "è¼‰å…¥å ´æ™¯æ™‚ç™¼ç”ŸéŒ¯èª¤" +msgstr "請求時發生錯誤" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "空閒" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "é‡è©¦" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "" +msgstr "下載錯誤" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "æ¤è³‡æºæ–‡æª”æ£åœ¨ä¸‹è¼‰ä¸!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "First" -msgstr "" +msgstr "ç¬¬ä¸€é …" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -4467,7 +4480,7 @@ msgstr "下一個" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Last" -msgstr "" +msgstr "最後" #: editor/plugins/asset_library_editor_plugin.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -4477,7 +4490,7 @@ msgstr "全部" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp msgid "Plugins" -msgstr "" +msgstr "挿件" #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" @@ -4494,11 +4507,11 @@ msgstr "類別:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Site:" -msgstr "" +msgstr "地å€:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Support..." -msgstr "" +msgstr "支æŒâ€¦" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" @@ -4506,11 +4519,11 @@ msgstr "官方" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "" +msgstr "測試" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "" +msgstr "ZIP資æºåŒ…" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -4520,98 +4533,97 @@ msgid "" msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp +#, fuzzy msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake " "Light' flag is on." -msgstr "" +msgstr "沒有å¯ä¾›æ¸²æŸ“çš„Meshes,請確ä¿Mesh包å«UV2通é“並且勾é¸'Bake Light'é¸é …" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." -msgstr "" +msgstr "創建光圖圖åƒå¤±æ•—, 請確ä¿è·¯å¾‘是å¯å¯«çš„。" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Bake Lightmaps" -msgstr "變更光æºåŠå¾‘" +msgstr "渲染光圖" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview" -msgstr "" +msgstr "é 覽" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "" +msgstr "é…ç½®å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "" +msgstr "ç¶²æ ¼å移é‡:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "" +msgstr "ç¶²æ ¼å¤§å°:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" -msgstr "" +msgstr "旋轉å移é‡:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" -msgstr "" +msgstr "旋轉æ¥é©Ÿ:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "垂直移動尺標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new vertical guide" -msgstr "" +msgstr "創建新的垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Remove vertical guide" -msgstr "" +msgstr "刪除垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move horizontal guide" -msgstr "" +msgstr "移動水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal guide" -msgstr "" +msgstr "創建新的水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "移除" +msgstr "移除水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "創建新的水平和垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Move pivot" -msgstr "移除" +msgstr "移動樞軸" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate CanvasItem" -msgstr "" +msgstr "旋轉CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move anchor" -msgstr "" +msgstr "移動錨點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize CanvasItem" -msgstr "" +msgstr "調整CanvasItem的大å°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale CanvasItem" -msgstr "" +msgstr "縮放CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem" -msgstr "" +msgstr "移動CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." @@ -4621,285 +4633,316 @@ msgstr "" msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." -msgstr "" +msgstr "容器的å級的錨定值和é é‚Šè·å€¼è¢«å…¶çˆ¶ç´šè¦†è“‹ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "" +msgstr "僅é™éŒ¨é»ž" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors and Margins" -msgstr "" +msgstr "改變錨點和邊è·" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "" +msgstr "改變錨點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" -msgstr "" +msgstr "粘貼姿勢" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." -msgstr "" +msgstr "è¦å‘Šï¼šå®¹å™¨çš„åç´šåªèƒ½ç”±å…¶çˆ¶ç´šç¢ºå®šå…¶ä½ç½®å’Œå¤§å°ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" -msgstr "縮å°" +msgstr "é‡ç½®ç¸®æ”¾" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "" +msgstr "é¸æ“‡æ¨¡å¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" -msgstr "" +msgstr "æ‹–å‹•: 旋轉" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move" -msgstr "" +msgstr "Alt+Drag:移動" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." -msgstr "" +msgstr "按 \"v\" 更改樞軸, \"Shift + v\" 以拖動樞軸 (移動時)。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "" +msgstr "Alt+æ»‘é¼ å³éµ:é¡¯ç¤ºé¼ æ¨™é»žæ“Šä½ç½®ä¸‹æ‰€æœ‰çš„節點清單" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Mode" -msgstr "" +msgstr "移動模å¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" -msgstr "" +msgstr "旋轉模å¼" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Scale Mode" -msgstr "切æ›æ¨¡å¼" +msgstr "縮放模å¼" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." -msgstr "" +msgstr "在按一下的ä½ç½®é¡¯ç¤ºæ‰€æœ‰ç‰©ä»¶çš„清單 (在é¸æ“‡æ¨¡å¼ä¸‹èˆ‡ Alt + RMB 相åŒ)。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." -msgstr "" +msgstr "點擊以更改物件的旋轉樞軸。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan Mode" -msgstr "" +msgstr "平移模å¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle snapping." -msgstr "" +msgstr "切æ›å¸é™„。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Snap" -msgstr "" +msgstr "使用å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "" +msgstr "å¸é™„é¸é …" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to grid" -msgstr "" +msgstr "å¸é™„åˆ°ç¶²æ ¼" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Use Rotation Snap" -msgstr "" +msgstr "使用旋轉å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Configure Snap..." -msgstr "" +msgstr "é…ç½®å¸é™„…" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap Relative" -msgstr "" +msgstr "相å°å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Use Pixel Snap" -msgstr "" +msgstr "使用åƒç´ å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Smart snapping" -msgstr "" +msgstr "智慧å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to parent" -msgstr "" +msgstr "å¸é™„到父級節點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "å¸é™„到節點的錨點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "æ•æ‰åˆ°ç¯€é»žé‚Š" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node center" -msgstr "" +msgstr "å¸é™„到節點的ä¸å¿ƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "å¸é™„到其他的節點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to guides" -msgstr "" +msgstr "å¸é™„到尺標" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "" +msgstr "將所é¸ç‰©ä»¶éŽ–定到ä¸å¿ƒ (無法移動)。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "解鎖所é¸ç‰©ä»¶ (å¯ä»¥ç§»å‹•)。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." -msgstr "" +msgstr "確ä¿å°è±¡çš„åç´šä¸å¯é¸ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Restores the object's children's ability to be selected." -msgstr "" +msgstr "æ¢å¾©å°è±¡çš„åç´šé¸æ“‡èƒ½åŠ›ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Skeleton Options" -msgstr "單例" +msgstr "骨架é¸é …" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" -msgstr "" +msgstr "顯示骨骼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "製作IKéˆ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "清除IKéˆ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "" +msgstr "從節點製作自定義骨骼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Custom Bones" -msgstr "" +msgstr "清除自定義骨骼" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "視圖" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "" +msgstr "é¡¯ç¤ºç¶²æ ¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" -msgstr "" +msgstr "顯示輔助線" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" -msgstr "" +msgstr "顯示尺è¦" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" -msgstr "" +msgstr "顯示引導" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Origin" -msgstr "" +msgstr "顯示原點" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "" +msgstr "顯示視å£" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "顯示組和鎖定圖標" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "" +msgstr "å±…ä¸é¸æ“‡" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "å¹€é¸æ“‡" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" +msgstr "佈局" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Insert keys." -msgstr "動畫新增按éµ" +msgid "Insert keys (based on mask)." +msgstr "æ’入幀 (ç¾æœ‰è»Œé“)" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Insert Key (Existing Tracks)" +msgid "" +"Auto insert keys when objects are translated, rotated on scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Auto Insert Key" +msgstr "新增關éµç•«æ ¼" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "æ’入幀 (ç¾æœ‰è»Œé“)" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "複製姿勢" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "" +msgstr "清除姿勢" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "å°‡ç¶²æ ¼æ¥æ•¸ä¹˜ä»¥2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "å°‡ç¶²æ ¼æ¥æ•¸é™¤ä»¥2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" -msgstr "" +msgstr "æ·»åŠ %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "æ·»åŠ %s…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Cannot instantiate multiple nodes without root." -msgstr "" +msgstr "無法具ç¾åŒ–æ²’æœ‰æ ¹çš„å¤šå€‹ç¯€é»žã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "創建節點" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "" +msgstr "%s ä¸çš„å…·ç¾åŒ–å ´æ™¯å‡ºéŒ¯" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change default type" -msgstr "" +msgstr "更改é è¨é¡žåž‹" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -4908,43 +4951,88 @@ msgid "" msgstr "" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Create Polygon3D" -msgstr "新增資料夾" +msgstr "創建3D多邊形" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "編輯多邊形" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "編輯多邊形 (åˆªé™¤é ‚é»ž)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" +msgstr "è¨ç½®æŽ§åˆ¶ç¨‹åº" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "åŠ è¼‰å½±åƒæ™‚出錯:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image..." +msgstr "å½±åƒä¸æ²’有é€æ˜Žåº¦å¤§æ–¼128的點數…" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "ç²’å" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "" +msgstr "CPUç²’å" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "å¾žç¶²æ ¼å‰µå»ºç™¼å°„é»ž" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "從節點創建發射點" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" -msgstr "" +msgstr "å¹³é¢0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat1" -msgstr "" +msgstr "å¹³é¢1" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -4953,86 +5041,86 @@ msgstr "所有的é¸æ“‡" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease out" -msgstr "" +msgstr "淡出" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "平滑æ¥é•·" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "" +msgstr "修改曲線點" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "" +msgstr "修改曲線切角" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "" +msgstr "åŠ è¼‰æ›²ç·šé è¨" #: editor/plugins/curve_editor_plugin.cpp msgid "Add point" -msgstr "" +msgstr "æ·»åŠ é»ž" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy msgid "Remove point" -msgstr "移除" +msgstr "刪除點" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy msgid "Left linear" -msgstr "線性" +msgstr "左線性" #: editor/plugins/curve_editor_plugin.cpp msgid "Right linear" -msgstr "" +msgstr "å³ç·šæ€§" #: editor/plugins/curve_editor_plugin.cpp msgid "Load preset" -msgstr "" +msgstr "載入é è¨" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy msgid "Remove Curve Point" -msgstr "移除" +msgstr "刪除曲線點" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "切æ›æ›²ç·šç›´ç·šåˆ‡ç·š" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "æŒ‰ä½ Shift éµå¯å–®ç¨ç·¨è¼¯åˆ‡ç·š" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "渲染 GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "漸變編輯" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" -msgstr "" +msgstr "é …ç›® %d" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" -msgstr "" +msgstr "é …ç›®" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" -msgstr "" +msgstr "é …ç›®æ¸…å–®ç·¨è¼¯å™¨" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "" +msgstr "創建é®å…‰å¤šé‚Šå½¢" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "ç¶²æ ¼æ˜¯ç©ºçš„ï¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" @@ -5040,11 +5128,11 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Convex Body" -msgstr "" +msgstr "創建éœæ…‹å‡¸é«”" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "" +msgstr "這å°å ´æ™¯æ ¹ç›®éŒ„ä¸èµ·ä½œç”¨ï¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Shape" @@ -5052,15 +5140,15 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Shape" -msgstr "" +msgstr "創建凸é¢å½¢ç‹€" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" -msgstr "" +msgstr "å‰µå»ºå°Žèˆªç¶²æ ¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Contained Mesh is not of type ArrayMesh." -msgstr "" +msgstr "包å«çš„ç¶²æ ¼ä¸æ˜¯ArrayMesh類型。" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Unwrap failed, mesh may not be manifold?" @@ -5068,7 +5156,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." -msgstr "" +msgstr "沒有è¦èª¿è©¦çš„ç¶²æ ¼ã€‚" #: editor/plugins/mesh_instance_editor_plugin.cpp #: editor/plugins/sprite_editor_plugin.cpp @@ -5077,11 +5165,11 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" -msgstr "" +msgstr "ç¶²æ ¼å¯¦ä¾‹ç¼ºå°‘ç¶²æ ¼ï¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "" +msgstr "ç¶²æ ¼æ²’æœ‰è¡¨é¢ä¾†å‰µå»ºè¼ªå»“ï¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" @@ -5093,11 +5181,11 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline" -msgstr "" +msgstr "創建輪廓" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "" +msgstr "ç¶²æ ¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -5105,7 +5193,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Static Body" -msgstr "" +msgstr "創建凸形éœæ…‹é«”" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -5117,7 +5205,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." -msgstr "" +msgstr "å‰µå»ºè¼ªå»“ç¶²æ ¼â€¦" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -5135,36 +5223,36 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "" +msgstr "å‰µå»ºè¼ªå»“ç¶²æ ¼" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" -msgstr "" +msgstr "輪廓尺寸:" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove item %d?" -msgstr "" +msgstr "åˆ é™¤é …ç›®%d?" #: editor/plugins/mesh_library_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Add Item" -msgstr "" +msgstr "æ·»åŠ é …ç›®" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "" +msgstr "åˆ é™¤æ‰€é¸é …" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Import from Scene" -msgstr "" +msgstr "å¾žå ´æ™¯å°Žå…¥" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" -msgstr "" +msgstr "å¾žå ´æ™¯æ›´æ–°" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "" +msgstr "æœªæŒ‡å®šç¶²æ ¼æºï¼ˆç¯€é»žä¸æ²’æœ‰å¤šç¶²æ ¼é›†ï¼‰ã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." @@ -5172,75 +5260,75 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "ç¶²æ ¼æºç„¡æ•ˆï¼ˆè·¯å¾‘無效)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "" +msgstr "ç¶²æ ¼æºç„¡æ•ˆ (ä¸æ˜¯ç¶²æ ¼å¯¦ä¾‹)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "" +msgstr "ç¶²æ ¼æºç„¡æ•ˆï¼ˆä¸åŒ…å«ç¶²æ ¼è³‡æºï¼‰ã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." -msgstr "" +msgstr "未指定表é¢æºã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." -msgstr "" +msgstr "表é¢æºç„¡æ•ˆï¼ˆè·¯å¾‘無效)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." -msgstr "" +msgstr "表é¢æºç„¡æ•ˆï¼ˆæ²’有幾何圖形)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." -msgstr "" +msgstr "表é¢æºç„¡æ•ˆï¼ˆæ²’有é¢ï¼‰ã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Parent has no solid faces to populate." -msgstr "" +msgstr "父級沒有è¦å¡«å……的實體é¢ã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "" +msgstr "ç„¡æ³•æ˜ å°„å€åŸŸã€‚" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "" +msgstr "é¸æ“‡æºç¶²æ ¼ï¼š" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" -msgstr "" +msgstr "é¸æ“‡ç›®æ¨™æ›²é¢ï¼š" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" -msgstr "" +msgstr "填充曲é¢" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate MultiMesh" -msgstr "" +msgstr "å¡«å……å¤šç¶²æ ¼" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Target Surface:" -msgstr "" +msgstr "目標表é¢:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "" +msgstr "æºç¶²æ ¼:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "X 軸" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Y 軸" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Z 軸" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" @@ -5248,54 +5336,38 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" -msgstr "" +msgstr "隨機旋轉:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Tilt:" -msgstr "" +msgstr "隨機傾斜:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "" +msgstr "隨機縮放:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" -msgstr "" +msgstr "å¡«å……" #: editor/plugins/navigation_polygon_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Navigation Polygon" -msgstr "" +msgstr "創建導航多邊形" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generating Visibility Rect" -msgstr "" +msgstr "生æˆå¯è¦‹æ€§çŸ©å½¢" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "" +msgstr "生æˆå¯è¦‹æ€§çŸ©å½¢" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Error loading image:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "No pixels with transparency > 128 in image..." -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Load Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Convert to CPUParticles" @@ -5303,33 +5375,12 @@ msgstr "轉æ›æˆ..." #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Particles" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Generated Point Count:" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -#: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Mask" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Capture from Pixel" -msgstr "" - -#: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Emission Colors" -msgstr "" +msgstr "生æˆæ™‚é–“ (秒):" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" -msgstr "" +msgstr "é¢ä¸åŒ…å«ä»»ä½•å€åŸŸï¼" #: editor/plugins/particles_editor_plugin.cpp msgid "No faces!" @@ -5337,55 +5388,55 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "" +msgstr "節點ä¸åŒ…å«å¹¾ä½•åœ–形。" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." -msgstr "" +msgstr "節點ä¸åŒ…å«å¹¾ä½•åœ–å½¢ (é¢)。" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" -msgstr "" +msgstr "創建發射器" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "排放點:" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points" -msgstr "" +msgstr "表é¢é»ž" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "表é¢é»ž + 法線 (定å‘)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" -msgstr "" +msgstr "é«”ç©" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "排放æºï¼š " #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" +msgstr "需è¦â€œé¡†ç²’資料â€é¡žåž‹çš„處ç†å™¨è³‡æ–™ã€‚" #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" -msgstr "" +msgstr "ç”Ÿæˆ AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate Visibility AABB" -msgstr "" +msgstr "生æˆå¯è¦‹æ€§AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" -msgstr "" +msgstr "ç”Ÿæˆ AABB" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "" +msgstr "從曲線ä¸åˆ 除點" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Out-Control from Curve" @@ -5809,14 +5860,13 @@ msgid "Error while saving theme." msgstr "儲å˜ä¸ç™¼ç”Ÿäº†éŒ¯èª¤ã€‚" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "載入時發生錯誤:" +msgstr "ä¿å˜éŒ¯èª¤" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Error importing theme." -msgstr "讀å–å—體錯誤。" +msgstr "導入主題時出錯。" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5840,23 +5890,24 @@ msgstr "å¦å˜å ´æ™¯ç‚º..." #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" -msgstr "" +msgstr "導入主題" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "" +msgstr "ä¿å˜ä¸»é¡Œæ™‚出錯" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "" +msgstr "ä¿å˜éŒ¯èª¤" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "" +msgstr "將主題å¦å˜ç‚º..。" #: editor/plugins/script_editor_plugin.cpp -msgid " Class Reference" -msgstr "" +#, fuzzy +msgid "%s Class Reference" +msgstr " 類引用" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." @@ -5871,42 +5922,42 @@ msgstr "排åº:" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Move Up" -msgstr "" +msgstr "上移" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Move Down" -msgstr "" +msgstr "下移" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" -msgstr "" +msgstr "下一個腳本" #: editor/plugins/script_editor_plugin.cpp msgid "Previous script" -msgstr "" +msgstr "上一個腳本" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "" +msgstr "檔案" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Open..." -msgstr "é–‹å•Ÿ" +msgstr "開啟…" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "" +msgstr "全部ä¿å˜" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "" +msgstr "軟é‡æ–°åŠ 載腳本" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" -msgstr "" +msgstr "複製腳本路徑" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5920,99 +5971,99 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Theme" -msgstr "" +msgstr "主題" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Import Theme..." -msgstr "我知é“了" +msgstr "導入主題..。" #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" -msgstr "" +msgstr "é‡æ–°è¼‰å…¥ä¸»é¡Œ" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "" +msgstr "ä¿å˜ä¸»é¡Œ" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" -msgstr "" +msgstr "關閉檔案" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" -msgstr "" +msgstr "全部關閉" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "關閉其他é¸é …å¡" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "é‹è¡Œ" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "\"切æ›è…³æœ¬\" é¢æ¿" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "" +msgstr "查找下一個" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "è·¨éŽ" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "æ¥å…¥" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "è·³éŽ" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "繼續" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "ä¿æŒèª¿è©¦å™¨æ‰“é–‹" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Debug with External Editor" -msgstr "離開編輯器嗎?" +msgstr "使用外部編輯器進行調試" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation" -msgstr "" +msgstr "打開 Godot 線上文檔" #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" -msgstr "" +msgstr "請求檔案" #: editor/plugins/script_editor_plugin.cpp msgid "Help improve the Godot documentation by giving feedback" -msgstr "" +msgstr "通éŽæ供回饋幫助改進 Godot 文檔" #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "æœç´¢åƒè€ƒæ–‡æª”。" #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "" +msgstr "轉到上一個編輯的檔案。" #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "" +msgstr "轉到下一個編輯的檔案。" #: editor/plugins/script_editor_plugin.cpp msgid "Discard" -msgstr "" +msgstr "棄置" #: editor/plugins/script_editor_plugin.cpp msgid "" @@ -6022,20 +6073,20 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "é‡æ–°è¼‰å…¥" #: editor/plugins/script_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "é‡æ–°ä¿å˜" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "調試器" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Search Results" -msgstr "æœå°‹å¹«åŠ©" +msgstr "æœå°‹çµæžœ" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -6044,28 +6095,28 @@ msgstr "è¡Œ:" #: editor/plugins/script_text_editor.cpp msgid "(ignore)" -msgstr "" +msgstr "(忽略)" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Go to Function" -msgstr "建立函å¼" +msgstr "轉到函數" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "標準" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "åªèƒ½æ‹–拽檔案系統ä¸çš„資æºã€‚" #: editor/plugins/script_text_editor.cpp msgid "Lookup Symbol" -msgstr "" +msgstr "查找符號" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" -msgstr "" +msgstr "é¸æ“‡é¡è‰²" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp #, fuzzy @@ -6074,46 +6125,46 @@ msgstr "轉æ›æˆ..." #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "大寫" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "å°å¯«" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "首å—æ¯å¤§å¯«" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" -msgstr "" +msgstr "高亮顯示語法" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" -msgstr "" +msgstr "剪切" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "é¸æ“‡å…¨éƒ¨" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Delete Line" -msgstr "刪除" +msgstr "åˆ é™¤è¡Œ" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" -msgstr "" +msgstr "å‘左縮進" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "" +msgstr "å‘å³ç¸®é€²" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "切æ›æ³¨é‡‹" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -6122,15 +6173,15 @@ msgstr "å‰å¾€ç¬¬...è¡Œ" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "折疊所有行" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "展開所有行" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "æ‹·è²åˆ°ä¸‹ä¸€è¡Œ" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -6152,40 +6203,39 @@ msgstr "轉æ›æˆ..." #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "自動縮進" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Toggle Breakpoint" -msgstr "" +msgstr "è¨ç½®ä¸æ–·é»ž" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "" +msgstr "刪除所有ä¸æ–·é»ž" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Go to Next Breakpoint" -msgstr "往下一æ¥" +msgstr "轉到下一個ä¸æ–·é»ž" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Go to Previous Breakpoint" -msgstr "往上一æ¥" +msgstr "轉到上一個ä¸æ–·é»ž" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "" +msgstr "查找上一個" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Find in Files..." -msgstr "éŽæ¿¾æª”案..." +msgstr "在檔ä¸æŸ¥æ‰¾..。" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." -msgstr "建立函å¼" +msgstr "轉到函數…" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -6198,58 +6248,57 @@ msgstr "" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "著色器" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "" +msgstr "æ¤éª¨æž¶æ²’有骨骼ç¶å®šï¼Œè«‹å‰µå»ºä¸€äº› Bone2d 骨骼å節點。" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Create Rest Pose from Bones" -msgstr "" +msgstr "從骨骼創建休æ¯å§¿å‹¢" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" -msgstr "" +msgstr "將休æ¯å§¿å‹¢è¨ç½®ç‚ºéª¨éª¼" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Skeleton2D" -msgstr "單例" +msgstr "2D骨骼節點" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" -msgstr "" +msgstr "創建休æ¯å§¿å‹¢ (從骨骼)" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Bones to Rest Pose" -msgstr "" +msgstr "將骨骼è¨å®šç‚ºéœæ¢å§¿å‹¢" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" -msgstr "" +msgstr "創建物ç†éª¨éª¼" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy msgid "Skeleton" -msgstr "單例" +msgstr "骨架" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical skeleton" -msgstr "" +msgstr "創建物ç†éª¨æž¶" #: editor/plugins/skeleton_ik_editor_plugin.cpp #, fuzzy msgid "Play IK" -msgstr "開始" +msgstr "æ’放 IK" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "æ£äº¤" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "é€è¦–" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -6257,31 +6306,31 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "X軸變æ›ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "Y軸變æ›ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "Z 軸變æ›ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." -msgstr "" +msgstr "查看平é¢è½‰æ›ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " -msgstr "" +msgstr "縮放: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " -msgstr "" +msgstr "ç¿»è¯ï¼š " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "旋轉 %s 度。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." @@ -6297,80 +6346,79 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw" -msgstr "" +msgstr "å航" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "繪製的物件" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes" -msgstr "æ£åœ¨å„²å˜è®Šæ›´..." +msgstr "æ質變更" #: editor/plugins/spatial_editor_plugin.cpp msgid "Shader Changes" -msgstr "" +msgstr "著色器變更" #: editor/plugins/spatial_editor_plugin.cpp msgid "Surface Changes" -msgstr "" +msgstr "表é¢è®Šæ›´" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "繪製調用" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "" +msgstr "é ‚é»ž" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "俯視圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "底視圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "底部" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "左視圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "å·¦" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "å³è¦–圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "å³" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "å‰è¦–圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" -msgstr "" +msgstr "æ£é¢" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "後視圖。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" -msgstr "" +msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with View" -msgstr "" +msgstr "與視圖å°é½Š" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -6378,11 +6426,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "" +msgstr "æ¤æ“作需è¦å–®å€‹é¸å®šçš„節點。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" -msgstr "" +msgstr "鎖定視圖旋轉" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -6390,101 +6438,99 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Wireframe" -msgstr "" +msgstr "顯示線框" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Overdraw" -msgstr "" +msgstr "顯示éŽåº¦ç¹ªåœ–" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Unshaded" -msgstr "" +msgstr "顯示無陰影" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "" +msgstr "查看環境" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "" +msgstr "查看 Gizmos" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "查看資訊" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "View FPS" -msgstr "éŽæ¿¾æª”案..." +msgstr "查看FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Half Resolution" -msgstr "" +msgstr "åŠåˆ†è¾¯çŽ‡" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" -msgstr "" +msgstr "音訊監è½å™¨" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Doppler Enable" -msgstr "啟用" +msgstr "啟用多普拉效應" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" -msgstr "" +msgstr "影片é 覽" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "自由視圖 å·¦" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "自由視圖 å³" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Forward" -msgstr "å¾€å‰" +msgstr "自由視圖 å‰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "" +msgstr "自由視圖 åŽ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "自由視圖 上" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" -msgstr "" +msgstr "自由視圖 下" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "自由視圖速度調節" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." -msgstr "" +msgstr "注æ„: 顯示的FPS值是編輯器的幀率。 它ä¸èƒ½ç”¨äºŽè¡¨ç¾éŠæˆ²å…§çš„實際性能" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" -msgstr "" +msgstr "視圖旋轉已鎖定" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" -msgstr "" +msgstr "XFormå°è©±æ¡†" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" -msgstr "" +msgstr "將節點æ•æ‰åˆ°åœ°é¢" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Select Mode (Q)" -msgstr "僅é¸æ“‡å€åŸŸ" +msgstr "é¸æ“‡æ¨¡å¼ (Q)" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -6495,59 +6541,59 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" -msgstr "" +msgstr "ç§»å‹•æ¨¡å¼ (W)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode (E)" -msgstr "" +msgstr "æ—‹è½‰æ¨¡å¼ (E)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode (R)" -msgstr "" +msgstr "ç¸®æ”¾æ¨¡å¼ (R)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Local Coords" -msgstr "" +msgstr "本地å標" #: editor/plugins/spatial_editor_plugin.cpp msgid "Local Space Mode (%s)" -msgstr "" +msgstr "本地空間模å¼ï¼ˆ%s)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Mode (%s)" -msgstr "" +msgstr "æ•æ‰æ¨¡å¼ (%s)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "底部視圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "俯視圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "後視圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "å‰è¦–圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "左視圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "å³è¦–圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal view" -msgstr "" +msgstr "åˆ‡æ› æŠ•å½±/æ£äº¤ 視圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "æ’入動畫幀" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" @@ -6559,64 +6605,64 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Selection With View" -msgstr "" +msgstr "將所é¸å…§å®¹èˆ‡è¦–圖å°é½Š" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" -msgstr "所有的é¸æ“‡" +msgstr "工具é¸æ“‡" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Move" -msgstr "" +msgstr "工具移動" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Rotate" -msgstr "" +msgstr "工具旋轉" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Scale" -msgstr "" +msgstr "縮放工具" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" -msgstr "" +msgstr "切æ›è‡ªç”±è§€å¯Ÿæ¨¡å¼" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" -msgstr "" +msgstr "變æ›" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap object to floor" -msgstr "" +msgstr "å°‡å°è±¡å¸é™„到地æ¿" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." -msgstr "" +msgstr "轉æ›å°è©±æ¡†..。" #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "1個視å£" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "2個視å£" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "2å€‹è¦–å£ (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3個視å£" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3å€‹è¦–å£ (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" +msgstr "4個視å£" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" @@ -6624,48 +6670,48 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "顯示原點" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "é¡¯ç¤ºç¶²æ ¼" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Settings" -msgstr "" +msgstr "è¨å®š" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "å¸é™„è¨å®š" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "移動å¸é™„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "旋轉å¸é™„(度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "縮放å¸é™„ (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" +msgstr "視å€è¨å®š" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "é€è¦–視角(度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" -msgstr "" +msgstr "查看Z-Near:" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Far:" -msgstr "" +msgstr "查看 Z-Far:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" @@ -6677,31 +6723,51 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "" +msgstr "旋轉 (度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "縮放(比例):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "" +msgstr "轉æ›é¡žåž‹" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "å‰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "發佈" #: editor/plugins/spatial_editor_plugin.cpp msgid "Nameless gizmo" -msgstr "" +msgstr "未命åçš„gizmo" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Mesh2D" +msgstr "創建2Dç¶²æ ¼" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create Polygon2D" +msgstr "創建3D多邊形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D" +msgstr "創建碰撞多邊形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D" +msgstr "創建é®å…‰å¤šé‚Šå½¢" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" -msgstr "" +msgstr "Sprite 是空的ï¼" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." @@ -6709,7 +6775,22 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't replace by mesh." -msgstr "" +msgstr "ç„¡æ•ˆçš„å¹¾ä½•åœ–å½¢ï¼Œç„¡æ³•ç”¨ç¶²æ ¼æ›¿æ›ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create polygon." +msgstr "ç„¡æ•ˆçš„å¹¾ä½•åœ–å½¢ï¼Œç„¡æ³•ç”¨ç¶²æ ¼æ›¿æ›ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create collision polygon." +msgstr "ç„¡æ•ˆçš„å¹¾ä½•åœ–å½¢ï¼Œç„¡æ³•ç”¨ç¶²æ ¼æ›¿æ›ã€‚" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Invalid geometry, can't create light occluder." +msgstr "ç„¡æ•ˆçš„å¹¾ä½•åœ–å½¢ï¼Œç„¡æ³•ç”¨ç¶²æ ¼æ›¿æ›ã€‚" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" @@ -6717,98 +6798,108 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Convert to 2D Mesh" -msgstr "轉æ›æˆ..." +msgid "Convert to Mesh2D" +msgstr "轉æ›ç‚º2Dç¶²æ ¼" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy -msgid "Create 2D Mesh" -msgstr "新增 %s" +msgid "Convert to Polygon2D" +msgstr "轉æ›ç‚º2Dç¶²æ ¼" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create CollisionPolygon2D Sibling" +msgstr "創建碰撞多邊形" + +#: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy +msgid "Create LightOccluder2D Sibling" +msgstr "創建é®å…‰å¤šé‚Šå½¢" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "簡化: " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " -msgstr "" +msgstr "擴展(åƒç´ ): " #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Update Preview" -msgstr "é 覽:" +msgstr "æ›´æ–°é 覽" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy msgid "Settings:" -msgstr "專案è¨å®š" +msgstr "è¨å®šï¼š" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "éŒ¯èª¤ï¼šç„¡æ³•åŠ è¼‰å¹€è³‡æºï¼" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "æ·»åŠ å¹€" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "資æºå‰ªè²¼æ¿ç‚ºç©ºæˆ–ä¸æ˜¯ç´‹ç†ï¼" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "粘貼幀" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "æ·»åŠ ç©ºç™½å¹€" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "更改動畫fps" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(空)" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Animations:" -msgstr "動畫空間。" +msgstr "動畫:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "New Animation" -msgstr "動畫最佳化" +msgstr "æ–°å‹•ç•«" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" -msgstr "" +msgstr "速度 (FPS):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "循環" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Animation Frames:" -msgstr "動畫空間。" +msgstr "動畫幀:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "æ’入空白幀(之å‰ï¼‰" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "æ’入空白幀(之åŽï¼‰" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (Before)" -msgstr "" +msgstr "移動(以å‰ï¼‰" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (After)" -msgstr "" +msgstr "移動(之後)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -6816,32 +6907,32 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" -msgstr "" +msgstr "è¨ç½®ç´‹ç†å€åŸŸ" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Margin" -msgstr "" +msgstr "è¨ç½®é‚Šè·" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "å¸é™„模å¼:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp msgid "None" -msgstr "" +msgstr "ç„¡" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "åƒç´ å¸é™„" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "ç¶²æ ¼å¸é™„" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "自動剪切" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" @@ -6849,7 +6940,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "æ¥é©Ÿï¼š" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" @@ -6861,40 +6952,40 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Can't save theme to file:" -msgstr "" +msgstr "無法將主題ä¿å˜åˆ°æª”案:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" -msgstr "" +msgstr "æ·»åŠ æ‰€æœ‰é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "å…¨éƒ¨æ·»åŠ " #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" -msgstr "" +msgstr "åˆ é™¤æ‰€æœ‰é …ç›®" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Remove All" -msgstr "移除" +msgstr "å…¨éƒ¨åˆ é™¤" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme..." -msgstr "" +msgstr "編輯主題…" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "主題編輯èœå–®ã€‚" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" -msgstr "" +msgstr "æ·»åŠ é¡žé …" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" -msgstr "" +msgstr "åˆ é™¤é¡žé …" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" @@ -6906,7 +6997,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" -msgstr "" +msgstr "從當å‰ç·¨è¼¯å™¨ä¸»é¡Œæ¨¡æ¿å‰µå»º" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -6918,116 +7009,113 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" -msgstr "" +msgstr "é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" -msgstr "" +msgstr "æª¢æŸ¥é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "å·²æª¢æŸ¥çš„é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Radio Item" -msgstr "" +msgstr "å–®é¸é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Radio Item" -msgstr "" +msgstr "é¸ä¸çš„å–®é¸é …ç›®" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "有" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "許多" #: editor/plugins/theme_editor_plugin.cpp msgid "Has,Many,Options" -msgstr "" +msgstr "有, 許多, é¸é …" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" -msgstr "" +msgstr "標籤 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 2" -msgstr "" +msgstr "標籤 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 3" -msgstr "" +msgstr "標籤 3" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "數據類型:" #: editor/plugins/theme_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "圖標" #: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp msgid "Style" -msgstr "" +msgstr "樣å¼" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "" +msgstr "å—é«”" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "é¡è‰²" #: editor/plugins/theme_editor_plugin.cpp msgid "Constant" msgstr "固定" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase Selection" -msgstr "所有的é¸æ“‡" +msgstr "擦除é¸ä¸" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Fix Invalid Tiles" -msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" +msgstr "修復無效的ç£è²¼" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Cut Selection" -msgstr "所有的é¸æ“‡" +msgstr "切割é¸æ“‡" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "繪製磚塊地圖" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Line Draw" -msgstr "線性" +msgstr "線性繪製" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "繪製矩形" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" -msgstr "" +msgstr "油漆桶填充" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "擦除磚塊地圖" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Find Tile" -msgstr "尋找" +msgstr "查找ç£è²¼" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "轉置" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror X" @@ -7039,75 +7127,73 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "" +msgstr "繪製ç£è²¼" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "é¸æ“‡ç£è²¼" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Copy Selection" -msgstr "移除所é¸" +msgstr "複製é¸æ“‡" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate left" -msgstr "" +msgstr "å‘左旋轉" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate right" -msgstr "" +msgstr "å‘å³æ—‹è½‰" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip horizontally" -msgstr "" +msgstr "水平翻轉" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip vertically" -msgstr "" +msgstr "垂直翻轉" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear transform" -msgstr "動畫更改座標" +msgstr "清除變æ›" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." -msgstr "" +msgstr "將紋ç†æ·»åŠ 到ç£è²¼é›†ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected Texture from TileSet." -msgstr "移除" +msgstr "從ç£è²¼é›†ä¸åˆªé™¤é¸å®šçš„ç´‹ç†ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "" +msgstr "å¾žå ´æ™¯å‰µå»º" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "" +msgstr "å¾žå ´æ™¯åˆä½µ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Next Coordinate" -msgstr "" +msgstr "下一個座標" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "é¸æ“‡ä¸‹ä¸€å€‹å½¢ç‹€ã€åç£è²¼æˆ–ç£è²¼ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Previous Coordinate" -msgstr "上個分é " +msgstr "上一個座標" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "é¸æ“‡ä¸Šä¸€å€‹å½¢ç‹€ã€åç£è²¼æˆ–ç£è²¼ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." -msgstr "" +msgstr "複製ä½æŽ©ç¢¼ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7115,53 +7201,52 @@ msgid "Paste bitmask." msgstr "貼上åƒæ•¸" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Erase bitmask." -msgstr "所有的é¸æ“‡" +msgstr "擦除ä½æŽ©ç¢¼." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Create a new rectangle." -msgstr "新增 %s" +msgstr "創建新矩形。" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Create a new polygon." -msgstr "新增資料夾" +msgstr "創建新多邊形。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "將多邊形ä¿ç•™åœ¨å€åŸŸå…§ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "" +msgstr "啟用å¸é™„å’Œé¡¯ç¤ºç¶²æ ¼ (å¯é€šéŽå±¬æ€§é¢æ¿é…ç½®)。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "" +msgstr "顯示ç£è²¼å稱 (æŒ‰ä½ ALT éµ)" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "移除" +msgstr "刪除é¸å®šçš„ç´‹ç†ï¼Ÿé€™å°‡åˆªé™¤ä½¿ç”¨å®ƒçš„所有ç£è²¼ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." -msgstr "" +msgstr "您尚未é¸æ“‡è¦åˆªé™¤çš„ç´‹ç†ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "" +msgstr "å¾žå ´æ™¯å‰µå»ºï¼Ÿé€™å°‡è¦†è“‹æ‰€æœ‰ç•¶å‰ç£è²¼ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "確定åˆä½µå ´æ™¯ï¼Ÿ" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Remove Texture" -msgstr "移除" +msgstr "刪除紋ç†" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." @@ -7174,9 +7259,8 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete selected Rect." -msgstr "確定刪除所é¸æ“‡çš„檔案嗎?" +msgstr "åˆ é™¤æ‰€é¸çš„Rect。" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7188,7 +7272,7 @@ msgstr "新增資料夾" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Delete polygon." -msgstr "刪除" +msgstr "刪除多邊形。" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7220,31 +7304,30 @@ msgstr "新增資料夾" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" -msgstr "" +msgstr "è¨ç½®ç£è²¼å€åŸŸ" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Create Tile" -msgstr "新增資料夾" +msgstr "創建ç£è²¼" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "" +msgstr "è¨å®šç£è²¼åœ–標" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Bitmask" -msgstr "éŽæ¿¾æª”案..." +msgstr "編輯ç£è²¼ä½æŽ©ç¢¼" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Edit Collision Polygon" -msgstr "新增資料夾" +msgstr "編輯碰撞多邊形" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Edit Occlusion Polygon" -msgstr "新增資料夾" +msgstr "編輯é®æ“‹å¤šé‚Šå½¢" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7252,45 +7335,41 @@ msgid "Edit Navigation Polygon" msgstr "新增資料夾" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste Tile Bitmask" -msgstr "貼上åƒæ•¸" +msgstr "粘貼ç£è²¼ä½æŽ©ç¢¼" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" -msgstr "" +msgstr "清除ç£è²¼ä½æŽ©ç¢¼" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Polygon Concave" -msgstr "" +msgstr "使多邊形塌陷" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Convex" -msgstr "新增資料夾" +msgstr "使多邊形凸起" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" -msgstr "移除" +msgstr "移除ç£è²¼" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Remove Collision Polygon" -msgstr "移除" +msgstr "刪除碰撞多邊形" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Occlusion Polygon" -msgstr "" +msgstr "刪除é®æ“‹å¤šé‚Šå½¢" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Navigation Polygon" -msgstr "" +msgstr "刪除導航多邊形" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Priority" -msgstr "éŽæ¿¾æª”案..." +msgstr "編輯ç£è²¼å„ªå…ˆç´š" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" @@ -7299,17 +7378,17 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Create Collision Polygon" -msgstr "新增資料夾" +msgstr "創建碰撞多邊形" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Create Occlusion Polygon" -msgstr "新增資料夾" +msgstr "創建é®æ“‹å¤šé‚Šå½¢" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "This property can't be changed." -msgstr "æ¤æ“ä½œç„¡æ³•åœ¨æ²’æœ‰æ ¹ç¯€é»žçš„æƒ…æ³ä¸‹é€²è¡Œã€‚" +msgstr "無法更改æ¤å±¬æ€§ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" @@ -7317,54 +7396,58 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "è¨ç½®çµ±ä¸€å稱" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" -msgstr "" +msgstr "è¨ç½®è¼¸å…¥é è¨ç«¯å£" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" -msgstr "" +msgstr "å°‡ç¯€é»žæ·»åŠ åˆ°å¯è¦–化著色器" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" -msgstr "複製動畫關éµç•«æ ¼" +msgstr "複製節點" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Delete Nodes" +msgstr "刪除" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "視覺著色器輸入類型已更改" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "" +msgstr "é ‚é»ž" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Fragment" -msgstr "輸入åƒæ•¸" +msgstr "片段" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Light" -msgstr "" +msgstr "燈光" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "" +msgstr "視覺化著色器" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Edit Visual Property" -msgstr "éŽæ¿¾æª”案..." +msgstr "編輯å¯è¦–屬性" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" -msgstr "" +msgstr "視覺著色器模å¼å·²æ›´æ”¹" #: editor/project_export.cpp msgid "Runnable" -msgstr "" +msgstr "å¯é‹è¡Œçš„" #: editor/project_export.cpp msgid "Delete patch '%s' from list?" @@ -7372,7 +7455,7 @@ msgstr "" #: editor/project_export.cpp msgid "Delete preset '%s'?" -msgstr "" +msgstr "是å¦åˆ 除é è¨â€œ%sâ€ï¼Ÿ" #: editor/project_export.cpp msgid "" @@ -7389,54 +7472,51 @@ msgstr "" #: editor/project_export.cpp msgid "Release" -msgstr "" +msgstr "釋放" #: editor/project_export.cpp -#, fuzzy msgid "Exporting All" -msgstr "輸出" +msgstr "全部導出" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" -msgstr "檔案ä¸å˜åœ¨" +msgstr "給定的導出路徑ä¸å˜åœ¨:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" -msgstr "" +msgstr "ç„¡æ¤å¹³è‡ºçš„導出範本:" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "é è¨" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add..." -msgstr "" +msgstr "æ·»åŠ â€¦" #: editor/project_export.cpp -#, fuzzy msgid "Export Path" -msgstr "輸出" +msgstr "導出路徑" #: editor/project_export.cpp msgid "Resources" -msgstr "" +msgstr "資æº" #: editor/project_export.cpp msgid "Export all resources in the project" -msgstr "" +msgstr "å°Žå‡ºé …ç›®ä¸çš„所有資æº" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "導出é¸å®šçš„å ´æ™¯ (å’Œä¾è³´é …)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "導出é¸å®šçš„è³‡æº (å’Œä¾è³´é …)" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "導出模å¼:" #: editor/project_export.cpp msgid "Resources to export:" @@ -7454,205 +7534,201 @@ msgstr "" #: editor/project_export.cpp msgid "Patches" -msgstr "" +msgstr "補ä¸" #: editor/project_export.cpp msgid "Make Patch" -msgstr "" +msgstr "製作補ä¸" #: editor/project_export.cpp msgid "Features" -msgstr "" +msgstr "功能" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "" +msgstr "自訂 (逗號分隔):" #: editor/project_export.cpp #, fuzzy msgid "Feature List:" -msgstr "方法:" +msgstr "功能清單:" #: editor/project_export.cpp #, fuzzy msgid "Script" -msgstr "開啟最近å˜å–" +msgstr "腳本" #: editor/project_export.cpp -#, fuzzy msgid "Script Export Mode:" -msgstr "輸出" +msgstr "腳本導出模å¼:" #: editor/project_export.cpp msgid "Text" -msgstr "" +msgstr "文本" #: editor/project_export.cpp msgid "Compiled" -msgstr "" +msgstr "ç·¨è¯" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" -msgstr "" +msgstr "åŠ å¯† (使用以下密碼)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" -msgstr "" +msgstr "ä¸æ£ç¢ºåŠ 密金鑰 (é•·åº¦å¿…é ˆç‚º64個å—å…ƒ)" #: editor/project_export.cpp msgid "Script Encryption Key (256-bits as hex):" -msgstr "" +msgstr "è…³æœ¬åŠ å¯†é‡‘é‘° (256ä½åå…進ä½ç¢¼):" #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip" -msgstr "輸出" +msgstr "導出 PCK/ZIP" #: editor/project_export.cpp #, fuzzy msgid "Export mode?" -msgstr "輸出" +msgstr "導出模å¼:" #: editor/project_export.cpp #, fuzzy msgid "Export All" -msgstr "輸出" +msgstr "全部導出" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "缺少æ¤å¹³è‡ºçš„導出範本:" #: editor/project_export.cpp msgid "Export With Debug" -msgstr "" +msgstr "導出為調試" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "檔案ä¸å˜åœ¨" +msgstr "路徑ä¸å˜åœ¨." #: editor/project_manager.cpp msgid "Invalid '.zip' project file, does not contain a 'project.godot' file." -msgstr "" +msgstr "“.zipâ€é …目檔案無效,ä¸åŒ…å«â€œproject.godotâ€æª”案。" #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "" +msgstr "è«‹é¸æ“‡ä¸€å€‹ç©ºè³‡æ–™å¤¾ã€‚" #: editor/project_manager.cpp msgid "Please choose a 'project.godot' or '.zip' file." -msgstr "" +msgstr "è«‹é¸æ“‡â€œproject.godotâ€æˆ–“.zipâ€æª”案。" #: editor/project_manager.cpp msgid "Directory already contains a Godot project." -msgstr "" +msgstr "目錄已包å«ä¸€å€‹godoté …ç›®ã€‚" #: editor/project_manager.cpp msgid "Imported Project" -msgstr "" +msgstr "å·²å°Žå…¥çš„é …ç›®" #: editor/project_manager.cpp #, fuzzy msgid "Invalid Project Name." -msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" +msgstr "é …ç›®å稱無效。" #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't create folder." -msgstr "無法新增資料夾" +msgstr "無法新增資料夾." #: editor/project_manager.cpp msgid "There is already a folder in this path with the specified name." -msgstr "" +msgstr "æ¤è·¯å¾‘ä¸å·²å˜åœ¨å…·æœ‰æŒ‡å®šå稱的資料夾。" #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "çµ¦ä½ çš„é …ç›®å‘½å是個好主æ„。" #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "" +msgstr "ä¸æ£ç¢ºé …目路徑 (更改了任何內容?)。" #: editor/project_manager.cpp msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." -msgstr "" +msgstr "ç„¡æ³•åœ¨é …ç›®è·¯å¾‘ä¸åŠ 載project.godot(錯誤%d)。它å¯èƒ½éºå¤±æˆ–æ壞。" #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." -msgstr "" +msgstr "ç„¡æ³•åœ¨é …ç›®è·¯å¾‘ä¸ç·¨è¼¯project.godot。" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." -msgstr "" +msgstr "ç„¡æ³•åœ¨é …ç›®è·¯å¾‘ä¸å‰µå»ºproject.godot。" #: editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "æå–以下檔案失敗:" #: editor/project_manager.cpp #, fuzzy msgid "Rename Project" -msgstr "專案è¨å®š" +msgstr "é‡å‘½åé …ç›®" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "æ–°éŠæˆ²é …ç›®" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "" +msgstr "å°Žå…¥ç¾æœ‰é …ç›®" #: editor/project_manager.cpp msgid "Import & Edit" -msgstr "" +msgstr "導入與編輯" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "" +msgstr "å‰µå»ºæ–°é …ç›®" #: editor/project_manager.cpp #, fuzzy msgid "Create & Edit" -msgstr "新增" +msgstr "創建和編輯" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "" +msgstr "安è£é …目:" #: editor/project_manager.cpp msgid "Install & Edit" -msgstr "" +msgstr "安è£å’Œç·¨è¼¯" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "é …ç›®å稱:" #: editor/project_manager.cpp #, fuzzy msgid "Create folder" -msgstr "新增資料夾" +msgstr "創建資料夾" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "é …ç›®è·¯å¾‘ï¼š" #: editor/project_manager.cpp msgid "Project Installation Path:" -msgstr "" +msgstr "é …ç›®å®‰è£è·¯å¾‘:" #: editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "ç€è¦½" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "" +msgstr "渲染器:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "" @@ -7664,7 +7740,7 @@ msgstr "" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -7676,20 +7752,20 @@ msgstr "" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." -msgstr "" +msgstr "渲染器å¯ä»¥ç„¶å¾Œæ›´æ”¹, ä½†å ´æ™¯å¯èƒ½éœ€è¦èª¿æ•´ã€‚" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "未命åé …ç›®" #: editor/project_manager.cpp #, fuzzy msgid "Can't open project at '%s'." -msgstr "連接..." +msgstr "無法打開ä½æ–¼â€œ%sâ€çš„é …ç›®ã€‚" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "" +msgstr "您確定è¦æ‰“é–‹å¤šå€‹é …ç›®å—Žï¼Ÿ" #: editor/project_manager.cpp msgid "" @@ -7703,6 +7779,12 @@ msgid "" "Warning: You will not be able to open the project with previous versions of " "the engine anymore." msgstr "" +"ä»¥ä¸‹é …ç›®è¨å®šæª”案未指定通éŽå…¶å‰µå»ºçš„Godot的版本。\n" +"\n" +"%s\n" +"\n" +"如果繼續打開它, 它將被轉æ›ç‚º Godot 的當å‰é…ç½®æª”æ¡ˆæ ¼å¼ã€‚ \n" +"è¦å‘Š: 您將無法å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„å¼•æ“Žæ‰“é–‹é …ç›®ã€‚" #: editor/project_manager.cpp msgid "" @@ -7715,12 +7797,18 @@ msgid "" "Warning: You will not be able to open the project with previous versions of " "the engine anymore." msgstr "" +"ä»¥ä¸‹é …ç›®è¨ç½®æª”案是由較舊的引擎版本生æˆçš„, 需è¦ç‚ºæ¤ç‰ˆæœ¬é€²è¡Œè½‰æ›:\n" +"\n" +"%s\n" +"\n" +"是å¦è¦å°‡å…¶è½‰æ›ï¼Ÿ\n" +"è¦å‘Š: 您將無法å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„引擎打開專案。" #: editor/project_manager.cpp msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." -msgstr "" +msgstr "æ¤é …ç›®è¨ç½®æ˜¯ç”±è¼ƒæ–°çš„引擎版本創建的, å…¶è¨ç½®èˆ‡æ¤ç‰ˆæœ¬ä¸ç›¸å®¹ã€‚" #: editor/project_manager.cpp msgid "" @@ -7737,11 +7825,11 @@ msgstr "" #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" -msgstr "" +msgstr "您確定è¦é‹è¡Œå¤šå€‹é …目嗎?" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" -msgstr "" +msgstr "是å¦å¾žæ¸…å–®ä¸åˆ é™¤é …ç›®ï¼Ÿï¼ˆè³‡æ–™å¤¾å…§å®¹å°‡ä¸è¢«ä¿®æ”¹ï¼‰" #: editor/project_manager.cpp msgid "" @@ -8523,10 +8611,6 @@ msgid "Open documentation" msgstr "開啟最近å˜å–" #: editor/scene_tree_dock.cpp -msgid "Delete Node(s)" -msgstr "" - -#: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "" @@ -9285,7 +9369,7 @@ msgstr "" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "" +msgstr "渲染NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -10333,6 +10417,9 @@ msgstr "" msgid "Varyings can only be assigned in vertex function." msgstr "" +#~ msgid "Insert keys." +#~ msgstr "æ’入幀." + #~ msgid "Line:" #~ msgstr "è¡Œ:" diff --git a/main/input_default.cpp b/main/input_default.cpp index 6c3252ad1a..a939d77a1e 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -677,6 +677,19 @@ void InputDefault::set_use_accumulated_input(bool p_enable) { use_accumulated_input = p_enable; } +void InputDefault::release_pressed_events() { + + flush_accumulated_events(); // this is needed to release actions strengths + + keys_pressed.clear(); + joy_buttons_pressed.clear(); + _joy_axis.clear(); + + for (Map<StringName, InputDefault::Action>::Element *E = action_state.front(); E; E = E->next()) { + action_release(E->key()); + } +} + InputDefault::InputDefault() { use_accumulated_input = true; diff --git a/main/input_default.h b/main/input_default.h index f9b4cbbd57..80ee17656c 100644 --- a/main/input_default.h +++ b/main/input_default.h @@ -272,6 +272,7 @@ public: virtual void flush_accumulated_events(); virtual void set_use_accumulated_input(bool p_enable); + virtual void release_pressed_events(); InputDefault(); }; diff --git a/main/performance.cpp b/main/performance.cpp index 2f7ebf7656..71cd94aeab 100644 --- a/main/performance.cpp +++ b/main/performance.cpp @@ -32,6 +32,7 @@ #include "core/message_queue.h" #include "core/os/os.h" +#include "scene/main/node.h" #include "scene/main/scene_tree.h" #include "servers/audio_server.h" #include "servers/physics_2d_server.h" @@ -55,6 +56,7 @@ void Performance::_bind_methods() { BIND_ENUM_CONSTANT(OBJECT_COUNT); BIND_ENUM_CONSTANT(OBJECT_RESOURCE_COUNT); BIND_ENUM_CONSTANT(OBJECT_NODE_COUNT); + BIND_ENUM_CONSTANT(OBJECT_ORPHAN_NODE_COUNT); BIND_ENUM_CONSTANT(RENDER_OBJECTS_IN_FRAME); BIND_ENUM_CONSTANT(RENDER_VERTICES_IN_FRAME); BIND_ENUM_CONSTANT(RENDER_MATERIAL_CHANGES_IN_FRAME); @@ -76,6 +78,14 @@ void Performance::_bind_methods() { BIND_ENUM_CONSTANT(MONITOR_MAX); } +float Performance::_get_node_count() const { + MainLoop *ml = OS::get_singleton()->get_main_loop(); + SceneTree *sml = Object::cast_to<SceneTree>(ml); + if (!sml) + return 0; + return sml->get_node_count(); +} + String Performance::get_monitor_name(Monitor p_monitor) const { ERR_FAIL_INDEX_V(p_monitor, MONITOR_MAX, String()); @@ -92,6 +102,7 @@ String Performance::get_monitor_name(Monitor p_monitor) const { "object/objects", "object/resources", "object/nodes", + "object/orphan_nodes", "raster/objects_drawn", "raster/vertices_drawn", "raster/mat_changes", @@ -128,14 +139,8 @@ float Performance::get_monitor(Monitor p_monitor) const { case MEMORY_MESSAGE_BUFFER_MAX: return MessageQueue::get_singleton()->get_max_buffer_usage(); case OBJECT_COUNT: return ObjectDB::get_object_count(); case OBJECT_RESOURCE_COUNT: return ResourceCache::get_cached_resource_count(); - case OBJECT_NODE_COUNT: { - - MainLoop *ml = OS::get_singleton()->get_main_loop(); - SceneTree *sml = Object::cast_to<SceneTree>(ml); - if (!sml) - return 0; - return sml->get_node_count(); - }; + case OBJECT_NODE_COUNT: return _get_node_count(); + case OBJECT_ORPHAN_NODE_COUNT: return Node::orphan_node_count; case RENDER_OBJECTS_IN_FRAME: return VS::get_singleton()->get_render_info(VS::INFO_OBJECTS_IN_FRAME); case RENDER_VERTICES_IN_FRAME: return VS::get_singleton()->get_render_info(VS::INFO_VERTICES_IN_FRAME); case RENDER_MATERIAL_CHANGES_IN_FRAME: return VS::get_singleton()->get_render_info(VS::INFO_MATERIAL_CHANGES_IN_FRAME); @@ -183,6 +188,7 @@ Performance::MonitorType Performance::get_monitor_type(Monitor p_monitor) const MONITOR_TYPE_QUANTITY, MONITOR_TYPE_QUANTITY, MONITOR_TYPE_QUANTITY, + MONITOR_TYPE_QUANTITY, MONITOR_TYPE_MEMORY, MONITOR_TYPE_MEMORY, MONITOR_TYPE_MEMORY, diff --git a/main/performance.h b/main/performance.h index 850c4c2d52..912e005c53 100644 --- a/main/performance.h +++ b/main/performance.h @@ -43,6 +43,8 @@ class Performance : public Object { static Performance *singleton; static void _bind_methods(); + float _get_node_count() const; + float _process_time; float _physics_process_time; @@ -60,6 +62,7 @@ public: OBJECT_COUNT, OBJECT_RESOURCE_COUNT, OBJECT_NODE_COUNT, + OBJECT_ORPHAN_NODE_COUNT, RENDER_OBJECTS_IN_FRAME, RENDER_VERTICES_IN_FRAME, RENDER_MATERIAL_CHANGES_IN_FRAME, diff --git a/methods.py b/methods.py index ec9ecdb17f..11efd68ce4 100644 --- a/methods.py +++ b/methods.py @@ -24,10 +24,16 @@ def disable_warnings(self): # We have to remove existing warning level defines before appending /w, # otherwise we get: "warning D9025 : overriding '/W3' with '/w'" warn_flags = ['/Wall', '/W4', '/W3', '/W2', '/W1', '/WX'] - self['CCFLAGS'] = [x for x in self['CCFLAGS'] if not x in warn_flags] self.Append(CCFLAGS=['/w']) + self.Append(CFLAGS=['/w']) + self.Append(CPPFLAGS=['/w']) + self['CCFLAGS'] = [x for x in self['CCFLAGS'] if not x in warn_flags] + self['CFLAGS'] = [x for x in self['CFLAGS'] if not x in warn_flags] + self['CXXFLAGS'] = [x for x in self['CXXFLAGS'] if not x in warn_flags] else: self.Append(CCFLAGS=['-w']) + self.Append(CFLAGS=['-w']) + self.Append(CXXFLAGS=['-w']) def add_module_version_string(self,s): @@ -211,70 +217,6 @@ def win32_spawn(sh, escape, cmd, args, spawnenv): return exit_code """ -def android_add_flat_dir(self, dir): - if (dir not in self.android_flat_dirs): - self.android_flat_dirs.append(dir) - -def android_add_maven_repository(self, url): - if (url not in self.android_maven_repos): - self.android_maven_repos.append(url) - -def android_add_dependency(self, depline): - if (depline not in self.android_dependencies): - self.android_dependencies.append(depline) - -def android_add_java_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_java_dirs): - self.android_java_dirs.append(base_path) - -def android_add_res_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_res_dirs): - self.android_res_dirs.append(base_path) - -def android_add_asset_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_asset_dirs): - self.android_asset_dirs.append(base_path) - -def android_add_aidl_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_aidl_dirs): - self.android_aidl_dirs.append(base_path) - -def android_add_jni_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_jni_dirs): - self.android_jni_dirs.append(base_path) - -def android_add_gradle_plugin(self, plugin): - if (plugin not in self.android_gradle_plugins): - self.android_gradle_plugins.append(plugin) - -def android_add_gradle_classpath(self, classpath): - if (classpath not in self.android_gradle_classpath): - self.android_gradle_classpath.append(classpath) - -def android_add_default_config(self, config): - if (config not in self.android_default_config): - self.android_default_config.append(config) - -def android_add_to_manifest(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_manifest_chunk += f.read() - -def android_add_to_permissions(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_permission_chunk += f.read() - -def android_add_to_attributes(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_appattributes_chunk += f.read() - def disable_module(self): self.disabled_modules.append(self.current_module) diff --git a/modules/assimp/editor_scene_importer_assimp.cpp b/modules/assimp/editor_scene_importer_assimp.cpp index 0330ab4604..8d82fb2eeb 100644 --- a/modules/assimp/editor_scene_importer_assimp.cpp +++ b/modules/assimp/editor_scene_importer_assimp.cpp @@ -126,8 +126,8 @@ Node *EditorSceneImporterAssimp::import_scene(const String &p_path, uint32_t p_f int32_t post_process_Steps = aiProcess_CalcTangentSpace | //aiProcess_FlipUVs | //aiProcess_FlipWindingOrder | - aiProcess_DropNormals | - aiProcess_GenSmoothNormals | + //aiProcess_DropNormals | + //aiProcess_GenSmoothNormals | aiProcess_JoinIdenticalVertices | aiProcess_ImproveCacheLocality | aiProcess_LimitBoneWeights | diff --git a/modules/bmp/image_loader_bmp.cpp b/modules/bmp/image_loader_bmp.cpp index a8172c7f52..bcc992db24 100644 --- a/modules/bmp/image_loader_bmp.cpp +++ b/modules/bmp/image_loader_bmp.cpp @@ -33,6 +33,7 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const uint8_t *p_color_buffer, + const uint32_t color_table_size, const bmp_header_s &p_header) { Error err = OK; @@ -46,32 +47,87 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, size_t height = (size_t)p_header.bmp_info_header.bmp_height; size_t bits_per_pixel = (size_t)p_header.bmp_info_header.bmp_bit_count; - if (p_header.bmp_info_header.bmp_compression != 0) { + if (p_header.bmp_info_header.bmp_compression != BI_RGB) { err = FAILED; } + // Check whether we can load it - if (!(bits_per_pixel == 24 || bits_per_pixel == 32)) { - err = FAILED; - } + if (bits_per_pixel == 1) { + // Requires bit unpacking... + ERR_FAIL_COND_V(width % 8 != 0, ERR_UNAVAILABLE); + ERR_FAIL_COND_V(height % 8 != 0, ERR_UNAVAILABLE); + + } else if (bits_per_pixel == 4) { + // Requires bit unpacking... + ERR_FAIL_COND_V(width % 2 != 0, ERR_UNAVAILABLE); + ERR_FAIL_COND_V(height % 2 != 0, ERR_UNAVAILABLE); + } else if (bits_per_pixel == 16) { + + ERR_FAIL_V(ERR_UNAVAILABLE); + } if (err == OK) { - uint32_t line_width = ((p_header.bmp_info_header.bmp_width * - p_header.bmp_info_header.bmp_bit_count / 8) + - 3) & - ~3; + // Image data (might be indexed) + PoolVector<uint8_t> data; + int data_len = 0; - PoolVector<uint8_t> image_data; - err = image_data.resize(width * height * 4); + if (bits_per_pixel <= 8) { // indexed + data_len = width * height; + } else { // color + data_len = width * height * 4; + } + ERR_FAIL_COND_V(data_len == 0, ERR_BUG); + err = data.resize(data_len); - PoolVector<uint8_t>::Write image_data_w = image_data.write(); - uint8_t *write_buffer = image_data_w.ptr(); + PoolVector<uint8_t>::Write data_w = data.write(); + uint8_t *write_buffer = data_w.ptr(); + const uint32_t width_bytes = width * bits_per_pixel / 8; + const uint32_t line_width = (width_bytes + 3) & ~3; + + // The actual data traversal is determined by + // the data width in case of 8/4/1 bit images + const uint32_t w = bits_per_pixel >= 24 ? width : width_bytes; const uint8_t *line = p_buffer + (line_width * (height - 1)); + for (unsigned int i = 0; i < height; i++) { const uint8_t *line_ptr = line; - for (unsigned int j = 0; j < width; j++) { + + for (unsigned int j = 0; j < w; j++) { switch (bits_per_pixel) { + case 1: { + uint8_t color_index = *line_ptr; + + write_buffer[index + 0] = (color_index >> 7) & 1; + write_buffer[index + 1] = (color_index >> 6) & 1; + write_buffer[index + 2] = (color_index >> 5) & 1; + write_buffer[index + 3] = (color_index >> 4) & 1; + write_buffer[index + 4] = (color_index >> 3) & 1; + write_buffer[index + 5] = (color_index >> 2) & 1; + write_buffer[index + 6] = (color_index >> 1) & 1; + write_buffer[index + 7] = (color_index >> 0) & 1; + + index += 8; + line_ptr += 1; + } break; + case 4: { + uint8_t color_index = *line_ptr; + + write_buffer[index + 0] = (color_index >> 4) & 0x0f; + write_buffer[index + 1] = color_index & 0x0f; + + index += 2; + line_ptr += 1; + } break; + case 8: { + uint8_t color_index = *line_ptr; + + write_buffer[index] = color_index; + + index += 1; + line_ptr += 1; + } break; case 24: { uint32_t color = *((uint32_t *)line_ptr); @@ -79,6 +135,7 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, write_buffer[index + 1] = (color >> 8) & 0xff; write_buffer[index + 0] = (color >> 16) & 0xff; write_buffer[index + 3] = 0xff; + index += 4; line_ptr += 3; } break; @@ -89,6 +146,7 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, write_buffer[index + 1] = (color >> 8) & 0xff; write_buffer[index + 0] = (color >> 16) & 0xff; write_buffer[index + 3] = color >> 24; + index += 4; line_ptr += 4; } break; @@ -96,7 +154,51 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, } line -= line_width; } - p_image->create(width, height, 0, Image::FORMAT_RGBA8, image_data); + + if (p_color_buffer == NULL || color_table_size == 0) { // regular pixels + + p_image->create(width, height, 0, Image::FORMAT_RGBA8, data); + + } else { // data is in indexed format, extend it + + // Palette data + PoolVector<uint8_t> palette_data; + palette_data.resize(color_table_size * 4); + + PoolVector<uint8_t>::Write palette_data_w = palette_data.write(); + uint8_t *pal = palette_data_w.ptr(); + + const uint8_t *cb = p_color_buffer; + + for (unsigned int i = 0; i < color_table_size; ++i) { + uint32_t color = *((uint32_t *)cb); + + pal[i * 4 + 0] = (color >> 16) & 0xff; + pal[i * 4 + 1] = (color >> 8) & 0xff; + pal[i * 4 + 2] = (color)&0xff; + pal[i * 4 + 3] = 0xff; + + cb += 4; + } + // Extend palette to image + PoolVector<uint8_t> extended_data; + extended_data.resize(data.size() * 4); + + PoolVector<uint8_t>::Write ex_w = extended_data.write(); + uint8_t *dest = ex_w.ptr(); + + const int num_pixels = width * height; + + for (int i = 0; i < num_pixels; i++) { + dest[0] = pal[write_buffer[i] * 4 + 0]; + dest[1] = pal[write_buffer[i] * 4 + 1]; + dest[2] = pal[write_buffer[i] * 4 + 2]; + dest[3] = pal[write_buffer[i] * 4 + 3]; + + dest += 4; + } + p_image->create(width, height, 0, Image::FORMAT_RGBA8, extended_data); + } } } return err; @@ -108,7 +210,9 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, bmp_header_s bmp_header; Error err = ERR_INVALID_DATA; - if (f->get_len() > sizeof(bmp_header)) { + // A valid bmp file should always at least have a + // file header and a minimal info header + if (f->get_len() > BITMAP_FILE_HEADER_SIZE + BITMAP_INFO_HEADER_MIN_SIZE) { // File Header bmp_header.bmp_file_header.bmp_signature = f->get_16(); if (bmp_header.bmp_file_header.bmp_signature == BITMAP_SIGNATURE) { @@ -118,9 +222,14 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, // Info Header bmp_header.bmp_info_header.bmp_header_size = f->get_32(); + ERR_FAIL_COND_V(bmp_header.bmp_info_header.bmp_header_size < BITMAP_INFO_HEADER_MIN_SIZE, ERR_FILE_CORRUPT); + bmp_header.bmp_info_header.bmp_width = f->get_32(); bmp_header.bmp_info_header.bmp_height = f->get_32(); + bmp_header.bmp_info_header.bmp_planes = f->get_16(); + ERR_FAIL_COND_V(bmp_header.bmp_info_header.bmp_planes != 1, ERR_FILE_CORRUPT); + bmp_header.bmp_info_header.bmp_bit_count = f->get_16(); bmp_header.bmp_info_header.bmp_compression = f->get_32(); bmp_header.bmp_info_header.bmp_size_image = f->get_32(); @@ -129,35 +238,34 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, bmp_header.bmp_info_header.bmp_colors_used = f->get_32(); bmp_header.bmp_info_header.bmp_important_colors = f->get_32(); - bmp_header.bmp_info_header.bmp_red_mask = f->get_32(); - bmp_header.bmp_info_header.bmp_green_mask = f->get_32(); - bmp_header.bmp_info_header.bmp_blue_mask = f->get_32(); - bmp_header.bmp_info_header.bmp_alpha_mask = f->get_32(); - bmp_header.bmp_info_header.bmp_cs_type = f->get_32(); - for (int i = 0; i < 9; i++) - bmp_header.bmp_info_header.bmp_endpoints[i] = f->get_32(); - - bmp_header.bmp_info_header.bmp_gamma_red = f->get_32(); - bmp_header.bmp_info_header.bmp_gamma_green = f->get_32(); - bmp_header.bmp_info_header.bmp_gamma_blue = f->get_32(); - - f->seek(sizeof(bmp_header.bmp_file_header) + - bmp_header.bmp_info_header.bmp_header_size); + // Compressed bitmaps not supported, stop parsing + if (bmp_header.bmp_info_header.bmp_compression != BI_RGB) { + ERR_EXPLAIN("Unsupported bmp file: " + f->get_path()); + f->close(); + ERR_FAIL_V(ERR_UNAVAILABLE); + } + // Don't rely on sizeof(bmp_file_header) as structure padding + // adds 2 bytes offset leading to misaligned color table reading + uint32_t ct_offset = BITMAP_FILE_HEADER_SIZE + + bmp_header.bmp_info_header.bmp_header_size; + f->seek(ct_offset); uint32_t color_table_size = 0; - if (bmp_header.bmp_info_header.bmp_bit_count == 1) - color_table_size = 2; - else if (bmp_header.bmp_info_header.bmp_bit_count == 4) - color_table_size = 16; - else if (bmp_header.bmp_info_header.bmp_bit_count == 8) - color_table_size = 256; + + // bmp_colors_used may report 0 despite having a color table + // for 4 and 1 bit images, so don't rely on this information + if (bmp_header.bmp_info_header.bmp_bit_count <= 8) { + // Support 256 colors max + color_table_size = 1 << bmp_header.bmp_info_header.bmp_bit_count; + } + ERR_FAIL_COND_V(color_table_size == 0, ERR_BUG); PoolVector<uint8_t> bmp_color_table; if (color_table_size > 0) { + // Color table is usually 4 bytes per color -> [B][G][R][0] err = bmp_color_table.resize(color_table_size * 4); PoolVector<uint8_t>::Write bmp_color_table_w = bmp_color_table.write(); - f->get_buffer(bmp_color_table_w.ptr(), - bmp_header.bmp_info_header.bmp_colors_used * 4); + f->get_buffer(bmp_color_table_w.ptr(), color_table_size * 4); } f->seek(bmp_header.bmp_file_header.bmp_file_offset); @@ -174,7 +282,7 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, PoolVector<uint8_t>::Read bmp_buffer_r = bmp_buffer.read(); PoolVector<uint8_t>::Read bmp_color_table_r = bmp_color_table.read(); err = convert_to_image(p_image, bmp_buffer_r.ptr(), - bmp_color_table_r.ptr(), bmp_header); + bmp_color_table_r.ptr(), color_table_size, bmp_header); } f->close(); } diff --git a/modules/bmp/image_loader_bmp.h b/modules/bmp/image_loader_bmp.h index d6899061d0..0082cf778a 100644 --- a/modules/bmp/image_loader_bmp.h +++ b/modules/bmp/image_loader_bmp.h @@ -37,6 +37,22 @@ class ImageLoaderBMP : public ImageFormatLoader { protected: static const unsigned BITMAP_SIGNATURE = 0x4d42; + static const unsigned BITMAP_FILE_HEADER_SIZE = 14; // bmp_file_header_s + static const unsigned BITMAP_INFO_HEADER_MIN_SIZE = 40; // bmp_info_header_s + + enum bmp_compression_s { + BI_RGB = 0x00, + BI_RLE8 = 0x01, + BI_RLE4 = 0x02, + BI_BITFIELDS = 0x03, + BI_JPEG = 0x04, + BI_PNG = 0x05, + BI_ALPHABITFIELDS = 0x06, + BI_CMYK = 0x0b, + BI_CMYKRLE8 = 0x0c, + BI_CMYKRLE4 = 0x0d + }; + struct bmp_header_s { struct bmp_file_header_s { uint16_t bmp_signature; @@ -57,21 +73,13 @@ protected: uint32_t bmp_pixels_per_meter_y; uint32_t bmp_colors_used; uint32_t bmp_important_colors; - uint32_t bmp_red_mask; - uint32_t bmp_green_mask; - uint32_t bmp_blue_mask; - uint32_t bmp_alpha_mask; - uint32_t bmp_cs_type; - uint32_t bmp_endpoints[9]; - uint32_t bmp_gamma_red; - uint32_t bmp_gamma_green; - uint32_t bmp_gamma_blue; } bmp_info_header; }; static Error convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const uint8_t *p_color_buffer, + const uint32_t color_table_size, const bmp_header_s &p_header); public: diff --git a/modules/bullet/SCsub b/modules/bullet/SCsub index 7e714ba43f..e7c2fff54c 100644 --- a/modules/bullet/SCsub +++ b/modules/bullet/SCsub @@ -188,7 +188,7 @@ if env['builtin_bullet']: env_bullet.Append(CPPPATH=[thirdparty_dir]) # if env['target'] == "debug" or env['target'] == "release_debug": - # env_bullet.Append(CCFLAGS=['-DBT_DEBUG']) + # env_bullet.Append(CPPFLAGS=['-DBT_DEBUG']) env_thirdparty = env_bullet.Clone() env_thirdparty.disable_warnings() diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index 22f2214898..e5f70a0b34 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -597,6 +597,8 @@ void RigidBodyBullet::set_state(PhysicsServer::BodyState p_state, const Variant if (!can_sleep) { // Can't sleep btBody->forceActivationState(DISABLE_DEACTIVATION); + } else { + btBody->forceActivationState(ACTIVE_TAG); } break; } diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp index 0eb539b182..7e1cc937cd 100644 --- a/modules/csg/csg.cpp +++ b/modules/csg/csg.cpp @@ -242,7 +242,7 @@ void CSGBrushOperation::BuildPoly::_clip_segment(const CSGBrush *p_brush, int p_ //check if edge and poly share a vertex, of so, assign it to segment_idx for (int i = 0; i < points.size(); i++) { for (int j = 0; j < 2; j++) { - if (segment[j].distance_to(points[i].point) < CMP_EPSILON) { + if (Math::is_zero_approx(segment[j].distance_to(points[i].point))) { segment_idx[j] = i; inserted_points.push_back(i); break; @@ -310,7 +310,7 @@ void CSGBrushOperation::BuildPoly::_clip_segment(const CSGBrush *p_brush, int p_ Vector2 edgeseg[2] = { points[edges[i].points[0]].point, points[edges[i].points[1]].point }; Vector2 closest = Geometry::get_closest_point_to_segment_2d(segment[j], edgeseg); - if (closest.distance_to(segment[j]) < CMP_EPSILON) { + if (Math::is_zero_approx(closest.distance_to(segment[j]))) { //point rest of this edge res = closest; found = true; @@ -439,7 +439,7 @@ void CSGBrushOperation::BuildPoly::clip(const CSGBrush *p_brush, int p_face, Mes //transform A points to 2D - if (segment[0].distance_to(segment[1]) < CMP_EPSILON) + if (Math::is_zero_approx(segment[0].distance_to(segment[1]))) return; //too small _clip_segment(p_brush, p_face, segment, mesh_merge, p_for_B); @@ -461,10 +461,10 @@ void CSGBrushOperation::_collision_callback(const CSGBrush *A, int p_face_a, Map { //check if either is a degenerate - if (va[0].distance_to(va[1]) < CMP_EPSILON || va[0].distance_to(va[2]) < CMP_EPSILON || va[1].distance_to(va[2]) < CMP_EPSILON) + if (Math::is_zero_approx(va[0].distance_to(va[1])) || Math::is_zero_approx(va[0].distance_to(va[2])) || Math::is_zero_approx(va[1].distance_to(va[2]))) return; - if (vb[0].distance_to(vb[1]) < CMP_EPSILON || vb[0].distance_to(vb[2]) < CMP_EPSILON || vb[1].distance_to(vb[2]) < CMP_EPSILON) + if (Math::is_zero_approx(vb[0].distance_to(vb[1])) || Math::is_zero_approx(vb[0].distance_to(vb[2])) || Math::is_zero_approx(vb[1].distance_to(vb[2]))) return; } diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 775ec67ba6..e70773d914 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -724,6 +724,7 @@ CSGBrush *CSGMesh::_build_brush() { PoolVector<bool> smooth; PoolVector<Ref<Material> > materials; PoolVector<Vector2> uvs; + Ref<Material> material = get_material(); for (int i = 0; i < mesh->get_surface_count(); i++) { @@ -760,7 +761,12 @@ CSGBrush *CSGMesh::_build_brush() { uvr_used = true; } - Ref<Material> mat = mesh->surface_get_material(i); + Ref<Material> mat; + if (material.is_valid()) { + mat = material; + } else { + mat = mesh->surface_get_material(i); + } PoolVector<int> aindices = arrays[Mesh::ARRAY_INDEX]; if (aindices.size()) { @@ -866,6 +872,18 @@ void CSGMesh::_mesh_changed() { update_gizmo(); } +void CSGMesh::set_material(const Ref<Material> &p_material) { + if (material == p_material) + return; + material = p_material; + _make_dirty(); +} + +Ref<Material> CSGMesh::get_material() const { + + return material; +} + void CSGMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &CSGMesh::set_mesh); @@ -873,7 +891,11 @@ void CSGMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("_mesh_changed"), &CSGMesh::_mesh_changed); + ClassDB::bind_method(D_METHOD("set_material", "material"), &CSGMesh::set_material); + ClassDB::bind_method(D_METHOD("get_material"), &CSGMesh::get_material); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_mesh", "get_mesh"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_material", "get_material"); } void CSGMesh::set_mesh(const Ref<Mesh> &p_mesh) { diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h index 1622fb3a15..a5b2238e6b 100644 --- a/modules/csg/csg_shape.h +++ b/modules/csg/csg_shape.h @@ -38,8 +38,8 @@ #include "scene/resources/concave_polygon_shape.h" #include "thirdparty/misc/mikktspace.h" -class CSGShape : public VisualInstance { - GDCLASS(CSGShape, VisualInstance); +class CSGShape : public GeometryInstance { + GDCLASS(CSGShape, GeometryInstance); public: enum Operation { @@ -187,6 +187,7 @@ class CSGMesh : public CSGPrimitive { virtual CSGBrush *_build_brush(); Ref<Mesh> mesh; + Ref<Material> material; void _mesh_changed(); @@ -196,6 +197,9 @@ protected: public: void set_mesh(const Ref<Mesh> &p_mesh); Ref<Mesh> get_mesh(); + + void set_material(const Ref<Material> &p_material); + Ref<Material> get_material() const; }; class CSGSphere : public CSGPrimitive { diff --git a/modules/csg/doc_classes/CSGCylinder.xml b/modules/csg/doc_classes/CSGCylinder.xml index 9adcbc4502..24c3f8ba2e 100644 --- a/modules/csg/doc_classes/CSGCylinder.xml +++ b/modules/csg/doc_classes/CSGCylinder.xml @@ -12,7 +12,7 @@ </methods> <members> <member name="cone" type="bool" setter="set_cone" getter="is_cone"> - If true a cone is created, the [member radius] will only apply to one side. + If [code]true[/code] a cone is created, the [member radius] will only apply to one side. </member> <member name="height" type="float" setter="set_height" getter="get_height"> The height of the cylinder. @@ -27,7 +27,7 @@ The number of sides of the cylinder, the higher this number the more detail there will be in the cylinder. </member> <member name="smooth_faces" type="bool" setter="set_smooth_faces" getter="get_smooth_faces"> - If true the normals of the cylinder are set to give a smooth effect making the cylinder seem rounded. When false the cylinder will have a flat shaded look. + If [code]true[/code] the normals of the cylinder are set to give a smooth effect making the cylinder seem rounded. If [code]false[/code] the cylinder will have a flat shaded look. </member> </members> <constants> diff --git a/modules/csg/doc_classes/CSGMesh.xml b/modules/csg/doc_classes/CSGMesh.xml index c1f04d724a..afe0bc262d 100644 --- a/modules/csg/doc_classes/CSGMesh.xml +++ b/modules/csg/doc_classes/CSGMesh.xml @@ -11,6 +11,8 @@ <methods> </methods> <members> + <member name="material" type="Material" setter="set_material" getter="get_material"> + </member> <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> The mesh resource to use as a CSG shape. </member> diff --git a/modules/csg/doc_classes/CSGPolygon.xml b/modules/csg/doc_classes/CSGPolygon.xml index 931c7cba51..2c5d298222 100644 --- a/modules/csg/doc_classes/CSGPolygon.xml +++ b/modules/csg/doc_classes/CSGPolygon.xml @@ -21,16 +21,16 @@ Extrusion mode. </member> <member name="path_continuous_u" type="bool" setter="set_path_continuous_u" getter="is_path_continuous_u"> - If true the u component of our uv will continuously increase in unison with the distance traveled along our path when [member mode] is [constant MODE_PATH]. + If [code]true[/code] the u component of our uv will continuously increase in unison with the distance traveled along our path when [member mode] is [constant MODE_PATH]. </member> <member name="path_interval" type="float" setter="set_path_interval" getter="get_path_interval"> Interval at which a new extrusion slice is added along the path when [member mode] is [constant MODE_PATH]. </member> <member name="path_joined" type="bool" setter="set_path_joined" getter="is_path_joined"> - If true the start and end of our path are joined together ensuring there is no seam when [member mode] is [constant MODE_PATH]. + If [code]true[/code] the start and end of our path are joined together ensuring there is no seam when [member mode] is [constant MODE_PATH]. </member> <member name="path_local" type="bool" setter="set_path_local" getter="is_path_local"> - If false we extrude centered on our path, if true we extrude in relation to the position of our CSGPolygon when [member mode] is [constant MODE_PATH]. + If [code]false[/code] we extrude centered on our path, if [code]true[/code] we extrude in relation to the position of our CSGPolygon when [member mode] is [constant MODE_PATH]. </member> <member name="path_node" type="NodePath" setter="set_path_node" getter="get_path_node"> The [Shape] object containing the path along which we extrude when [member mode] is [constant MODE_PATH]. diff --git a/modules/csg/doc_classes/CSGShape.xml b/modules/csg/doc_classes/CSGShape.xml index 152a8cd3bc..7fa7c78534 100644 --- a/modules/csg/doc_classes/CSGShape.xml +++ b/modules/csg/doc_classes/CSGShape.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="CSGShape" inherits="VisualInstance" category="Core" version="3.2"> +<class name="CSGShape" inherits="GeometryInstance" category="Core" version="3.2"> <brief_description> The CSG base class. </brief_description> @@ -37,7 +37,7 @@ <return type="bool"> </return> <description> - Returns true if this is a root shape and is thus the object that is rendered. + Returns [code]true[/code] if this is a root shape and is thus the object that is rendered. </description> </method> <method name="set_collision_layer_bit"> diff --git a/modules/csg/doc_classes/CSGSphere.xml b/modules/csg/doc_classes/CSGSphere.xml index 5fe55996e5..2a12cf84db 100644 --- a/modules/csg/doc_classes/CSGSphere.xml +++ b/modules/csg/doc_classes/CSGSphere.xml @@ -24,7 +24,7 @@ Number of horizontal slices for the sphere. </member> <member name="smooth_faces" type="bool" setter="set_smooth_faces" getter="get_smooth_faces"> - If true the normals of the sphere are set to give a smooth effect making the sphere seem rounded. When false the sphere will have a flat shaded look. + If [code]true[/code] the normals of the sphere are set to give a smooth effect making the sphere seem rounded. If [code]false[/code] the sphere will have a flat shaded look. </member> </members> <constants> diff --git a/modules/csg/doc_classes/CSGTorus.xml b/modules/csg/doc_classes/CSGTorus.xml index e438b9e405..0d4437d87f 100644 --- a/modules/csg/doc_classes/CSGTorus.xml +++ b/modules/csg/doc_classes/CSGTorus.xml @@ -27,7 +27,7 @@ The number of slices the torus is constructed of. </member> <member name="smooth_faces" type="bool" setter="set_smooth_faces" getter="get_smooth_faces"> - If true the normals of the torus are set to give a smooth effect making the torus seem rounded. When false the torus will have a flat shaded look. + If [code]true[/code] the normals of the torus are set to give a smooth effect making the torus seem rounded. If [code]false[/code] the torus will have a flat shaded look. </member> </members> <constants> diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml index cecf08e9a5..894c17c684 100644 --- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml +++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml @@ -60,7 +60,7 @@ <argument index="1" name="now" type="bool" default="false"> </argument> <description> - Disconnect the given peer. If "now" is set to true, the connection will be closed immediately without flushing queued messages. + Disconnect the given peer. If "now" is set to [code]true[/code], the connection will be closed immediately without flushing queued messages. </description> </method> <method name="get_last_packet_channel" qualifiers="const"> diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index 193f1bb48d..492b365128 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -346,11 +346,10 @@ void NetworkedMultiplayerENet::poll() { uint32_t *id = (uint32_t *)event.peer->data; - ERR_CONTINUE(event.packet->dataLength < 12) + ERR_CONTINUE(event.packet->dataLength < 8) uint32_t source = decode_uint32(&event.packet->data[0]); int target = decode_uint32(&event.packet->data[4]); - uint32_t flags = decode_uint32(&event.packet->data[8]); packet.from = source; packet.channel = event.channelID; @@ -371,7 +370,7 @@ void NetworkedMultiplayerENet::poll() { if (uint32_t(E->key()) == source) // Do not resend to self continue; - ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, flags); + ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, packet.packet->flags); enet_peer_send(E->get(), event.channelID, packet2); } @@ -385,7 +384,7 @@ void NetworkedMultiplayerENet::poll() { if (uint32_t(E->key()) == source || E->key() == -target) // Do not resend to self, also do not send to excluded continue; - ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, flags); + ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, packet.packet->flags); enet_peer_send(E->get(), event.channelID, packet2); } @@ -503,8 +502,8 @@ Error NetworkedMultiplayerENet::get_packet(const uint8_t **r_buffer, int &r_buff current_packet = incoming_packets.front()->get(); incoming_packets.pop_front(); - *r_buffer = (const uint8_t *)(¤t_packet.packet->data[12]); - r_buffer_size = current_packet.packet->dataLength - 12; + *r_buffer = (const uint8_t *)(¤t_packet.packet->data[8]); + r_buffer_size = current_packet.packet->dataLength - 8; return OK; } @@ -549,11 +548,10 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer } } - ENetPacket *packet = enet_packet_create(NULL, p_buffer_size + 12, packet_flags); + ENetPacket *packet = enet_packet_create(NULL, p_buffer_size + 8, packet_flags); encode_uint32(unique_id, &packet->data[0]); // Source ID encode_uint32(target_peer, &packet->data[4]); // Dest ID - encode_uint32(packet_flags, &packet->data[8]); // Dest ID - copymem(&packet->data[12], p_buffer, p_buffer_size); + copymem(&packet->data[8], p_buffer, p_buffer_size); if (server) { diff --git a/modules/etc/SCsub b/modules/etc/SCsub index 6e963ef766..eb2738053b 100644 --- a/modules/etc/SCsub +++ b/modules/etc/SCsub @@ -31,7 +31,7 @@ env_etc.Append(CPPPATH=[thirdparty_dir]) # upstream uses c++11 if not env.msvc: - env_etc.Append(CCFLAGS="-std=c++11") + env_etc.Append(CXXFLAGS="-std=c++11") env_thirdparty = env_etc.Clone() env_thirdparty.disable_warnings() diff --git a/modules/freetype/SCsub b/modules/freetype/SCsub index c2d165f367..f2cd9f9a60 100644 --- a/modules/freetype/SCsub +++ b/modules/freetype/SCsub @@ -72,9 +72,9 @@ if env['builtin_freetype']: # Also needed in main env for scene/ env.Append(CPPPATH=[thirdparty_dir + "/include"]) - env_freetype.Append(CCFLAGS=['-DFT2_BUILD_LIBRARY', '-DFT_CONFIG_OPTION_USE_PNG']) + env_freetype.Append(CPPFLAGS=['-DFT2_BUILD_LIBRARY', '-DFT_CONFIG_OPTION_USE_PNG']) if (env['target'] != 'release'): - env_freetype.Append(CCFLAGS=['-DZLIB_DEBUG']) + env_freetype.Append(CPPFLAGS=['-DZLIB_DEBUG']) # Also requires libpng headers if env['builtin_libpng']: @@ -100,4 +100,4 @@ if env['builtin_freetype']: # Godot source files env_freetype.add_source_files(env.modules_sources, "*.cpp") # Used in scene/, needs to be in main env -env.Append(CCFLAGS=['-DFREETYPE_ENABLED']) +env.Append(CPPFLAGS=['-DFREETYPE_ENABLED']) diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.cpp b/modules/gdnative/videodecoder/video_stream_gdnative.cpp index 8fcebe7855..9bb1186269 100644 --- a/modules/gdnative/videodecoder/video_stream_gdnative.cpp +++ b/modules/gdnative/videodecoder/video_stream_gdnative.cpp @@ -61,8 +61,8 @@ int64_t GDAPI godot_videodecoder_file_seek(void *ptr, int64_t pos, int whence) { // file FileAccess *file = reinterpret_cast<FileAccess *>(ptr); - size_t len = file->get_len(); if (file) { + size_t len = file->get_len(); switch (whence) { case SEEK_SET: { // Just for explicitness diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index df8fc2267d..ab34184bfb 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -3008,8 +3008,8 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co } } } + base_type = base_type.class_type->base_type; } - base_type = base_type.class_type->base_type; } break; case GDScriptParser::DataType::SCRIPT: case GDScriptParser::DataType::GDSCRIPT: { diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp index 4fd136d5cc..7552bc6bff 100644 --- a/modules/gdscript/gdscript_functions.cpp +++ b/modules/gdscript/gdscript_functions.cpp @@ -68,6 +68,8 @@ const char *GDScriptFunctions::get_func_name(Function p_func) { "exp", "is_nan", "is_inf", + "is_equal_approx", + "is_zero_approx", "ease", "decimals", "stepify", @@ -316,6 +318,17 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_ VALIDATE_ARG_NUM(0); r_ret = Math::is_inf((double)*p_args[0]); } break; + case MATH_ISEQUALAPPROX: { + VALIDATE_ARG_COUNT(2); + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + r_ret = Math::is_equal_approx((real_t)*p_args[0], (real_t)*p_args[1]); + } break; + case MATH_ISZEROAPPROX: { + VALIDATE_ARG_COUNT(1); + VALIDATE_ARG_NUM(0); + r_ret = Math::is_zero_approx((real_t)*p_args[0]); + } break; case MATH_EASE: { VALIDATE_ARG_COUNT(2); VALIDATE_ARG_NUM(0); @@ -1596,6 +1609,16 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) { mi.return_val.type = Variant::BOOL; return mi; } break; + case MATH_ISEQUALAPPROX: { + MethodInfo mi("is_equal_approx", PropertyInfo(Variant::REAL, "a"), PropertyInfo(Variant::REAL, "b")); + mi.return_val.type = Variant::BOOL; + return mi; + } break; + case MATH_ISZEROAPPROX: { + MethodInfo mi("is_zero_approx", PropertyInfo(Variant::REAL, "s")); + mi.return_val.type = Variant::BOOL; + return mi; + } break; case MATH_EASE: { MethodInfo mi("ease", PropertyInfo(Variant::REAL, "s"), PropertyInfo(Variant::REAL, "curve")); mi.return_val.type = Variant::REAL; diff --git a/modules/gdscript/gdscript_functions.h b/modules/gdscript/gdscript_functions.h index 14bf3d7560..0dbd172acf 100644 --- a/modules/gdscript/gdscript_functions.h +++ b/modules/gdscript/gdscript_functions.h @@ -59,6 +59,8 @@ public: MATH_EXP, MATH_ISNAN, MATH_ISINF, + MATH_ISEQUALAPPROX, + MATH_ISZEROAPPROX, MATH_EASE, MATH_DECIMALS, MATH_STEPIFY, diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp index 36503af4d7..b8048fb5dd 100644 --- a/modules/gdscript/gdscript_tokenizer.cpp +++ b/modules/gdscript/gdscript_tokenizer.cpp @@ -896,7 +896,7 @@ void GDScriptTokenizerText::_advance() { } hexa_found = true; } else if (!hexa_found && GETCHAR(i) == 'e') { - if (hexa_found || exponent_found) { + if (exponent_found) { _make_error("Invalid numeric constant at 'e'"); return; } diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 3c9644127c..27e579935f 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -131,14 +131,6 @@ void CSharpLanguage::finish() { finalizing = true; -#ifdef TOOLS_ENABLED - // Must be here, to avoid StringName leaks - if (BindingsGenerator::singleton) { - memdelete(BindingsGenerator::singleton); - BindingsGenerator::singleton = NULL; - } -#endif - // Make sure all script binding gchandles are released before finalizing GDMono for (Map<Object *, CSharpScriptBinding>::Element *E = script_bindings.front(); E; E = E->next()) { CSharpScriptBinding &script_binding = E->value(); @@ -919,7 +911,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) { } #endif -void CSharpLanguage::project_assembly_loaded() { +void CSharpLanguage::_load_scripts_metadata() { scripts_metadata.clear(); @@ -953,6 +945,7 @@ void CSharpLanguage::project_assembly_loaded() { } scripts_metadata = old_dict_var.operator Dictionary(); + scripts_metadata_invalidated = false; print_verbose("Successfully loaded scripts metadata"); } else { @@ -1024,11 +1017,13 @@ bool CSharpLanguage::debug_break(const String &p_error, bool p_allow_continue) { } } -void CSharpLanguage::_uninitialize_script_bindings() { +void CSharpLanguage::_on_scripts_domain_unloaded() { for (Map<Object *, CSharpScriptBinding>::Element *E = script_bindings.front(); E; E = E->next()) { CSharpScriptBinding &script_binding = E->value(); script_binding.inited = false; } + + scripts_metadata_invalidated = true; } void CSharpLanguage::set_language_index(int p_idx) { @@ -1086,6 +1081,8 @@ CSharpLanguage::CSharpLanguage() { #endif lang_idx = -1; + + scripts_metadata_invalidated = true; } CSharpLanguage::~CSharpLanguage() { diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index 050527d52b..fe4eed2e24 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -309,14 +309,17 @@ class CSharpLanguage : public ScriptLanguage { int lang_idx; Dictionary scripts_metadata; + bool scripts_metadata_invalidated; // For debug_break and debug_break_parse int _debug_parse_err_line; String _debug_parse_err_file; String _debug_error; + void _load_scripts_metadata(); + friend class GDMono; - void _uninitialize_script_bindings(); + void _on_scripts_domain_unloaded(); public: StringNameCache string_names; @@ -341,9 +344,15 @@ public: void reload_assemblies(bool p_soft_reload); #endif - void project_assembly_loaded(); + _FORCE_INLINE_ Dictionary get_scripts_metadata_or_nothing() { + return scripts_metadata_invalidated ? Dictionary() : scripts_metadata; + } - _FORCE_INLINE_ const Dictionary &get_scripts_metadata() { return scripts_metadata; } + _FORCE_INLINE_ const Dictionary &get_scripts_metadata() { + if (scripts_metadata_invalidated) + _load_scripts_metadata(); + return scripts_metadata; + } virtual String get_name() const; diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index fe7ced060d..a408716641 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -38,7 +38,6 @@ #include "core/os/dir_access.h" #include "core/os/file_access.h" #include "core/os/os.h" -#include "core/string_builder.h" #include "core/ucaps.h" #include "../glue/cs_compressed.gen.h" @@ -98,14 +97,10 @@ #define C_METHOD_MONOARRAY_TO(m_type) C_NS_MONOMARSHAL "::mono_array_to_" #m_type #define C_METHOD_MONOARRAY_FROM(m_type) C_NS_MONOMARSHAL "::" #m_type "_to_mono_array" -#define BINDINGS_GENERATOR_VERSION UINT32_C(8) +#define BINDINGS_GENERATOR_VERSION UINT32_C(9) const char *BindingsGenerator::TypeInterface::DEFAULT_VARARG_C_IN("\t%0 %1_in = %1;\n"); -bool BindingsGenerator::verbose_output = false; - -BindingsGenerator *BindingsGenerator::singleton = NULL; - static String fix_doc_description(const String &p_bbcode) { // This seems to be the correct way to do this. It's the same EditorHelp does. @@ -757,47 +752,47 @@ void BindingsGenerator::_generate_method_icalls(const TypeInterface &p_itype) { } } -void BindingsGenerator::_generate_global_constants(List<String> &p_output) { +void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) { // Constants (in partial GD class) - p_output.push_back("\n#pragma warning disable CS1591 // Disable warning: " - "'Missing XML comment for publicly visible type or member'\n"); + p_output.append("\n#pragma warning disable CS1591 // Disable warning: " + "'Missing XML comment for publicly visible type or member'\n"); - p_output.push_back("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); - p_output.push_back(INDENT1 "public static partial class " BINDINGS_GLOBAL_SCOPE_CLASS "\n" INDENT1 "{"); + p_output.append("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); + p_output.append(INDENT1 "public static partial class " BINDINGS_GLOBAL_SCOPE_CLASS "\n" INDENT1 "{"); for (const List<ConstantInterface>::Element *E = global_constants.front(); E; E = E->next()) { const ConstantInterface &iconstant = E->get(); if (iconstant.const_doc && iconstant.const_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(iconstant.const_doc->description), NULL); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - p_output.push_back(MEMBER_BEGIN "/// <summary>\n"); + p_output.append(MEMBER_BEGIN "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - p_output.push_back(INDENT2 "/// "); - p_output.push_back(summary_lines[i]); - p_output.push_back("\n"); + p_output.append(INDENT2 "/// "); + p_output.append(summary_lines[i]); + p_output.append("\n"); } - p_output.push_back(INDENT2 "/// </summary>"); + p_output.append(INDENT2 "/// </summary>"); } } - p_output.push_back(MEMBER_BEGIN "public const int "); - p_output.push_back(iconstant.proxy_name); - p_output.push_back(" = "); - p_output.push_back(itos(iconstant.value)); - p_output.push_back(";"); + p_output.append(MEMBER_BEGIN "public const int "); + p_output.append(iconstant.proxy_name); + p_output.append(" = "); + p_output.append(itos(iconstant.value)); + p_output.append(";"); } if (!global_constants.empty()) - p_output.push_back("\n"); + p_output.append("\n"); - p_output.push_back(INDENT1 CLOSE_BLOCK); // end of GD class + p_output.append(INDENT1 CLOSE_BLOCK); // end of GD class // Enums @@ -817,60 +812,56 @@ void BindingsGenerator::_generate_global_constants(List<String> &p_output) { CRASH_COND(enum_class_name != "Variant"); // Hard-coded... - if (verbose_output) { - WARN_PRINTS("Declaring global enum `" + enum_proxy_name + "` inside static class `" + enum_class_name + "`"); - } + _log("Declaring global enum `%s` inside static class `%s`\n", enum_proxy_name.utf8().get_data(), enum_class_name.utf8().get_data()); - p_output.push_back("\n" INDENT1 "public static partial class "); - p_output.push_back(enum_class_name); - p_output.push_back("\n" INDENT1 OPEN_BLOCK); + p_output.append("\n" INDENT1 "public static partial class "); + p_output.append(enum_class_name); + p_output.append("\n" INDENT1 OPEN_BLOCK); } - p_output.push_back("\n" INDENT1 "public enum "); - p_output.push_back(enum_proxy_name); - p_output.push_back("\n" INDENT1 OPEN_BLOCK); + p_output.append("\n" INDENT1 "public enum "); + p_output.append(enum_proxy_name); + p_output.append("\n" INDENT1 OPEN_BLOCK); for (const List<ConstantInterface>::Element *F = ienum.constants.front(); F; F = F->next()) { const ConstantInterface &iconstant = F->get(); if (iconstant.const_doc && iconstant.const_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(iconstant.const_doc->description), NULL); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - p_output.push_back(INDENT2 "/// <summary>\n"); + p_output.append(INDENT2 "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - p_output.push_back(INDENT2 "/// "); - p_output.push_back(summary_lines[i]); - p_output.push_back("\n"); + p_output.append(INDENT2 "/// "); + p_output.append(summary_lines[i]); + p_output.append("\n"); } - p_output.push_back(INDENT2 "/// </summary>\n"); + p_output.append(INDENT2 "/// </summary>\n"); } } - p_output.push_back(INDENT2); - p_output.push_back(iconstant.proxy_name); - p_output.push_back(" = "); - p_output.push_back(itos(iconstant.value)); - p_output.push_back(F != ienum.constants.back() ? ",\n" : "\n"); + p_output.append(INDENT2); + p_output.append(iconstant.proxy_name); + p_output.append(" = "); + p_output.append(itos(iconstant.value)); + p_output.append(F != ienum.constants.back() ? ",\n" : "\n"); } - p_output.push_back(INDENT1 CLOSE_BLOCK); + p_output.append(INDENT1 CLOSE_BLOCK); if (enum_in_static_class) - p_output.push_back(INDENT1 CLOSE_BLOCK); + p_output.append(INDENT1 CLOSE_BLOCK); } - p_output.push_back(CLOSE_BLOCK); // end of namespace + p_output.append(CLOSE_BLOCK); // end of namespace - p_output.push_back("\n#pragma warning restore CS1591\n"); + p_output.append("\n#pragma warning restore CS1591\n"); } -Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) { - - verbose_output = p_verbose_output; +Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution) { String proj_dir = p_solution_dir.plus_file(CORE_API_ASSEMBLY_NAME); @@ -893,7 +884,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, // Generate source file for global scope constants and enums { - List<String> constants_source; + StringBuilder constants_source; _generate_global_constants(constants_source); String output_file = path_join(core_dir, BINDINGS_GLOBAL_SCOPE_CLASS "_constants.cs"); Error save_err = _save_file(output_file, constants_source); @@ -951,28 +942,28 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, compile_items.push_back(output_file); } - List<String> cs_icalls_content; - - cs_icalls_content.push_back("using System;\n" - "using System.Runtime.CompilerServices;\n" - "\n"); - cs_icalls_content.push_back("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); - cs_icalls_content.push_back(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS "\n" INDENT1 OPEN_BLOCK); - - cs_icalls_content.push_back(MEMBER_BEGIN "internal static ulong godot_api_hash = "); - cs_icalls_content.push_back(String::num_uint64(GDMono::get_singleton()->get_api_core_hash()) + ";\n"); - cs_icalls_content.push_back(MEMBER_BEGIN "internal static uint bindings_version = "); - cs_icalls_content.push_back(String::num_uint64(BINDINGS_GENERATOR_VERSION) + ";\n"); - cs_icalls_content.push_back(MEMBER_BEGIN "internal static uint cs_glue_version = "); - cs_icalls_content.push_back(String::num_uint64(CS_GLUE_VERSION) + ";\n"); - -#define ADD_INTERNAL_CALL(m_icall) \ - if (!m_icall.editor_only) { \ - cs_icalls_content.push_back(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ - cs_icalls_content.push_back(INDENT2 "internal extern static "); \ - cs_icalls_content.push_back(m_icall.im_type_out + " "); \ - cs_icalls_content.push_back(m_icall.name + "("); \ - cs_icalls_content.push_back(m_icall.im_sig + ");\n"); \ + StringBuilder cs_icalls_content; + + cs_icalls_content.append("using System;\n" + "using System.Runtime.CompilerServices;\n" + "\n"); + cs_icalls_content.append("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); + cs_icalls_content.append(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS "\n" INDENT1 OPEN_BLOCK); + + cs_icalls_content.append(MEMBER_BEGIN "internal static ulong godot_api_hash = "); + cs_icalls_content.append(String::num_uint64(GDMono::get_singleton()->get_api_core_hash()) + ";\n"); + cs_icalls_content.append(MEMBER_BEGIN "internal static uint bindings_version = "); + cs_icalls_content.append(String::num_uint64(BINDINGS_GENERATOR_VERSION) + ";\n"); + cs_icalls_content.append(MEMBER_BEGIN "internal static uint cs_glue_version = "); + cs_icalls_content.append(String::num_uint64(CS_GLUE_VERSION) + ";\n"); + +#define ADD_INTERNAL_CALL(m_icall) \ + if (!m_icall.editor_only) { \ + cs_icalls_content.append(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ + cs_icalls_content.append(INDENT2 "internal extern static "); \ + cs_icalls_content.append(m_icall.im_type_out + " "); \ + cs_icalls_content.append(m_icall.name + "("); \ + cs_icalls_content.append(m_icall.im_sig + ");\n"); \ } for (const List<InternalCall>::Element *E = core_custom_icalls.front(); E; E = E->next()) @@ -982,7 +973,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, #undef ADD_INTERNAL_CALL - cs_icalls_content.push_back(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); + cs_icalls_content.append(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); String internal_methods_file = path_join(core_dir, BINDINGS_CLASS_NATIVECALLS ".cs"); @@ -1002,15 +993,12 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, r_solution.add_new_project(CORE_API_ASSEMBLY_NAME, proj_info); - if (verbose_output) - OS::get_singleton()->print("The solution and C# project for the Core API was generated successfully\n"); + _log("The solution and C# project for the Core API was generated successfully\n"); return OK; } -Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) { - - verbose_output = p_verbose_output; +Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution) { String proj_dir = p_solution_dir.plus_file(EDITOR_API_ASSEMBLY_NAME); @@ -1049,29 +1037,29 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir compile_items.push_back(output_file); } - List<String> cs_icalls_content; - - cs_icalls_content.push_back("using System;\n" - "using System.Runtime.CompilerServices;\n" - "\n"); - cs_icalls_content.push_back("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); - cs_icalls_content.push_back(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS_EDITOR "\n" INDENT1 OPEN_BLOCK); - - cs_icalls_content.push_back(INDENT2 "internal static ulong godot_api_hash = "); - cs_icalls_content.push_back(String::num_uint64(GDMono::get_singleton()->get_api_editor_hash()) + ";\n"); - cs_icalls_content.push_back(INDENT2 "internal static uint bindings_version = "); - cs_icalls_content.push_back(String::num_uint64(BINDINGS_GENERATOR_VERSION) + ";\n"); - cs_icalls_content.push_back(INDENT2 "internal static uint cs_glue_version = "); - cs_icalls_content.push_back(String::num_uint64(CS_GLUE_VERSION) + ";\n"); - cs_icalls_content.push_back("\n"); - -#define ADD_INTERNAL_CALL(m_icall) \ - if (m_icall.editor_only) { \ - cs_icalls_content.push_back(INDENT2 "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ - cs_icalls_content.push_back(INDENT2 "internal extern static "); \ - cs_icalls_content.push_back(m_icall.im_type_out + " "); \ - cs_icalls_content.push_back(m_icall.name + "("); \ - cs_icalls_content.push_back(m_icall.im_sig + ");\n"); \ + StringBuilder cs_icalls_content; + + cs_icalls_content.append("using System;\n" + "using System.Runtime.CompilerServices;\n" + "\n"); + cs_icalls_content.append("namespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); + cs_icalls_content.append(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS_EDITOR "\n" INDENT1 OPEN_BLOCK); + + cs_icalls_content.append(INDENT2 "internal static ulong godot_api_hash = "); + cs_icalls_content.append(String::num_uint64(GDMono::get_singleton()->get_api_editor_hash()) + ";\n"); + cs_icalls_content.append(INDENT2 "internal static uint bindings_version = "); + cs_icalls_content.append(String::num_uint64(BINDINGS_GENERATOR_VERSION) + ";\n"); + cs_icalls_content.append(INDENT2 "internal static uint cs_glue_version = "); + cs_icalls_content.append(String::num_uint64(CS_GLUE_VERSION) + ";\n"); + cs_icalls_content.append("\n"); + +#define ADD_INTERNAL_CALL(m_icall) \ + if (m_icall.editor_only) { \ + cs_icalls_content.append(INDENT2 "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ + cs_icalls_content.append(INDENT2 "internal extern static "); \ + cs_icalls_content.append(m_icall.im_type_out + " "); \ + cs_icalls_content.append(m_icall.name + "("); \ + cs_icalls_content.append(m_icall.im_sig + ");\n"); \ } for (const List<InternalCall>::Element *E = editor_custom_icalls.front(); E; E = E->next()) @@ -1081,7 +1069,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir #undef ADD_INTERNAL_CALL - cs_icalls_content.push_back(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); + cs_icalls_content.append(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); String internal_methods_file = path_join(core_dir, BINDINGS_CLASS_NATIVECALLS_EDITOR ".cs"); @@ -1101,13 +1089,12 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir r_solution.add_new_project(EDITOR_API_ASSEMBLY_NAME, proj_info); - if (verbose_output) - OS::get_singleton()->print("The solution and C# project for the Editor API was generated successfully\n"); + _log("The solution and C# project for the Editor API was generated successfully\n"); return OK; } -Error BindingsGenerator::generate_cs_api(const String &p_output_dir, bool p_verbose_output) { +Error BindingsGenerator::generate_cs_api(const String &p_output_dir) { DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); @@ -1124,13 +1111,13 @@ Error BindingsGenerator::generate_cs_api(const String &p_output_dir, bool p_verb Error proj_err; - proj_err = generate_cs_core_project(p_output_dir, solution, p_verbose_output); + proj_err = generate_cs_core_project(p_output_dir, solution); if (proj_err != OK) { ERR_PRINT("Generation of the Core API C# project failed"); return proj_err; } - proj_err = generate_cs_editor_project(p_output_dir, solution, p_verbose_output); + proj_err = generate_cs_editor_project(p_output_dir, solution); if (proj_err != OK) { ERR_PRINT("Generation of the Editor API C# project failed"); return proj_err; @@ -1169,65 +1156,64 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str List<InternalCall> &custom_icalls = itype.api_type == ClassDB::API_EDITOR ? editor_custom_icalls : core_custom_icalls; - if (verbose_output) - OS::get_singleton()->print("Generating %s.cs...\n", itype.proxy_name.utf8().get_data()); + _log("Generating %s.cs...\n", itype.proxy_name.utf8().get_data()); String ctor_method(ICALL_PREFIX + itype.proxy_name + "_Ctor"); // Used only for derived types - List<String> output; + StringBuilder output; - output.push_back("using System;\n"); // IntPtr - output.push_back("using System.Diagnostics;\n"); // DebuggerBrowsable + output.append("using System;\n"); // IntPtr + output.append("using System.Diagnostics;\n"); // DebuggerBrowsable - output.push_back("\n" - "#pragma warning disable CS1591 // Disable warning: " - "'Missing XML comment for publicly visible type or member'\n" - "#pragma warning disable CS1573 // Disable warning: " - "'Parameter has no matching param tag in the XML comment'\n"); + output.append("\n" + "#pragma warning disable CS1591 // Disable warning: " + "'Missing XML comment for publicly visible type or member'\n" + "#pragma warning disable CS1573 // Disable warning: " + "'Parameter has no matching param tag in the XML comment'\n"); - output.push_back("\nnamespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); + output.append("\nnamespace " BINDINGS_NAMESPACE "\n" OPEN_BLOCK); const DocData::ClassDoc *class_doc = itype.class_doc; if (class_doc && class_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(class_doc->description), &itype); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - output.push_back(INDENT1 "/// <summary>\n"); + output.append(INDENT1 "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - output.push_back(INDENT1 "/// "); - output.push_back(summary_lines[i]); - output.push_back("\n"); + output.append(INDENT1 "/// "); + output.append(summary_lines[i]); + output.append("\n"); } - output.push_back(INDENT1 "/// </summary>\n"); + output.append(INDENT1 "/// </summary>\n"); } } - output.push_back(INDENT1 "public "); + output.append(INDENT1 "public "); if (itype.is_singleton) { - output.push_back("static partial class "); + output.append("static partial class "); } else { - output.push_back(itype.is_instantiable ? "partial class " : "abstract partial class "); + output.append(itype.is_instantiable ? "partial class " : "abstract partial class "); } - output.push_back(itype.proxy_name); + output.append(itype.proxy_name); if (itype.is_singleton) { - output.push_back("\n"); + output.append("\n"); } else if (is_derived_type) { if (obj_types.has(itype.base_name)) { - output.push_back(" : "); - output.push_back(obj_types[itype.base_name].proxy_name); - output.push_back("\n"); + output.append(" : "); + output.append(obj_types[itype.base_name].proxy_name); + output.append("\n"); } else { ERR_PRINTS("Base type '" + itype.base_name.operator String() + "' does not exist, for class " + itype.name); return ERR_INVALID_DATA; } } - output.push_back(INDENT1 "{"); + output.append(INDENT1 "{"); if (class_doc) { @@ -1238,30 +1224,30 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str if (iconstant.const_doc && iconstant.const_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(iconstant.const_doc->description), &itype); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - output.push_back(MEMBER_BEGIN "/// <summary>\n"); + output.append(MEMBER_BEGIN "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - output.push_back(INDENT2 "/// "); - output.push_back(summary_lines[i]); - output.push_back("\n"); + output.append(INDENT2 "/// "); + output.append(summary_lines[i]); + output.append("\n"); } - output.push_back(INDENT2 "/// </summary>"); + output.append(INDENT2 "/// </summary>"); } } - output.push_back(MEMBER_BEGIN "public const int "); - output.push_back(iconstant.proxy_name); - output.push_back(" = "); - output.push_back(itos(iconstant.value)); - output.push_back(";"); + output.append(MEMBER_BEGIN "public const int "); + output.append(iconstant.proxy_name); + output.append(" = "); + output.append(itos(iconstant.value)); + output.append(";"); } if (itype.constants.size()) - output.push_back("\n"); + output.append("\n"); // Add enums @@ -1270,38 +1256,38 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str ERR_FAIL_COND_V(ienum.constants.empty(), ERR_BUG); - output.push_back(MEMBER_BEGIN "public enum "); - output.push_back(ienum.cname.operator String()); - output.push_back(MEMBER_BEGIN OPEN_BLOCK); + output.append(MEMBER_BEGIN "public enum "); + output.append(ienum.cname.operator String()); + output.append(MEMBER_BEGIN OPEN_BLOCK); for (const List<ConstantInterface>::Element *F = ienum.constants.front(); F; F = F->next()) { const ConstantInterface &iconstant = F->get(); if (iconstant.const_doc && iconstant.const_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(iconstant.const_doc->description), &itype); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - output.push_back(INDENT3 "/// <summary>\n"); + output.append(INDENT3 "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - output.push_back(INDENT3 "/// "); - output.push_back(summary_lines[i]); - output.push_back("\n"); + output.append(INDENT3 "/// "); + output.append(summary_lines[i]); + output.append("\n"); } - output.push_back(INDENT3 "/// </summary>\n"); + output.append(INDENT3 "/// </summary>\n"); } } - output.push_back(INDENT3); - output.push_back(iconstant.proxy_name); - output.push_back(" = "); - output.push_back(itos(iconstant.value)); - output.push_back(F != ienum.constants.back() ? ",\n" : "\n"); + output.append(INDENT3); + output.append(iconstant.proxy_name); + output.append(" = "); + output.append(itos(iconstant.value)); + output.append(F != ienum.constants.back() ? ",\n" : "\n"); } - output.push_back(INDENT2 CLOSE_BLOCK); + output.append(INDENT2 CLOSE_BLOCK); } // Add properties @@ -1322,53 +1308,53 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str if (itype.is_singleton) { // Add the type name and the singleton pointer as static fields - output.push_back(MEMBER_BEGIN "private static Godot.Object singleton;\n"); - output.push_back(MEMBER_BEGIN "public static Godot.Object Singleton\n" INDENT2 "{\n" INDENT3 - "get\n" INDENT3 "{\n" INDENT4 "if (singleton == null)\n" INDENT5 - "singleton = Engine.GetSingleton(" BINDINGS_NATIVE_NAME_FIELD ");\n" INDENT4 - "return singleton;\n" INDENT3 "}\n" INDENT2 "}\n"); - - output.push_back(MEMBER_BEGIN "private const string " BINDINGS_NATIVE_NAME_FIELD " = \""); - output.push_back(itype.name); - output.push_back("\";\n"); - - output.push_back(INDENT2 "internal static IntPtr " BINDINGS_PTR_FIELD " = "); - output.push_back(itype.api_type == ClassDB::API_EDITOR ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); - output.push_back("." ICALL_PREFIX); - output.push_back(itype.name); - output.push_back(SINGLETON_ICALL_SUFFIX "();\n"); + output.append(MEMBER_BEGIN "private static Godot.Object singleton;\n"); + output.append(MEMBER_BEGIN "public static Godot.Object Singleton\n" INDENT2 "{\n" INDENT3 + "get\n" INDENT3 "{\n" INDENT4 "if (singleton == null)\n" INDENT5 + "singleton = Engine.GetSingleton(" BINDINGS_NATIVE_NAME_FIELD ");\n" INDENT4 + "return singleton;\n" INDENT3 "}\n" INDENT2 "}\n"); + + output.append(MEMBER_BEGIN "private const string " BINDINGS_NATIVE_NAME_FIELD " = \""); + output.append(itype.name); + output.append("\";\n"); + + output.append(INDENT2 "internal static IntPtr " BINDINGS_PTR_FIELD " = "); + output.append(itype.api_type == ClassDB::API_EDITOR ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); + output.append("." ICALL_PREFIX); + output.append(itype.name); + output.append(SINGLETON_ICALL_SUFFIX "();\n"); } else if (is_derived_type) { // Add member fields - output.push_back(MEMBER_BEGIN "private const string " BINDINGS_NATIVE_NAME_FIELD " = \""); - output.push_back(itype.name); - output.push_back("\";\n"); + output.append(MEMBER_BEGIN "private const string " BINDINGS_NATIVE_NAME_FIELD " = \""); + output.append(itype.name); + output.append("\";\n"); // Add default constructor if (itype.is_instantiable) { - output.push_back(MEMBER_BEGIN "public "); - output.push_back(itype.proxy_name); - output.push_back("() : this("); - output.push_back(itype.memory_own ? "true" : "false"); + output.append(MEMBER_BEGIN "public "); + output.append(itype.proxy_name); + output.append("() : this("); + output.append(itype.memory_own ? "true" : "false"); // The default constructor may also be called by the engine when instancing existing native objects // The engine will initialize the pointer field of the managed side before calling the constructor // This is why we only allocate a new native object from the constructor if the pointer field is not set - output.push_back(")\n" OPEN_BLOCK_L2 "if (" BINDINGS_PTR_FIELD " == IntPtr.Zero)\n" INDENT4 BINDINGS_PTR_FIELD " = "); - output.push_back(itype.api_type == ClassDB::API_EDITOR ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); - output.push_back("." + ctor_method); - output.push_back("(this);\n" CLOSE_BLOCK_L2); + output.append(")\n" OPEN_BLOCK_L2 "if (" BINDINGS_PTR_FIELD " == IntPtr.Zero)\n" INDENT4 BINDINGS_PTR_FIELD " = "); + output.append(itype.api_type == ClassDB::API_EDITOR ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); + output.append("." + ctor_method); + output.append("(this);\n" CLOSE_BLOCK_L2); } else { // Hide the constructor - output.push_back(MEMBER_BEGIN "internal "); - output.push_back(itype.proxy_name); - output.push_back("() {}\n"); + output.append(MEMBER_BEGIN "internal "); + output.append(itype.proxy_name); + output.append("() {}\n"); } // Add.. em.. trick constructor. Sort of. - output.push_back(MEMBER_BEGIN "internal "); - output.push_back(itype.proxy_name); - output.push_back("(bool " CS_FIELD_MEMORYOWN ") : base(" CS_FIELD_MEMORYOWN ") {}\n"); + output.append(MEMBER_BEGIN "internal "); + output.append(itype.proxy_name); + output.append("(bool " CS_FIELD_MEMORYOWN ") : base(" CS_FIELD_MEMORYOWN ") {}\n"); } int method_bind_count = 0; @@ -1395,17 +1381,17 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str custom_icalls.push_back(ctor_icall); } - output.push_back(INDENT1 CLOSE_BLOCK /* class */ + output.append(INDENT1 CLOSE_BLOCK /* class */ CLOSE_BLOCK /* namespace */); - output.push_back("\n" - "#pragma warning restore CS1591\n" - "#pragma warning restore CS1573\n"); + output.append("\n" + "#pragma warning restore CS1591\n" + "#pragma warning restore CS1573\n"); return _save_file(p_output_file, output); } -Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInterface &p_itype, const PropertyInterface &p_iprop, List<String> &p_output) { +Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInterface &p_itype, const PropertyInterface &p_iprop, StringBuilder &p_output) { const MethodInterface *setter = p_itype.find_method_by_name(p_iprop.setter); @@ -1452,72 +1438,94 @@ Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInte if (p_iprop.prop_doc && p_iprop.prop_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(p_iprop.prop_doc->description), &p_itype); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); if (summary_lines.size()) { - p_output.push_back(MEMBER_BEGIN "/// <summary>\n"); + p_output.append(MEMBER_BEGIN "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - p_output.push_back(INDENT2 "/// "); - p_output.push_back(summary_lines[i]); - p_output.push_back("\n"); + p_output.append(INDENT2 "/// "); + p_output.append(summary_lines[i]); + p_output.append("\n"); } - p_output.push_back(INDENT2 "/// </summary>"); + p_output.append(INDENT2 "/// </summary>"); } } - p_output.push_back(MEMBER_BEGIN "public "); + p_output.append(MEMBER_BEGIN "public "); if (p_itype.is_singleton) - p_output.push_back("static "); + p_output.append("static "); - p_output.push_back(prop_itype->cs_type); - p_output.push_back(" "); - p_output.push_back(p_iprop.proxy_name); - p_output.push_back("\n" INDENT2 OPEN_BLOCK); + p_output.append(prop_itype->cs_type); + p_output.append(" "); + p_output.append(p_iprop.proxy_name); + p_output.append("\n" INDENT2 OPEN_BLOCK); if (getter) { - p_output.push_back(INDENT3 "get\n" OPEN_BLOCK_L3); - p_output.push_back("return "); - p_output.push_back(getter->proxy_name + "("); + p_output.append(INDENT3 "get\n" + + // TODO Remove this once we make accessor methods private/internal (they will no longer be marked as obsolete after that) + "#pragma warning disable CS0618 // Disable warning about obsolete method\n" + + OPEN_BLOCK_L3); + + p_output.append("return "); + p_output.append(getter->proxy_name + "("); if (p_iprop.index != -1) { const ArgumentInterface &idx_arg = getter->arguments.front()->get(); if (idx_arg.type.cname != name_cache.type_int) { // Assume the index parameter is an enum const TypeInterface *idx_arg_type = _get_type_or_null(idx_arg.type); CRASH_COND(idx_arg_type == NULL); - p_output.push_back("(" + idx_arg_type->proxy_name + ")" + itos(p_iprop.index)); + p_output.append("(" + idx_arg_type->proxy_name + ")" + itos(p_iprop.index)); } else { - p_output.push_back(itos(p_iprop.index)); + p_output.append(itos(p_iprop.index)); } } - p_output.push_back(");\n" CLOSE_BLOCK_L3); + p_output.append(");\n" + + CLOSE_BLOCK_L3 + + // TODO Remove this once we make accessor methods private/internal (they will no longer be marked as obsolete after that) + "#pragma warning restore CS0618\n"); } if (setter) { - p_output.push_back(INDENT3 "set\n" OPEN_BLOCK_L3); - p_output.push_back(setter->proxy_name + "("); + p_output.append(INDENT3 "set\n" + + // TODO Remove this once we make accessor methods private/internal (they will no longer be marked as obsolete after that) + "#pragma warning disable CS0618 // Disable warning about obsolete method\n" + + OPEN_BLOCK_L3); + + p_output.append(setter->proxy_name + "("); if (p_iprop.index != -1) { const ArgumentInterface &idx_arg = setter->arguments.front()->get(); if (idx_arg.type.cname != name_cache.type_int) { // Assume the index parameter is an enum const TypeInterface *idx_arg_type = _get_type_or_null(idx_arg.type); CRASH_COND(idx_arg_type == NULL); - p_output.push_back("(" + idx_arg_type->proxy_name + ")" + itos(p_iprop.index) + ", "); + p_output.append("(" + idx_arg_type->proxy_name + ")" + itos(p_iprop.index) + ", "); } else { - p_output.push_back(itos(p_iprop.index) + ", "); + p_output.append(itos(p_iprop.index) + ", "); } } - p_output.push_back("value);\n" CLOSE_BLOCK_L3); + p_output.append("value);\n" + + CLOSE_BLOCK_L3 + + // TODO Remove this once we make accessor methods private/internal (they will no longer be marked as obsolete after that) + "#pragma warning restore CS0618\n"); } - p_output.push_back(CLOSE_BLOCK_L2); + p_output.append(CLOSE_BLOCK_L2); return OK; } -Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterface &p_itype, const BindingsGenerator::MethodInterface &p_imethod, int &p_method_bind_count, List<String> &p_output) { +Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterface &p_itype, const BindingsGenerator::MethodInterface &p_imethod, int &p_method_bind_count, StringBuilder &p_output) { const TypeInterface *return_type = _get_type_or_placeholder(p_imethod.return_type); @@ -1529,7 +1537,7 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf String icall_params = method_bind_field + ", "; icall_params += sformat(p_itype.cs_in, "this"); - List<String> default_args_doc; + StringBuilder default_args_doc; // Retrieve information from the arguments for (const List<ArgumentInterface>::Element *F = p_imethod.arguments.front(); F; F = F->next()) { @@ -1598,7 +1606,7 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf // Apparently the name attribute must not include the @ String param_tag_name = iarg.name.begins_with("@") ? iarg.name.substr(1, iarg.name.length()) : iarg.name; - default_args_doc.push_back(INDENT2 "/// <param name=\"" + param_tag_name + "\">If the parameter is null, then the default value is " + def_arg + "</param>\n"); + default_args_doc.append(INDENT2 "/// <param name=\"" + param_tag_name + "\">If the parameter is null, then the default value is " + def_arg + "</param>\n"); } else { icall_params += arg_type->cs_in.empty() ? iarg.name : sformat(arg_type->cs_in, iarg.name); } @@ -1607,61 +1615,67 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf // Generate method { if (!p_imethod.is_virtual && !p_imethod.requires_object_call) { - p_output.push_back(MEMBER_BEGIN "[DebuggerBrowsable(DebuggerBrowsableState.Never)]" MEMBER_BEGIN "private static IntPtr "); - p_output.push_back(method_bind_field + " = Object." ICALL_GET_METHODBIND "(" BINDINGS_NATIVE_NAME_FIELD ", \""); - p_output.push_back(p_imethod.name); - p_output.push_back("\");\n"); + p_output.append(MEMBER_BEGIN "[DebuggerBrowsable(DebuggerBrowsableState.Never)]" MEMBER_BEGIN "private static IntPtr "); + p_output.append(method_bind_field + " = Object." ICALL_GET_METHODBIND "(" BINDINGS_NATIVE_NAME_FIELD ", \""); + p_output.append(p_imethod.name); + p_output.append("\");\n"); } if (p_imethod.method_doc && p_imethod.method_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(p_imethod.method_doc->description), &p_itype); - Vector<String> summary_lines = xml_summary.split("\n"); + Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); - if (summary_lines.size() || default_args_doc.size()) { - p_output.push_back(MEMBER_BEGIN "/// <summary>\n"); + if (summary_lines.size() || default_args_doc.get_string_length()) { + p_output.append(MEMBER_BEGIN "/// <summary>\n"); for (int i = 0; i < summary_lines.size(); i++) { - p_output.push_back(INDENT2 "/// "); - p_output.push_back(summary_lines[i]); - p_output.push_back("\n"); - } - - for (List<String>::Element *E = default_args_doc.front(); E; E = E->next()) { - p_output.push_back(E->get()); + p_output.append(INDENT2 "/// "); + p_output.append(summary_lines[i]); + p_output.append("\n"); } - p_output.push_back(INDENT2 "/// </summary>"); + p_output.append(default_args_doc.as_string()); + p_output.append(INDENT2 "/// </summary>"); } } if (!p_imethod.is_internal) { - p_output.push_back(MEMBER_BEGIN "[GodotMethod(\""); - p_output.push_back(p_imethod.name); - p_output.push_back("\")]"); + p_output.append(MEMBER_BEGIN "[GodotMethod(\""); + p_output.append(p_imethod.name); + p_output.append("\")]"); } - p_output.push_back(MEMBER_BEGIN); - p_output.push_back(p_imethod.is_internal ? "internal " : "public "); + if (p_imethod.is_deprecated) { + if (p_imethod.deprecation_message.empty()) + WARN_PRINTS("An empty deprecation message is discouraged. Method: " + p_imethod.proxy_name); + + p_output.append(MEMBER_BEGIN "[Obsolete(\""); + p_output.append(p_imethod.deprecation_message); + p_output.append("\")]"); + } + + p_output.append(MEMBER_BEGIN); + p_output.append(p_imethod.is_internal ? "internal " : "public "); if (p_itype.is_singleton) { - p_output.push_back("static "); + p_output.append("static "); } else if (p_imethod.is_virtual) { - p_output.push_back("virtual "); + p_output.append("virtual "); } - p_output.push_back(return_type->cs_type + " "); - p_output.push_back(p_imethod.proxy_name + "("); - p_output.push_back(arguments_sig + ")\n" OPEN_BLOCK_L2); + p_output.append(return_type->cs_type + " "); + p_output.append(p_imethod.proxy_name + "("); + p_output.append(arguments_sig + ")\n" OPEN_BLOCK_L2); if (p_imethod.is_virtual) { // Godot virtual method must be overridden, therefore we return a default value by default. if (return_type->cname == name_cache.type_void) { - p_output.push_back("return;\n" CLOSE_BLOCK_L2); + p_output.append("return;\n" CLOSE_BLOCK_L2); } else { - p_output.push_back("return default("); - p_output.push_back(return_type->cs_type); - p_output.push_back(");\n" CLOSE_BLOCK_L2); + p_output.append("return default("); + p_output.append(return_type->cs_type); + p_output.append(");\n" CLOSE_BLOCK_L2); } return OK; // Won't increment method bind count @@ -1670,16 +1684,16 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf if (p_imethod.requires_object_call) { // Fallback to Godot's object.Call(string, params) - p_output.push_back(CS_METHOD_CALL "(\""); - p_output.push_back(p_imethod.name); - p_output.push_back("\""); + p_output.append(CS_METHOD_CALL "(\""); + p_output.append(p_imethod.name); + p_output.append("\""); for (const List<ArgumentInterface>::Element *F = p_imethod.arguments.front(); F; F = F->next()) { - p_output.push_back(", "); - p_output.push_back(F->get().name); + p_output.append(", "); + p_output.append(F->get().name); } - p_output.push_back(");\n" CLOSE_BLOCK_L2); + p_output.append(");\n" CLOSE_BLOCK_L2); return OK; // Won't increment method bind count } @@ -1693,37 +1707,36 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf im_call += "." + im_icall->name + "(" + icall_params + ")"; if (p_imethod.arguments.size()) - p_output.push_back(cs_in_statements); + p_output.append(cs_in_statements); if (return_type->cname == name_cache.type_void) { - p_output.push_back(im_call + ";\n"); + p_output.append(im_call + ";\n"); } else if (return_type->cs_out.empty()) { - p_output.push_back("return " + im_call + ";\n"); + p_output.append("return " + im_call + ";\n"); } else { - p_output.push_back(sformat(return_type->cs_out, im_call, return_type->cs_type, return_type->im_type_out)); - p_output.push_back("\n"); + p_output.append(sformat(return_type->cs_out, im_call, return_type->cs_type, return_type->im_type_out)); + p_output.append("\n"); } - p_output.push_back(CLOSE_BLOCK_L2); + p_output.append(CLOSE_BLOCK_L2); } p_method_bind_count++; + return OK; } Error BindingsGenerator::generate_glue(const String &p_output_dir) { - verbose_output = true; - bool dir_exists = DirAccess::exists(p_output_dir); ERR_EXPLAIN("The output directory does not exist."); ERR_FAIL_COND_V(!dir_exists, ERR_FILE_BAD_PATH); - List<String> output; + StringBuilder output; - output.push_back("/* THIS FILE IS GENERATED DO NOT EDIT */\n"); - output.push_back("#include \"" GLUE_HEADER_FILE "\"\n"); - output.push_back("\n#ifdef MONO_GLUE_ENABLED\n"); + output.append("/* THIS FILE IS GENERATED DO NOT EDIT */\n"); + output.append("#include \"" GLUE_HEADER_FILE "\"\n"); + output.append("\n#ifdef MONO_GLUE_ENABLED\n"); generated_icall_funcs.clear(); @@ -1763,11 +1776,11 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { if (!find_icall_by_name(singleton_icall.name, custom_icalls)) custom_icalls.push_back(singleton_icall); - output.push_back("Object* "); - output.push_back(singleton_icall_name); - output.push_back("() " OPEN_BLOCK "\treturn Engine::get_singleton()->get_singleton_object(\""); - output.push_back(itype.proxy_name); - output.push_back("\");\n" CLOSE_BLOCK "\n"); + output.append("Object* "); + output.append(singleton_icall_name); + output.append("() " OPEN_BLOCK "\treturn Engine::get_singleton()->get_singleton_object(\""); + output.append(itype.proxy_name); + output.append("\");\n" CLOSE_BLOCK "\n"); } if (is_derived_type && itype.is_instantiable) { @@ -1776,43 +1789,43 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { if (!find_icall_by_name(ctor_icall.name, custom_icalls)) custom_icalls.push_back(ctor_icall); - output.push_back("Object* "); - output.push_back(ctor_method); - output.push_back("(MonoObject* obj) " OPEN_BLOCK - "\t" C_MACRO_OBJECT_CONSTRUCT "(instance, \""); - output.push_back(itype.name); - output.push_back("\");\n" - "\t" C_METHOD_TIE_MANAGED_TO_UNMANAGED "(obj, instance);\n" - "\treturn instance;\n" CLOSE_BLOCK "\n"); + output.append("Object* "); + output.append(ctor_method); + output.append("(MonoObject* obj) " OPEN_BLOCK + "\t" C_MACRO_OBJECT_CONSTRUCT "(instance, \""); + output.append(itype.name); + output.append("\");\n" + "\t" C_METHOD_TIE_MANAGED_TO_UNMANAGED "(obj, instance);\n" + "\treturn instance;\n" CLOSE_BLOCK "\n"); } } - output.push_back("namespace GodotSharpBindings\n" OPEN_BLOCK "\n"); + output.append("namespace GodotSharpBindings\n" OPEN_BLOCK "\n"); - output.push_back("uint64_t get_core_api_hash() { return "); - output.push_back(String::num_uint64(GDMono::get_singleton()->get_api_core_hash()) + "U; }\n"); + output.append("uint64_t get_core_api_hash() { return "); + output.append(String::num_uint64(GDMono::get_singleton()->get_api_core_hash()) + "U; }\n"); - output.push_back("#ifdef TOOLS_ENABLED\n" - "uint64_t get_editor_api_hash() { return "); - output.push_back(String::num_uint64(GDMono::get_singleton()->get_api_editor_hash()) + "U; }\n"); - output.push_back("#endif // TOOLS_ENABLED\n"); + output.append("#ifdef TOOLS_ENABLED\n" + "uint64_t get_editor_api_hash() { return "); + output.append(String::num_uint64(GDMono::get_singleton()->get_api_editor_hash()) + "U; }\n"); + output.append("#endif // TOOLS_ENABLED\n"); - output.push_back("uint32_t get_bindings_version() { return "); - output.push_back(String::num_uint64(BINDINGS_GENERATOR_VERSION) + "; }\n"); + output.append("uint32_t get_bindings_version() { return "); + output.append(String::num_uint64(BINDINGS_GENERATOR_VERSION) + "; }\n"); - output.push_back("\nvoid register_generated_icalls() " OPEN_BLOCK); - output.push_back("\tgodot_register_glue_header_icalls();\n"); + output.append("\nvoid register_generated_icalls() " OPEN_BLOCK); + output.append("\tgodot_register_glue_header_icalls();\n"); -#define ADD_INTERNAL_CALL_REGISTRATION(m_icall) \ - { \ - output.push_back("\tmono_add_internal_call("); \ - output.push_back("\"" BINDINGS_NAMESPACE "."); \ - output.push_back(m_icall.editor_only ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); \ - output.push_back("::"); \ - output.push_back(m_icall.name); \ - output.push_back("\", (void*)"); \ - output.push_back(m_icall.name); \ - output.push_back(");\n"); \ +#define ADD_INTERNAL_CALL_REGISTRATION(m_icall) \ + { \ + output.append("\tmono_add_internal_call("); \ + output.append("\"" BINDINGS_NAMESPACE "."); \ + output.append(m_icall.editor_only ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS); \ + output.append("::"); \ + output.append(m_icall.name); \ + output.append("\", (void*)"); \ + output.append(m_icall.name); \ + output.append(");\n"); \ } bool tools_sequence = false; @@ -1821,11 +1834,11 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { if (tools_sequence) { if (!E->get().editor_only) { tools_sequence = false; - output.push_back("#endif\n"); + output.append("#endif\n"); } } else { if (E->get().editor_only) { - output.push_back("#ifdef TOOLS_ENABLED\n"); + output.append("#ifdef TOOLS_ENABLED\n"); tools_sequence = true; } } @@ -1835,23 +1848,23 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { if (tools_sequence) { tools_sequence = false; - output.push_back("#endif\n"); + output.append("#endif\n"); } - output.push_back("#ifdef TOOLS_ENABLED\n"); + output.append("#ifdef TOOLS_ENABLED\n"); for (const List<InternalCall>::Element *E = editor_custom_icalls.front(); E; E = E->next()) ADD_INTERNAL_CALL_REGISTRATION(E->get()); - output.push_back("#endif // TOOLS_ENABLED\n"); + output.append("#endif // TOOLS_ENABLED\n"); for (const List<InternalCall>::Element *E = method_icalls.front(); E; E = E->next()) { if (tools_sequence) { if (!E->get().editor_only) { tools_sequence = false; - output.push_back("#endif\n"); + output.append("#endif\n"); } } else { if (E->get().editor_only) { - output.push_back("#ifdef TOOLS_ENABLED\n"); + output.append("#ifdef TOOLS_ENABLED\n"); tools_sequence = true; } } @@ -1861,14 +1874,14 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { if (tools_sequence) { tools_sequence = false; - output.push_back("#endif\n"); + output.append("#endif\n"); } #undef ADD_INTERNAL_CALL_REGISTRATION - output.push_back(CLOSE_BLOCK "\n} // namespace GodotSharpBindings\n"); + output.append(CLOSE_BLOCK "\n} // namespace GodotSharpBindings\n"); - output.push_back("\n#endif // MONO_GLUE_ENABLED\n"); + output.append("\n#endif // MONO_GLUE_ENABLED\n"); Error save_err = _save_file(path_join(p_output_dir, "mono_glue.gen.cpp"), output); if (save_err != OK) @@ -1883,23 +1896,20 @@ uint32_t BindingsGenerator::get_version() { return BINDINGS_GENERATOR_VERSION; } -Error BindingsGenerator::_save_file(const String &p_path, const List<String> &p_content) { +Error BindingsGenerator::_save_file(const String &p_path, const StringBuilder &p_content) { FileAccessRef file = FileAccess::open(p_path, FileAccess::WRITE); ERR_EXPLAIN("Cannot open file: " + p_path); ERR_FAIL_COND_V(!file, ERR_FILE_CANT_WRITE); - for (const List<String>::Element *E = p_content.front(); E; E = E->next()) { - file->store_string(E->get()); - } - + file->store_string(p_content.as_string()); file->close(); return OK; } -Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInterface &p_itype, const BindingsGenerator::MethodInterface &p_imethod, List<String> &p_output) { +Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInterface &p_itype, const BindingsGenerator::MethodInterface &p_imethod, StringBuilder &p_output) { if (p_imethod.is_virtual) return OK; // Ignore @@ -1955,15 +1965,15 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte generated_icall_funcs.push_back(im_icall); if (im_icall->editor_only) - p_output.push_back("#ifdef TOOLS_ENABLED\n"); + p_output.append("#ifdef TOOLS_ENABLED\n"); // Generate icall function - p_output.push_back(ret_void ? "void " : return_type->c_type_out + " "); - p_output.push_back(icall_method); - p_output.push_back("("); - p_output.push_back(c_func_sig); - p_output.push_back(") " OPEN_BLOCK); + p_output.append(ret_void ? "void " : return_type->c_type_out + " "); + p_output.append(icall_method); + p_output.append("("); + p_output.append(c_func_sig); + p_output.append(") " OPEN_BLOCK); String fail_ret = ret_void ? "" : ", " + (return_type->c_type_out.ends_with("*") ? "NULL" : return_type->c_type_out + "()"); @@ -1977,7 +1987,7 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte // the Variant alive until the method returns. Otherwise, if the returned Variant holds a RefPtr, // it could be deleted too early. This is the case with GDScript.new() which returns OBJECT. // Alternatively, we could just return Variant, but that would result in a worse API. - p_output.push_back("\tVariant " C_LOCAL_VARARG_RET ";\n"); + p_output.append("\tVariant " C_LOCAL_VARARG_RET ";\n"); } if (return_type->is_object_type) { @@ -1987,83 +1997,82 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte ptrcall_return_type = return_type->c_type; } - p_output.push_back("\t" + ptrcall_return_type); - p_output.push_back(" " C_LOCAL_RET); - p_output.push_back(initialization + ";\n"); - p_output.push_back("\tERR_FAIL_NULL_V(" CS_PARAM_INSTANCE); - p_output.push_back(fail_ret); - p_output.push_back(");\n"); + p_output.append("\t" + ptrcall_return_type); + p_output.append(" " C_LOCAL_RET); + p_output.append(initialization + ";\n"); + p_output.append("\tERR_FAIL_NULL_V(" CS_PARAM_INSTANCE); + p_output.append(fail_ret); + p_output.append(");\n"); } else { - p_output.push_back("\tERR_FAIL_NULL(" CS_PARAM_INSTANCE ");\n"); + p_output.append("\tERR_FAIL_NULL(" CS_PARAM_INSTANCE ");\n"); } if (p_imethod.arguments.size()) { if (p_imethod.is_vararg) { - String err_fail_macro = ret_void ? "ERR_FAIL_COND" : "ERR_FAIL_COND_V"; String vararg_arg = "arg" + argc_str; String real_argc_str = itos(p_imethod.arguments.size() - 1); // Arguments count without vararg - p_output.push_back("\tint vararg_length = mono_array_length("); - p_output.push_back(vararg_arg); - p_output.push_back(");\n\tint total_length = "); - p_output.push_back(real_argc_str); - p_output.push_back(" + vararg_length;\n" - "\tArgumentsVector<Variant> varargs(vararg_length);\n" - "\tArgumentsVector<const Variant *> " C_LOCAL_PTRCALL_ARGS "(total_length);\n"); - p_output.push_back(c_in_statements); - p_output.push_back("\tfor (int i = 0; i < vararg_length; i++) " OPEN_BLOCK - "\t\tMonoObject* elem = mono_array_get("); - p_output.push_back(vararg_arg); - p_output.push_back(", MonoObject*, i);\n" - "\t\tvarargs.set(i, GDMonoMarshal::mono_object_to_variant(elem));\n" - "\t\t" C_LOCAL_PTRCALL_ARGS ".set("); - p_output.push_back(real_argc_str); - p_output.push_back(" + i, &varargs.get(i));\n\t" CLOSE_BLOCK); + p_output.append("\tint vararg_length = mono_array_length("); + p_output.append(vararg_arg); + p_output.append(");\n\tint total_length = "); + p_output.append(real_argc_str); + p_output.append(" + vararg_length;\n" + "\tArgumentsVector<Variant> varargs(vararg_length);\n" + "\tArgumentsVector<const Variant *> " C_LOCAL_PTRCALL_ARGS "(total_length);\n"); + p_output.append(c_in_statements); + p_output.append("\tfor (int i = 0; i < vararg_length; i++) " OPEN_BLOCK + "\t\tMonoObject* elem = mono_array_get("); + p_output.append(vararg_arg); + p_output.append(", MonoObject*, i);\n" + "\t\tvarargs.set(i, GDMonoMarshal::mono_object_to_variant(elem));\n" + "\t\t" C_LOCAL_PTRCALL_ARGS ".set("); + p_output.append(real_argc_str); + p_output.append(" + i, &varargs.get(i));\n\t" CLOSE_BLOCK); } else { - p_output.push_back(c_in_statements); - p_output.push_back("\tconst void* " C_LOCAL_PTRCALL_ARGS "["); - p_output.push_back(argc_str + "] = { "); - p_output.push_back(c_args_var_content + " };\n"); + p_output.append(c_in_statements); + p_output.append("\tconst void* " C_LOCAL_PTRCALL_ARGS "["); + p_output.append(argc_str + "] = { "); + p_output.append(c_args_var_content + " };\n"); } } if (p_imethod.is_vararg) { - p_output.push_back("\tVariant::CallError vcall_error;\n\t"); + p_output.append("\tVariant::CallError vcall_error;\n\t"); if (!ret_void) { // See the comment on the C_LOCAL_VARARG_RET declaration if (return_type->cname != name_cache.type_Variant) { - p_output.push_back(C_LOCAL_VARARG_RET " = "); + p_output.append(C_LOCAL_VARARG_RET " = "); } else { - p_output.push_back(C_LOCAL_RET " = "); + p_output.append(C_LOCAL_RET " = "); } } - p_output.push_back(CS_PARAM_METHODBIND "->call(" CS_PARAM_INSTANCE ", "); - p_output.push_back(p_imethod.arguments.size() ? C_LOCAL_PTRCALL_ARGS ".ptr()" : "NULL"); - p_output.push_back(", total_length, vcall_error);\n"); + p_output.append(CS_PARAM_METHODBIND "->call(" CS_PARAM_INSTANCE ", "); + p_output.append(p_imethod.arguments.size() ? C_LOCAL_PTRCALL_ARGS ".ptr()" : "NULL"); + p_output.append(", total_length, vcall_error);\n"); // See the comment on the C_LOCAL_VARARG_RET declaration if (return_type->cname != name_cache.type_Variant) { - p_output.push_back("\t" C_LOCAL_RET " = " C_LOCAL_VARARG_RET ";\n"); + p_output.append("\t" C_LOCAL_RET " = " C_LOCAL_VARARG_RET ";\n"); } } else { - p_output.push_back("\t" CS_PARAM_METHODBIND "->ptrcall(" CS_PARAM_INSTANCE ", "); - p_output.push_back(p_imethod.arguments.size() ? C_LOCAL_PTRCALL_ARGS ", " : "NULL, "); - p_output.push_back(!ret_void ? "&" C_LOCAL_RET ");\n" : "NULL);\n"); + p_output.append("\t" CS_PARAM_METHODBIND "->ptrcall(" CS_PARAM_INSTANCE ", "); + p_output.append(p_imethod.arguments.size() ? C_LOCAL_PTRCALL_ARGS ", " : "NULL, "); + p_output.append(!ret_void ? "&" C_LOCAL_RET ");\n" : "NULL);\n"); } if (!ret_void) { if (return_type->c_out.empty()) - p_output.push_back("\treturn " C_LOCAL_RET ";\n"); + p_output.append("\treturn " C_LOCAL_RET ";\n"); else - p_output.push_back(sformat(return_type->c_out, return_type->c_type_out, C_LOCAL_RET, return_type->name)); + p_output.append(sformat(return_type->c_out, return_type->c_type_out, C_LOCAL_RET, return_type->name)); } - p_output.push_back(CLOSE_BLOCK "\n"); + p_output.append(CLOSE_BLOCK "\n"); if (im_icall->editor_only) - p_output.push_back("#endif // TOOLS_ENABLED\n"); + p_output.append("#endif // TOOLS_ENABLED\n"); } return OK; @@ -2116,6 +2125,58 @@ const BindingsGenerator::TypeInterface *BindingsGenerator::_get_type_or_placehol return &placeholder_types.insert(placeholder.cname, placeholder)->get(); } +StringName BindingsGenerator::_get_int_type_name_from_meta(GodotTypeInfo::Metadata p_meta) { + + switch (p_meta) { + case GodotTypeInfo::METADATA_INT_IS_INT8: + return "sbyte"; + break; + case GodotTypeInfo::METADATA_INT_IS_INT16: + return "short"; + break; + case GodotTypeInfo::METADATA_INT_IS_INT32: + return "int"; + break; + case GodotTypeInfo::METADATA_INT_IS_INT64: + return "long"; + break; + case GodotTypeInfo::METADATA_INT_IS_UINT8: + return "byte"; + break; + case GodotTypeInfo::METADATA_INT_IS_UINT16: + return "ushort"; + break; + case GodotTypeInfo::METADATA_INT_IS_UINT32: + return "uint"; + break; + case GodotTypeInfo::METADATA_INT_IS_UINT64: + return "ulong"; + break; + default: + // Assume INT32 + return "int"; + } +} + +StringName BindingsGenerator::_get_float_type_name_from_meta(GodotTypeInfo::Metadata p_meta) { + + switch (p_meta) { + case GodotTypeInfo::METADATA_REAL_IS_FLOAT: + return "float"; + break; + case GodotTypeInfo::METADATA_REAL_IS_DOUBLE: + return "double"; + break; + default: + // Assume real_t (float or double depending of REAL_T_IS_DOUBLE) +#ifdef REAL_T_IS_DOUBLE + return "double"; +#else + return "float"; +#endif + } +} + void BindingsGenerator::_populate_object_type_interfaces() { obj_types.clear(); @@ -2135,15 +2196,13 @@ void BindingsGenerator::_populate_object_type_interfaces() { } if (!ClassDB::is_class_exposed(type_cname)) { - if (verbose_output) - WARN_PRINTS("Ignoring type " + type_cname.operator String() + " because it's not exposed"); + _log("Ignoring type `%s` because it's not exposed\n", String(type_cname).utf8().get_data()); class_list.pop_front(); continue; } if (!ClassDB::is_class_enabled(type_cname)) { - if (verbose_output) - WARN_PRINTS("Ignoring type " + type_cname.operator String() + " because it's not enabled"); + _log("Ignoring type `%s` because it's not enabled\n", String(type_cname).utf8().get_data()); class_list.pop_front(); continue; } @@ -2171,10 +2230,12 @@ void BindingsGenerator::_populate_object_type_interfaces() { itype.im_type_in = "IntPtr"; itype.im_type_out = itype.proxy_name; + // Populate properties + List<PropertyInfo> property_list; ClassDB::get_property_list(type_cname, &property_list, true); - // Populate properties + Map<StringName, StringName> accessor_methods; for (const List<PropertyInfo>::Element *E = property_list.front(); E; E = E->next()) { const PropertyInfo &property = E->get(); @@ -2187,18 +2248,21 @@ void BindingsGenerator::_populate_object_type_interfaces() { iprop.setter = ClassDB::get_property_setter(type_cname, iprop.cname); iprop.getter = ClassDB::get_property_getter(type_cname, iprop.cname); + if (iprop.setter != StringName()) + accessor_methods[iprop.setter] = iprop.cname; + if (iprop.getter != StringName()) + accessor_methods[iprop.getter] = iprop.cname; + bool valid = false; iprop.index = ClassDB::get_property_index(type_cname, iprop.cname, &valid); ERR_FAIL_COND(!valid); iprop.proxy_name = escape_csharp_keyword(snake_to_pascal_case(iprop.cname)); - // Prevent property and enclosing type from sharing the same name + // Prevent the property and its enclosing type from sharing the same name if (iprop.proxy_name == itype.proxy_name) { - if (verbose_output) { - WARN_PRINTS("Name of property `" + iprop.proxy_name + "` is ambiguous with the name of its class `" + - itype.proxy_name + "`. Renaming property to `" + iprop.proxy_name + "_`"); - } + _log("Name of property `%s` is ambiguous with the name of its enclosing class `%s`. Renaming property to `%s_`\n", + iprop.proxy_name.utf8().get_data(), itype.proxy_name.utf8().get_data(), iprop.proxy_name.utf8().get_data()); iprop.proxy_name += "_"; } @@ -2265,14 +2329,13 @@ void BindingsGenerator::_populate_object_type_interfaces() { // which could actually will return something different. // Let's put this to notify us if that ever happens. if (itype.cname != name_cache.type_Object || imethod.name != "free") { - if (verbose_output) { - WARN_PRINTS("Notification: New unexpected virtual non-overridable method found.\n" - "We only expected Object.free, but found " + - itype.name + "." + imethod.name); - } + ERR_PRINTS("Notification: New unexpected virtual non-overridable method found.\n" + "We only expected Object.free, but found " + + itype.name + "." + imethod.name); } } else { - ERR_PRINTS("Missing MethodBind for non-virtual method: " + itype.name + "." + imethod.name); + ERR_EXPLAIN("Missing MethodBind for non-virtual method: " + itype.name + "." + imethod.name); + ERR_FAIL(); } } else if (return_info.type == Variant::INT && return_info.usage & PROPERTY_USAGE_CLASS_IS_ENUM) { imethod.return_type.cname = return_info.class_name; @@ -2286,7 +2349,13 @@ void BindingsGenerator::_populate_object_type_interfaces() { } else if (return_info.type == Variant::NIL) { imethod.return_type.cname = name_cache.type_void; } else { - imethod.return_type.cname = Variant::get_type_name(return_info.type); + if (return_info.type == Variant::INT) { + imethod.return_type.cname = _get_int_type_name_from_meta(m ? m->get_argument_meta(-1) : GodotTypeInfo::METADATA_NONE); + } else if (return_info.type == Variant::REAL) { + imethod.return_type.cname = _get_float_type_name_from_meta(m ? m->get_argument_meta(-1) : GodotTypeInfo::METADATA_NONE); + } else { + imethod.return_type.cname = Variant::get_type_name(return_info.type); + } } for (int i = 0; i < argc; i++) { @@ -2305,7 +2374,13 @@ void BindingsGenerator::_populate_object_type_interfaces() { } else if (arginfo.type == Variant::NIL) { iarg.type.cname = name_cache.type_Variant; } else { - iarg.type.cname = Variant::get_type_name(arginfo.type); + if (arginfo.type == Variant::INT) { + iarg.type.cname = _get_int_type_name_from_meta(m ? m->get_argument_meta(i) : GodotTypeInfo::METADATA_NONE); + } else if (arginfo.type == Variant::REAL) { + iarg.type.cname = _get_float_type_name_from_meta(m ? m->get_argument_meta(i) : GodotTypeInfo::METADATA_NONE); + } else { + iarg.type.cname = Variant::get_type_name(arginfo.type); + } } iarg.name = escape_csharp_keyword(snake_to_camel_case(iarg.name)); @@ -2326,16 +2401,24 @@ void BindingsGenerator::_populate_object_type_interfaces() { imethod.proxy_name = escape_csharp_keyword(snake_to_pascal_case(imethod.name)); - // Prevent naming the property and its enclosing type from sharing the same name + // Prevent the method and its enclosing type from sharing the same name if (imethod.proxy_name == itype.proxy_name) { - if (verbose_output) { - WARN_PRINTS("Name of method `" + imethod.proxy_name + "` is ambiguous with the name of its class `" + - itype.proxy_name + "`. Renaming method to `" + imethod.proxy_name + "_`"); - } + _log("Name of method `%s` is ambiguous with the name of its enclosing class `%s`. Renaming method to `%s_`\n", + imethod.proxy_name.utf8().get_data(), itype.proxy_name.utf8().get_data(), imethod.proxy_name.utf8().get_data()); imethod.proxy_name += "_"; } + Map<StringName, StringName>::Element *accessor = accessor_methods.find(imethod.cname); + if (accessor) { + const PropertyInterface *accessor_property = itype.find_property_by_name(accessor->value()); + + // We only deprecate an accessor method if it's in the same class as the property. It's easier this way, but also + // we don't know if an accessor method in a different class could have other purposes, so better leave those untouched. + imethod.is_deprecated = true; + imethod.deprecation_message = imethod.proxy_name + " is deprecated. Use the " + accessor_property->proxy_name + " property instead."; + } + if (itype.class_doc) { for (int i = 0; i < itype.class_doc->methods.size(); i++) { if (itype.class_doc->methods[i].name == imethod.name) { @@ -2362,8 +2445,8 @@ void BindingsGenerator::_populate_object_type_interfaces() { // Populate enums and constants - List<String> constant_list; - ClassDB::get_integer_constant_list(type_cname, &constant_list, true); + List<String> constants; + ClassDB::get_integer_constant_list(type_cname, &constants, true); const HashMap<StringName, List<StringName> > &enum_map = class_info->enum_map; const StringName *k = NULL; @@ -2378,13 +2461,13 @@ void BindingsGenerator::_populate_object_type_interfaces() { enum_proxy_cname = StringName(enum_proxy_name); } EnumInterface ienum(enum_proxy_cname); - const List<StringName> &constants = enum_map.get(*k); - for (const List<StringName>::Element *E = constants.front(); E; E = E->next()) { + const List<StringName> &enum_constants = enum_map.get(*k); + for (const List<StringName>::Element *E = enum_constants.front(); E; E = E->next()) { const StringName &constant_cname = E->get(); String constant_name = constant_cname.operator String(); int *value = class_info->constant_map.getptr(constant_cname); ERR_FAIL_NULL(value); - constant_list.erase(constant_name); + constants.erase(constant_name); ConstantInterface iconstant(constant_name, snake_to_pascal_case(constant_name, true), *value); @@ -2416,7 +2499,7 @@ void BindingsGenerator::_populate_object_type_interfaces() { enum_types.insert(enum_itype.cname, enum_itype); } - for (const List<String>::Element *E = constant_list.front(); E; E = E->next()) { + for (const List<String>::Element *E = constants.front(); E; E = E->next()) { const String &constant_name = E->get(); int *value = class_info->constant_map.getptr(StringName(E->get())); ERR_FAIL_NULL(value); @@ -2563,7 +2646,6 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { // bool itype = TypeInterface::create_value_type(String("bool")); - { // MonoBoolean <---> bool itype.c_in = "\t%0 %1_in = (%0)%1;\n"; @@ -2577,45 +2659,73 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.im_type_out = itype.name; builtin_types.insert(itype.cname, itype); - // int - // C interface is the same as that of enums. Remember to apply any - // changes done here to TypeInterface::postsetup_enum_type as well - itype = TypeInterface::create_value_type(String("int")); - itype.c_arg_in = "&%s_in"; + // Integer types { - // The expected types for parameters and return value in ptrcall are 'int64_t' or 'uint64_t'. - itype.c_in = "\t%0 %1_in = (%0)%1;\n"; - itype.c_out = "\treturn (%0)%1;\n"; - itype.c_type = "int64_t"; + // C interface for 'uint32_t' is the same as that of enums. Remember to apply + // any of the changes done here to 'TypeInterface::postsetup_enum_type' as well. +#define INSERT_INT_TYPE(m_name, m_c_type_in_out, m_c_type) \ + { \ + itype = TypeInterface::create_value_type(String(m_name)); \ + { \ + itype.c_in = "\t%0 %1_in = (%0)%1;\n"; \ + itype.c_out = "\treturn (%0)%1;\n"; \ + itype.c_type = #m_c_type; \ + itype.c_arg_in = "&%s_in"; \ + } \ + itype.c_type_in = #m_c_type_in_out; \ + itype.c_type_out = itype.c_type_in; \ + itype.im_type_in = itype.name; \ + itype.im_type_out = itype.name; \ + builtin_types.insert(itype.cname, itype); \ } - itype.c_type_in = "int32_t"; - itype.c_type_out = itype.c_type_in; - itype.im_type_in = itype.name; - itype.im_type_out = itype.name; - builtin_types.insert(itype.cname, itype); - // real_t - itype = TypeInterface(); - itype.name = "float"; // The name is always "float" in Variant, even with REAL_T_IS_DOUBLE. - itype.cname = itype.name; -#ifdef REAL_T_IS_DOUBLE - itype.proxy_name = "double"; -#else - itype.proxy_name = "float"; -#endif + // The expected type for all integers in ptrcall is 'int64_t', so that's what we use for 'c_type' + + INSERT_INT_TYPE("sbyte", int8_t, int64_t); + INSERT_INT_TYPE("short", int16_t, int64_t); + INSERT_INT_TYPE("int", int32_t, int64_t); + INSERT_INT_TYPE("long", int64_t, int64_t); + INSERT_INT_TYPE("byte", uint8_t, int64_t); + INSERT_INT_TYPE("ushort", uint16_t, int64_t); + INSERT_INT_TYPE("uint", uint32_t, int64_t); + INSERT_INT_TYPE("ulong", uint64_t, int64_t); + } + + // Floating point types { - // The expected type for parameters and return value in ptrcall is 'double'. - itype.c_in = "\t%0 %1_in = (%0)%1;\n"; - itype.c_out = "\treturn (%0)%1;\n"; + // float + itype = TypeInterface(); + itype.name = "float"; + itype.cname = itype.name; + itype.proxy_name = "float"; + { + // The expected type for 'float' in ptrcall is 'double' + itype.c_in = "\t%0 %1_in = (%0)%1;\n"; + itype.c_out = "\treturn (%0)%1;\n"; + itype.c_type = "double"; + itype.c_type_in = "float"; + itype.c_type_out = "float"; + itype.c_arg_in = "&%s_in"; + } + itype.cs_type = itype.proxy_name; + itype.im_type_in = itype.proxy_name; + itype.im_type_out = itype.proxy_name; + builtin_types.insert(itype.cname, itype); + + // double + itype = TypeInterface(); + itype.name = "double"; + itype.cname = itype.name; + itype.proxy_name = "double"; itype.c_type = "double"; - itype.c_type_in = "real_t"; - itype.c_type_out = "real_t"; - itype.c_arg_in = "&%s_in"; + itype.c_type_in = "double"; + itype.c_type_out = "double"; + itype.c_arg_in = "&%s"; + itype.cs_type = itype.proxy_name; + itype.im_type_in = itype.proxy_name; + itype.im_type_out = itype.proxy_name; + builtin_types.insert(itype.cname, itype); } - itype.cs_type = itype.proxy_name; - itype.im_type_in = itype.proxy_name; - itype.im_type_out = itype.proxy_name; - builtin_types.insert(itype.cname, itype); // String itype = TypeInterface(); @@ -2865,7 +2975,18 @@ void BindingsGenerator::_populate_global_constants() { } } -void BindingsGenerator::initialize() { +void BindingsGenerator::_log(const char *p_format, ...) { + + if (log_print_enabled) { + va_list list; + + va_start(list, p_format); + OS::get_singleton()->print("%s", str_format(p_format, list).utf8().get_data()); + va_end(list); + } +} + +void BindingsGenerator::_initialize() { EditorHelp::generate_doc(); @@ -2888,38 +3009,33 @@ void BindingsGenerator::initialize() { void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args) { const int NUM_OPTIONS = 2; - int options_left = NUM_OPTIONS; - String mono_glue_option = "--generate-mono-glue"; String cs_api_option = "--generate-cs-api"; - verbose_output = true; + String mono_glue_path; + String cs_api_path; + + int options_left = NUM_OPTIONS; const List<String>::Element *elem = p_cmdline_args.front(); while (elem && options_left) { - if (elem->get() == mono_glue_option) { - const List<String>::Element *path_elem = elem->next(); if (path_elem) { - if (get_singleton()->generate_glue(path_elem->get()) != OK) - ERR_PRINTS(mono_glue_option + ": Failed to generate mono glue"); + mono_glue_path = path_elem->get(); elem = elem->next(); } else { ERR_PRINTS(mono_glue_option + ": No output directory specified"); } --options_left; - } else if (elem->get() == cs_api_option) { - const List<String>::Element *path_elem = elem->next(); if (path_elem) { - if (get_singleton()->generate_cs_api(path_elem->get()) != OK) - ERR_PRINTS(cs_api_option + ": Failed to generate the C# API"); + cs_api_path = path_elem->get(); elem = elem->next(); } else { ERR_PRINTS(cs_api_option + ": No output directory specified"); @@ -2931,10 +3047,23 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args) elem = elem->next(); } - verbose_output = false; + if (mono_glue_path.length() || cs_api_path.length()) { + BindingsGenerator bindings_generator; + bindings_generator.set_log_print_enabled(true); + + if (mono_glue_path.length()) { + if (bindings_generator.generate_glue(mono_glue_path) != OK) + ERR_PRINTS(mono_glue_option + ": Failed to generate mono glue"); + } + + if (cs_api_path.length()) { + if (bindings_generator.generate_cs_api(cs_api_path) != OK) + ERR_PRINTS(cs_api_option + ": Failed to generate the C# API"); + } - if (options_left != NUM_OPTIONS) + // Exit once done ::exit(0); + } } #endif diff --git a/modules/mono/editor/bindings_generator.h b/modules/mono/editor/bindings_generator.h index 42071f9c0d..bdba28c267 100644 --- a/modules/mono/editor/bindings_generator.h +++ b/modules/mono/editor/bindings_generator.h @@ -32,6 +32,7 @@ #define BINDINGS_GENERATOR_H #include "core/class_db.h" +#include "core/string_builder.h" #include "dotnet_solution.h" #include "editor/doc/doc_data.h" #include "editor/editor_help.h" @@ -158,17 +159,20 @@ class BindingsGenerator { const DocData::MethodDoc *method_doc; + bool is_deprecated; + String deprecation_message; + void add_argument(const ArgumentInterface &argument) { arguments.push_back(argument); } MethodInterface() { - return_type.cname = BindingsGenerator::get_singleton()->name_cache.type_void; is_vararg = false; is_virtual = false; requires_object_call = false; is_internal = false; method_doc = NULL; + is_deprecated = false; } }; @@ -399,8 +403,8 @@ class BindingsGenerator { } static void postsetup_enum_type(TypeInterface &r_enum_itype) { - // C interface is the same as that of 'int'. Remember to apply any - // changes done here to the 'int' type interface as well + // C interface for enums is the same as that of 'uint32_t'. Remember to apply + // any of the changes done here to the 'uint32_t' type interface as well. r_enum_itype.c_arg_in = "&%s_in"; { @@ -468,7 +472,7 @@ class BindingsGenerator { } }; - static bool verbose_output; + bool log_print_enabled; OrderedHashMap<StringName, TypeInterface> obj_types; @@ -489,7 +493,6 @@ class BindingsGenerator { struct NameCache { StringName type_void; - StringName type_int; StringName type_Array; StringName type_Dictionary; StringName type_Variant; @@ -500,9 +503,19 @@ class BindingsGenerator { StringName type_at_GlobalScope; StringName enum_Error; + StringName type_sbyte; + StringName type_short; + StringName type_int; + StringName type_long; + StringName type_byte; + StringName type_ushort; + StringName type_uint; + StringName type_ulong; + StringName type_float; + StringName type_double; + NameCache() { type_void = StaticCString::create("void"); - type_int = StaticCString::create("int"); type_Array = StaticCString::create("Array"); type_Dictionary = StaticCString::create("Dictionary"); type_Variant = StaticCString::create("Variant"); @@ -512,8 +525,20 @@ class BindingsGenerator { type_String = StaticCString::create("String"); type_at_GlobalScope = StaticCString::create("@GlobalScope"); enum_Error = StaticCString::create("Error"); + + type_sbyte = StaticCString::create("sbyte"); + type_short = StaticCString::create("short"); + type_int = StaticCString::create("int"); + type_long = StaticCString::create("long"); + type_byte = StaticCString::create("byte"); + type_ushort = StaticCString::create("ushort"); + type_uint = StaticCString::create("uint"); + type_ulong = StaticCString::create("ulong"); + type_float = StaticCString::create("float"); + type_double = StaticCString::create("double"); } + private: NameCache(const NameCache &); NameCache &operator=(const NameCache &); }; @@ -559,6 +584,9 @@ class BindingsGenerator { const TypeInterface *_get_type_or_null(const TypeReference &p_typeref); const TypeInterface *_get_type_or_placeholder(const TypeReference &p_typeref); + StringName _get_int_type_name_from_meta(GodotTypeInfo::Metadata p_meta); + StringName _get_float_type_name_from_meta(GodotTypeInfo::Metadata p_meta); + void _default_argument_from_variant(const Variant &p_val, ArgumentInterface &r_iarg); void _populate_object_type_interfaces(); @@ -568,42 +596,35 @@ class BindingsGenerator { Error _generate_cs_type(const TypeInterface &itype, const String &p_output_file); - Error _generate_cs_property(const TypeInterface &p_itype, const PropertyInterface &p_iprop, List<String> &p_output); - Error _generate_cs_method(const TypeInterface &p_itype, const MethodInterface &p_imethod, int &p_method_bind_count, List<String> &p_output); - - void _generate_global_constants(List<String> &p_output); + Error _generate_cs_property(const TypeInterface &p_itype, const PropertyInterface &p_iprop, StringBuilder &p_output); + Error _generate_cs_method(const TypeInterface &p_itype, const MethodInterface &p_imethod, int &p_method_bind_count, StringBuilder &p_output); - Error _generate_glue_method(const TypeInterface &p_itype, const MethodInterface &p_imethod, List<String> &p_output); + void _generate_global_constants(StringBuilder &p_output); - Error _save_file(const String &p_path, const List<String> &p_content); + Error _generate_glue_method(const TypeInterface &p_itype, const MethodInterface &p_imethod, StringBuilder &p_output); - BindingsGenerator() {} + Error _save_file(const String &p_path, const StringBuilder &p_content); - BindingsGenerator(const BindingsGenerator &); - BindingsGenerator &operator=(const BindingsGenerator &); + void _log(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; - friend class CSharpLanguage; - static BindingsGenerator *singleton; + void _initialize(); public: - Error generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output = true); - Error generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output = true); - Error generate_cs_api(const String &p_output_dir, bool p_verbose_output = true); + Error generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution); + Error generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution); + Error generate_cs_api(const String &p_output_dir); Error generate_glue(const String &p_output_dir); + void set_log_print_enabled(bool p_enabled) { log_print_enabled = p_enabled; } + static uint32_t get_version(); - void initialize(); + static void handle_cmdline_args(const List<String> &p_cmdline_args); - _FORCE_INLINE_ static BindingsGenerator *get_singleton() { - if (!singleton) { - singleton = memnew(BindingsGenerator); - singleton->initialize(); - } - return singleton; + BindingsGenerator() : + log_print_enabled(true) { + _initialize(); } - - static void handle_cmdline_args(const List<String> &p_cmdline_args); }; #endif diff --git a/modules/mono/editor/csharp_project.cpp b/modules/mono/editor/csharp_project.cpp index beeff51bc2..fe79286556 100644 --- a/modules/mono/editor/csharp_project.cpp +++ b/modules/mono/editor/csharp_project.cpp @@ -158,7 +158,7 @@ Error generate_scripts_metadata(const String &p_project_path, const String &p_ou PoolStringArray project_files = GDMonoMarshal::mono_array_to_PoolStringArray(ret); PoolStringArray::Read r = project_files.read(); - Dictionary old_dict = CSharpLanguage::get_singleton()->get_scripts_metadata(); + Dictionary old_dict = CSharpLanguage::get_singleton()->get_scripts_metadata_or_nothing(); Dictionary new_dict; for (int i = 0; i < project_files.size(); i++) { diff --git a/modules/mono/editor/godotsharp_builds.cpp b/modules/mono/editor/godotsharp_builds.cpp index 00c780d1b7..de3fd91223 100644 --- a/modules/mono/editor/godotsharp_builds.cpp +++ b/modules/mono/editor/godotsharp_builds.cpp @@ -323,10 +323,13 @@ bool GodotSharpBuilds::make_api_assembly(APIAssembly::Type p_api_type) { String api_sln_file = api_sln_dir.plus_file(API_SOLUTION_NAME ".sln"); if (!DirAccess::exists(api_sln_dir) || !FileAccess::exists(api_sln_file)) { - BindingsGenerator *gen = BindingsGenerator::get_singleton(); - bool gen_verbose = OS::get_singleton()->is_stdout_verbose(); + BindingsGenerator bindings_generator; - Error err = gen->generate_cs_api(api_sln_dir, gen_verbose); + if (!OS::get_singleton()->is_stdout_verbose()) { + bindings_generator.set_log_print_enabled(false); + } + + Error err = bindings_generator.generate_cs_api(api_sln_dir); if (err != OK) { show_build_error_dialog("Failed to generate " API_SOLUTION_NAME " solution. Error: " + itos(err)); return false; diff --git a/modules/mono/glue/Managed/Files/Color.cs b/modules/mono/glue/Managed/Files/Color.cs index 88fa3323c2..84ff19fc54 100644 --- a/modules/mono/glue/Managed/Files/Color.cs +++ b/modules/mono/glue/Managed/Files/Color.cs @@ -168,7 +168,7 @@ namespace Godot int max = Mathf.Max(color.r8, Mathf.Max(color.g8, color.b8)); int min = Mathf.Min(color.r8, Mathf.Min(color.g8, color.b8)); - float delta = max - min; + int delta = max - min; if (delta == 0) { @@ -591,11 +591,11 @@ namespace Godot public static bool operator <(Color left, Color right) { - if (left.r == right.r) + if (Mathf.IsEqualApprox(left.r, right.r)) { - if (left.g == right.g) + if (Mathf.IsEqualApprox(left.g, right.g)) { - if (left.b == right.b) + if (Mathf.IsEqualApprox(left.b, right.b)) return left.a < right.a; return left.b < right.b; } @@ -608,11 +608,11 @@ namespace Godot public static bool operator >(Color left, Color right) { - if (left.r == right.r) + if (Mathf.IsEqualApprox(left.r, right.r)) { - if (left.g == right.g) + if (Mathf.IsEqualApprox(left.g, right.g)) { - if (left.b == right.b) + if (Mathf.IsEqualApprox(left.b, right.b)) return left.a > right.a; return left.b > right.b; } @@ -635,7 +635,7 @@ namespace Godot public bool Equals(Color other) { - return r == other.r && g == other.g && b == other.b && a == other.a; + return Mathf.IsEqualApprox(r, other.r) && Mathf.IsEqualApprox(g, other.g) && Mathf.IsEqualApprox(b, other.b) && Mathf.IsEqualApprox(a, other.a); } public override int GetHashCode() diff --git a/modules/mono/glue/Managed/Files/GD.cs b/modules/mono/glue/Managed/Files/GD.cs index 5b591646ea..2068099ac6 100644 --- a/modules/mono/glue/Managed/Files/GD.cs +++ b/modules/mono/glue/Managed/Files/GD.cs @@ -111,7 +111,7 @@ namespace Godot godot_icall_GD_printt(Array.ConvertAll(what, x => x.ToString())); } - public static double Randf() + public static float Randf() { return godot_icall_GD_randf(); } @@ -224,7 +224,7 @@ namespace Godot internal extern static void godot_icall_GD_printt(object[] what); [MethodImpl(MethodImplOptions.InternalCall)] - internal extern static double godot_icall_GD_randf(); + internal extern static float godot_icall_GD_randf(); [MethodImpl(MethodImplOptions.InternalCall)] internal extern static uint godot_icall_GD_randi(); @@ -232,6 +232,7 @@ namespace Godot [MethodImpl(MethodImplOptions.InternalCall)] internal extern static void godot_icall_GD_randomize(); + [MethodImpl(MethodImplOptions.InternalCall)] internal extern static double godot_icall_GD_rand_range(double from, double to); diff --git a/modules/mono/glue/Managed/Files/Mathf.cs b/modules/mono/glue/Managed/Files/Mathf.cs index a064278237..947fbb6665 100644 --- a/modules/mono/glue/Managed/Files/Mathf.cs +++ b/modules/mono/glue/Managed/Files/Mathf.cs @@ -143,6 +143,15 @@ namespace Godot return (weight - from) / (to - from); } + public static bool IsEqualApprox(real_t a, real_t b) + { + real_t tolerance = Epsilon * Abs(a); + if (tolerance < Epsilon) { + tolerance = Epsilon; + } + return Abs(a - b) < tolerance; + } + public static bool IsInf(real_t s) { return real_t.IsInfinity(s); @@ -153,6 +162,11 @@ namespace Godot return real_t.IsNaN(s); } + public static bool IsZeroApprox(real_t s) + { + return Abs(s) < Epsilon; + } + public static real_t Lerp(real_t from, real_t to, real_t weight) { return from + (to - from) * weight; diff --git a/modules/mono/glue/Managed/Files/MathfEx.cs b/modules/mono/glue/Managed/Files/MathfEx.cs index 414762f7b1..d6eb65b097 100644 --- a/modules/mono/glue/Managed/Files/MathfEx.cs +++ b/modules/mono/glue/Managed/Files/MathfEx.cs @@ -36,9 +36,9 @@ namespace Godot return (int)Math.Round(s); } - public static bool IsEqualApprox(real_t a, real_t b, real_t ratio = Mathf.Epsilon) + public static bool IsEqualApprox(real_t a, real_t b, real_t tolerance) { - return Abs(a - b) < ratio; + return Abs(a - b) < tolerance; } } }
\ No newline at end of file diff --git a/modules/mono/glue/Managed/Files/Plane.cs b/modules/mono/glue/Managed/Files/Plane.cs index f11cd490a9..e16d4315be 100644 --- a/modules/mono/glue/Managed/Files/Plane.cs +++ b/modules/mono/glue/Managed/Files/Plane.cs @@ -200,7 +200,7 @@ namespace Godot public bool Equals(Plane other) { - return _normal == other._normal && D == other.D; + return _normal == other._normal && Mathf.IsEqualApprox(D, other.D); } public override int GetHashCode() diff --git a/modules/mono/glue/Managed/Files/Quat.cs b/modules/mono/glue/Managed/Files/Quat.cs index d0c15146a5..0d4349084a 100644 --- a/modules/mono/glue/Managed/Files/Quat.cs +++ b/modules/mono/glue/Managed/Files/Quat.cs @@ -358,7 +358,7 @@ namespace Godot public bool Equals(Quat other) { - return x == other.x && y == other.y && z == other.z && w == other.w; + return Mathf.IsEqualApprox(x, other.x) && Mathf.IsEqualApprox(y, other.y) && Mathf.IsEqualApprox(z, other.z) && Mathf.IsEqualApprox(w, other.w); } public override int GetHashCode() diff --git a/modules/mono/glue/Managed/Files/Vector2.cs b/modules/mono/glue/Managed/Files/Vector2.cs index 908162ec45..bb1950e1a8 100644 --- a/modules/mono/glue/Managed/Files/Vector2.cs +++ b/modules/mono/glue/Managed/Files/Vector2.cs @@ -52,11 +52,15 @@ namespace Godot internal void Normalize() { - real_t length = x * x + y * y; + real_t lengthsq = LengthSquared(); - if (length != 0f) + if (lengthsq == 0) { - length = Mathf.Sqrt(length); + x = y = 0f; + } + else + { + real_t length = Mathf.Sqrt(lengthsq); x /= length; y /= length; } @@ -184,9 +188,9 @@ namespace Godot public Vector2 Normalized() { - var result = this; - result.Normalize(); - return result; + var v = this; + v.Normalize(); + return v; } public Vector2 Project(Vector2 onNormal) @@ -343,7 +347,7 @@ namespace Godot public static bool operator <(Vector2 left, Vector2 right) { - if (left.x.Equals(right.x)) + if (Mathf.IsEqualApprox(left.x, right.x)) { return left.y < right.y; } @@ -353,7 +357,7 @@ namespace Godot public static bool operator >(Vector2 left, Vector2 right) { - if (left.x.Equals(right.x)) + if (Mathf.IsEqualApprox(left.x, right.x)) { return left.y > right.y; } @@ -363,7 +367,7 @@ namespace Godot public static bool operator <=(Vector2 left, Vector2 right) { - if (left.x.Equals(right.x)) + if (Mathf.IsEqualApprox(left.x, right.x)) { return left.y <= right.y; } @@ -373,7 +377,7 @@ namespace Godot public static bool operator >=(Vector2 left, Vector2 right) { - if (left.x.Equals(right.x)) + if (Mathf.IsEqualApprox(left.x, right.x)) { return left.y >= right.y; } @@ -393,7 +397,7 @@ namespace Godot public bool Equals(Vector2 other) { - return x == other.x && y == other.y; + return Mathf.IsEqualApprox(x, other.x) && Mathf.IsEqualApprox(y, other.y); } public override int GetHashCode() diff --git a/modules/mono/glue/Managed/Files/Vector3.cs b/modules/mono/glue/Managed/Files/Vector3.cs index 0c96d346a9..283cb6341a 100644 --- a/modules/mono/glue/Managed/Files/Vector3.cs +++ b/modules/mono/glue/Managed/Files/Vector3.cs @@ -65,14 +65,15 @@ namespace Godot internal void Normalize() { - real_t length = Length(); + real_t lengthsq = LengthSquared(); - if (length == 0f) + if (lengthsq == 0) { x = y = z = 0f; } else { + real_t length = Mathf.Sqrt(lengthsq); x /= length; y /= length; z /= length; @@ -397,9 +398,9 @@ namespace Godot public static bool operator <(Vector3 left, Vector3 right) { - if (left.x == right.x) + if (Mathf.IsEqualApprox(left.x, right.x)) { - if (left.y == right.y) + if (Mathf.IsEqualApprox(left.y, right.y)) return left.z < right.z; return left.y < right.y; } @@ -409,9 +410,9 @@ namespace Godot public static bool operator >(Vector3 left, Vector3 right) { - if (left.x == right.x) + if (Mathf.IsEqualApprox(left.x, right.x)) { - if (left.y == right.y) + if (Mathf.IsEqualApprox(left.y, right.y)) return left.z > right.z; return left.y > right.y; } @@ -421,9 +422,9 @@ namespace Godot public static bool operator <=(Vector3 left, Vector3 right) { - if (left.x == right.x) + if (Mathf.IsEqualApprox(left.x, right.x)) { - if (left.y == right.y) + if (Mathf.IsEqualApprox(left.y, right.y)) return left.z <= right.z; return left.y < right.y; } @@ -433,9 +434,9 @@ namespace Godot public static bool operator >=(Vector3 left, Vector3 right) { - if (left.x == right.x) + if (Mathf.IsEqualApprox(left.x, right.x)) { - if (left.y == right.y) + if (Mathf.IsEqualApprox(left.y, right.y)) return left.z >= right.z; return left.y > right.y; } @@ -455,7 +456,7 @@ namespace Godot public bool Equals(Vector3 other) { - return x == other.x && y == other.y && z == other.z; + return Mathf.IsEqualApprox(x, other.x) && Mathf.IsEqualApprox(y, other.y) && Mathf.IsEqualApprox(z, other.z); } public override int GetHashCode() diff --git a/modules/mono/glue/gd_glue.cpp b/modules/mono/glue/gd_glue.cpp index d756131ac9..7c30092855 100644 --- a/modules/mono/glue/gd_glue.cpp +++ b/modules/mono/glue/gd_glue.cpp @@ -115,7 +115,7 @@ void godot_icall_GD_printt(MonoArray *p_what) { print_line(str); } -double godot_icall_GD_randf() { +float godot_icall_GD_randf() { return Math::randf(); } diff --git a/modules/mono/glue/gd_glue.h b/modules/mono/glue/gd_glue.h index 910979aae3..d4e20e2887 100644 --- a/modules/mono/glue/gd_glue.h +++ b/modules/mono/glue/gd_glue.h @@ -53,7 +53,7 @@ void godot_icall_GD_prints(MonoArray *p_what); void godot_icall_GD_printt(MonoArray *p_what); -double godot_icall_GD_randf(); +float godot_icall_GD_randf(); uint32_t godot_icall_GD_randi(); diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index bfb6c13224..19e49d29f9 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -658,8 +658,6 @@ bool GDMono::_load_project_assembly() { if (success) { mono_assembly_set_main(project_assembly->get_assembly()); - - CSharpLanguage::get_singleton()->project_assembly_loaded(); } else { if (OS::get_singleton()->is_stdout_verbose()) print_error("Mono: Failed to load project assembly"); @@ -866,7 +864,7 @@ Error GDMono::reload_scripts_domain() { } } - CSharpLanguage::get_singleton()->_uninitialize_script_bindings(); + CSharpLanguage::get_singleton()->_on_scripts_domain_unloaded(); Error err = _load_scripts_domain(); if (err != OK) { diff --git a/modules/mono/mono_gd/gd_mono_log.cpp b/modules/mono/mono_gd/gd_mono_log.cpp index 3191cdbd53..a6e04e561d 100644 --- a/modules/mono/mono_gd/gd_mono_log.cpp +++ b/modules/mono/mono_gd/gd_mono_log.cpp @@ -37,6 +37,7 @@ #include "core/os/os.h" #include "../godotsharp_dirs.h" +#include "../utils/string_utils.h" static int log_level_get_id(const char *p_log_level) { @@ -125,27 +126,6 @@ void GDMonoLog::_delete_old_log_files(const String &p_logs_dir) { da->list_dir_end(); } -static String format(const char *p_fmt, ...) { - va_list args; - - va_start(args, p_fmt); - int len = vsnprintf(NULL, 0, p_fmt, args); - va_end(args); - - len += 1; // for the trailing '/0' - - char *buffer(memnew_arr(char, len)); - - va_start(args, p_fmt); - vsnprintf(buffer, len, p_fmt, args); - va_end(args); - - String res(buffer); - memdelete_arr(buffer); - - return res; -} - void GDMonoLog::initialize() { CharString log_level = OS::get_singleton()->get_environment("GODOT_MONO_LOG_LEVEL").utf8(); @@ -172,7 +152,7 @@ void GDMonoLog::initialize() { OS::Time time_now = OS::get_singleton()->get_time(); int pid = OS::get_singleton()->get_process_id(); - String log_file_name = format("%d-%02d-%02d %02d:%02d:%02d (%d).txt", + String log_file_name = str_format("%d_%02d_%02d %02d.%02d.%02d (%d).txt", date_now.year, date_now.month, date_now.day, time_now.hour, time_now.min, time_now.sec, pid); diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp index c390f8b9c2..0ef66577fe 100644 --- a/modules/mono/utils/string_utils.cpp +++ b/modules/mono/utils/string_utils.cpp @@ -32,6 +32,8 @@ #include "core/os/file_access.h" +#include <stdio.h> + namespace { int sfind(const String &p_text, int p_from) { @@ -184,3 +186,50 @@ Error read_all_file_utf8(const String &p_path, String &r_content) { r_content = source; return OK; } + +// TODO: Move to variadic templates once we upgrade to C++11 + +String str_format(const char *p_format, ...) { + va_list list; + + va_start(list, p_format); + String res = str_format(p_format, list); + va_end(list); + + return res; +} +// va_copy was defined in the C99, but not in C++ standards before C++11. +// When you compile C++ without --std=c++<XX> option, compilers still define +// va_copy, otherwise you have to use the internal version (__va_copy). +#if !defined(va_copy) +#if defined(__GNUC__) +#define va_copy(d, s) __va_copy((d), (s)) +#else +#define va_copy(d, s) ((d) = (s)) +#endif +#endif + +#if defined(MINGW_ENABLED) || defined(_MSC_VER) +#define vsnprintf vsnprintf_s +#endif + +String str_format(const char *p_format, va_list p_list) { + va_list list; + + va_copy(list, p_list); + int len = vsnprintf(NULL, 0, p_format, list); + va_end(list); + + len += 1; // for the trailing '/0' + + char *buffer(memnew_arr(char, len)); + + va_copy(list, p_list); + vsnprintf(buffer, len, p_format, list); + va_end(list); + + String res(buffer); + memdelete_arr(buffer); + + return res; +} diff --git a/modules/mono/utils/string_utils.h b/modules/mono/utils/string_utils.h index 61765ccfd8..565b9bb644 100644 --- a/modules/mono/utils/string_utils.h +++ b/modules/mono/utils/string_utils.h @@ -34,6 +34,8 @@ #include "core/ustring.h" #include "core/variant.h" +#include <stdarg.h> + String sformat(const String &p_text, const Variant &p1 = Variant(), const Variant &p2 = Variant(), const Variant &p3 = Variant(), const Variant &p4 = Variant(), const Variant &p5 = Variant()); #ifdef TOOLS_ENABLED @@ -44,4 +46,15 @@ String escape_csharp_keyword(const String &p_name); Error read_all_file_utf8(const String &p_path, String &r_content); +#if defined(__GNUC__) +#define _PRINTF_FORMAT_ATTRIBUTE_1_0 __attribute__((format(printf, 1, 0))) +#define _PRINTF_FORMAT_ATTRIBUTE_1_2 __attribute__((format(printf, 1, 2))) +#else +#define _PRINTF_FORMAT_ATTRIBUTE_1_0 +#define _PRINTF_FORMAT_ATTRIBUTE_1_2 +#endif + +String str_format(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_1_2; +String str_format(const char *p_format, va_list p_list) _PRINTF_FORMAT_ATTRIBUTE_1_0; + #endif // STRING_FORMAT_H diff --git a/modules/opensimplex/doc_classes/NoiseTexture.xml b/modules/opensimplex/doc_classes/NoiseTexture.xml index 4caf6db1bb..c789724fc4 100644 --- a/modules/opensimplex/doc_classes/NoiseTexture.xml +++ b/modules/opensimplex/doc_classes/NoiseTexture.xml @@ -13,7 +13,7 @@ </methods> <members> <member name="as_normalmap" type="bool" setter="set_as_normalmap" getter="is_normalmap"> - If true, the resulting texture contains a normal map created from the original noise interpreted as a bump map. + If [code]true[/code], the resulting texture contains a normal map created from the original noise interpreted as a bump map. </member> <member name="bump_strength" type="float" setter="set_bump_strength" getter="get_bump_strength"> </member> diff --git a/modules/opus/SCsub b/modules/opus/SCsub index b72144c679..a1325734e2 100644 --- a/modules/opus/SCsub +++ b/modules/opus/SCsub @@ -139,7 +139,7 @@ if env['builtin_opus']: opus_sources_silk = [] if env["platform"] in ["android", "iphone", "javascript"]: - env_opus.Append(CFLAGS=["-DFIXED_POINT"]) + env_opus.Append(CPPFLAGS=["-DFIXED_POINT"]) opus_sources_silk = [ "silk/fixed/LTP_analysis_filter_FIX.c", "silk/fixed/LTP_scale_ctrl_FIX.c", @@ -208,7 +208,7 @@ if env['builtin_opus']: if env['builtin_libogg']: env_opus.Append(CPPPATH=["#thirdparty/libogg"]) - env_opus.Append(CFLAGS=["-DHAVE_CONFIG_H"]) + env_opus.Append(CPPFLAGS=["-DHAVE_CONFIG_H"]) thirdparty_include_paths = [ "", @@ -222,14 +222,14 @@ if env['builtin_opus']: if env["platform"] == "android": if ("android_arch" in env and env["android_arch"] in ["armv6", "armv7"]): - env_opus.Append(CFLAGS=["-DOPUS_ARM_OPT"]) + env_opus.Append(CPPFLAGS=["-DOPUS_ARM_OPT"]) elif ("android_arch" in env and env["android_arch"] == "arm64v8"): - env_opus.Append(CFLAGS=["-DOPUS_ARM64_OPT"]) + env_opus.Append(CPPFLAGS=["-DOPUS_ARM64_OPT"]) elif env["platform"] == "iphone": if ("arch" in env and env["arch"] == "arm"): - env_opus.Append(CFLAGS=["-DOPUS_ARM_OPT"]) + env_opus.Append(CPPFLAGS=["-DOPUS_ARM_OPT"]) elif ("arch" in env and env["arch"] == "arm64"): - env_opus.Append(CFLAGS=["-DOPUS_ARM64_OPT"]) + env_opus.Append(CPPFLAGS=["-DOPUS_ARM64_OPT"]) env_thirdparty = env_opus.Clone() env_thirdparty.disable_warnings() diff --git a/modules/recast/navigation_mesh_editor_plugin.cpp b/modules/recast/navigation_mesh_editor_plugin.cpp index a068f3b0f9..62108620bd 100644 --- a/modules/recast/navigation_mesh_editor_plugin.cpp +++ b/modules/recast/navigation_mesh_editor_plugin.cpp @@ -67,9 +67,7 @@ void NavigationMeshEditor::_bake_pressed() { NavigationMeshGenerator::clear(node->get_navigation_mesh()); NavigationMeshGenerator::bake(node->get_navigation_mesh(), node); - if (node) { - node->update_gizmo(); - } + node->update_gizmo(); } void NavigationMeshEditor::_clear_pressed() { diff --git a/modules/svg/SCsub b/modules/svg/SCsub index 22f0b1e3eb..66d9b3bf75 100644 --- a/modules/svg/SCsub +++ b/modules/svg/SCsub @@ -16,7 +16,7 @@ env_svg.Append(CPPPATH=[thirdparty_dir]) # FIXME: Needed in editor/editor_themes.cpp for now, but ideally there # shouldn't be a dependency on modules/ and its own 3rd party deps. env.Append(CPPPATH=[thirdparty_dir]) -env.Append(CCFLAGS=["-DSVG_ENABLED"]) +env.Append(CPPFLAGS=["-DSVG_ENABLED"]) env_thirdparty = env_svg.Clone() env_thirdparty.disable_warnings() diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp index 419229677b..a3c0f5ded7 100644 --- a/modules/tga/image_loader_tga.cpp +++ b/modules/tga/image_loader_tga.cpp @@ -148,9 +148,11 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff uint8_t a = 0xff; if (p_header.color_map_depth == 24) { - r = (p_palette[(index * 3) + 0]); + // Due to low-high byte order, the color table must be + // read in the same order as image data (little endian) + r = (p_palette[(index * 3) + 2]); g = (p_palette[(index * 3) + 1]); - b = (p_palette[(index * 3) + 2]); + b = (p_palette[(index * 3) + 0]); } else { return ERR_INVALID_DATA; } diff --git a/modules/theora/SCsub b/modules/theora/SCsub index 98c4274a7e..f98db2359c 100644 --- a/modules/theora/SCsub +++ b/modules/theora/SCsub @@ -66,7 +66,7 @@ if env['builtin_libtheora']: thirdparty_sources += thirdparty_sources_x86_vc if (env["x86_libtheora_opt_gcc"] or env["x86_libtheora_opt_vc"]): - env_theora.Append(CCFLAGS=["-DOC_X86_ASM"]) + env_theora.Append(CPPFLAGS=["-DOC_X86_ASM"]) thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index 14c5ddd7f2..8db0799b47 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -365,7 +365,7 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) { float VideoStreamPlaybackTheora::get_time() const { - return time - AudioServer::get_singleton()->get_output_delay() - delay_compensation; //-((get_total())/(float)vi.rate); + return time - AudioServer::get_singleton()->get_output_latency() - delay_compensation; //-((get_total())/(float)vi.rate); }; Ref<Texture> VideoStreamPlaybackTheora::get_texture() { diff --git a/modules/vhacd/SCsub b/modules/vhacd/SCsub index 11cd5f4743..fdd3ddc1e6 100644 --- a/modules/vhacd/SCsub +++ b/modules/vhacd/SCsub @@ -29,7 +29,7 @@ env_vhacd.Append(CPPFLAGS=["-DGODOT_ENET"]) # upstream uses c++11 if not env.msvc: - env_vhacd.Append(CCFLAGS="-std=c++11") + env_vhacd.Append(CXXFLAGS="-std=c++11") env_thirdparty = env_vhacd.Clone() env_thirdparty.disable_warnings() diff --git a/modules/visual_script/doc_classes/VisualScriptCustomNode.xml b/modules/visual_script/doc_classes/VisualScriptCustomNode.xml index 2ad399c951..1ab9f807fb 100644 --- a/modules/visual_script/doc_classes/VisualScriptCustomNode.xml +++ b/modules/visual_script/doc_classes/VisualScriptCustomNode.xml @@ -143,7 +143,7 @@ </constant> <constant name="STEP_PUSH_STACK_BIT" value="16777216"> Hint used by [method _step] to tell that control should return to it when there is no other node left to execute. - This is used by [VisualScriptCondition] to redirect the sequence to the "Done" port after the true/false branch has finished execution. + This is used by [VisualScriptCondition] to redirect the sequence to the "Done" port after the [code]true[/code]/[code]false[/code] branch has finished execution. </constant> <constant name="STEP_GO_BACK_BIT" value="33554432"> Hint used by [method _step] to tell that control should return back, either hitting a previous STEP_PUSH_STACK_BIT or exiting the function. diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp index 6e7e566206..b50c99932d 100644 --- a/modules/visual_script/visual_script_editor.cpp +++ b/modules/visual_script/visual_script_editor.cpp @@ -37,6 +37,7 @@ #include "core/variant.h" #include "editor/editor_node.h" #include "editor/editor_resource_preview.h" +#include "scene/main/viewport.h" #include "visual_script_expression.h" #include "visual_script_flow_control.h" #include "visual_script_func_nodes.h" @@ -1330,6 +1331,7 @@ void VisualScriptEditor::_input(const Ref<InputEvent> &p_event) { } void VisualScriptEditor::_generic_search() { + port_action_pos = graph->get_viewport()->get_mouse_position() - graph->get_global_position(); new_connect_node_select->select_from_visual_script(String(""), false); } @@ -2099,6 +2101,14 @@ void VisualScriptEditor::goto_line(int p_line, bool p_with_error) { } } +void VisualScriptEditor::set_executing_line(int p_line) { + // todo: add a way to show which node is executing right now. +} + +void VisualScriptEditor::clear_executing_line() { + // todo: add a way to show which node is executing right now. +} + void VisualScriptEditor::trim_trailing_whitespace() { } diff --git a/modules/visual_script/visual_script_editor.h b/modules/visual_script/visual_script_editor.h index f4b4a6981d..9387a09c78 100644 --- a/modules/visual_script/visual_script_editor.h +++ b/modules/visual_script/visual_script_editor.h @@ -263,6 +263,8 @@ public: virtual Variant get_edit_state(); virtual void set_edit_state(const Variant &p_state); virtual void goto_line(int p_line, bool p_with_error = false); + virtual void set_executing_line(int p_line); + virtual void clear_executing_line(); virtual void trim_trailing_whitespace(); virtual void convert_indent_to_spaces(); virtual void convert_indent_to_tabs(); diff --git a/modules/webm/SCsub b/modules/webm/SCsub index cb35b926ab..dcc9a45044 100644 --- a/modules/webm/SCsub +++ b/modules/webm/SCsub @@ -19,7 +19,7 @@ env_webm.Append(CPPPATH=[thirdparty_dir, thirdparty_dir + "libwebm/"]) # upstream uses c++11 if (not env_webm.msvc): - env_webm.Append(CCFLAGS="-std=c++11") + env_webm.Append(CXXFLAGS="-std=c++11") # also requires libogg, libvorbis and libopus if env['builtin_libogg']: diff --git a/modules/webm/libvpx/SCsub b/modules/webm/libvpx/SCsub index 2639d20620..5bf4ea3464 100644 --- a/modules/webm/libvpx/SCsub +++ b/modules/webm/libvpx/SCsub @@ -323,7 +323,7 @@ if webm_cpu_x86: elif cpu_bits == '64': env_libvpx["ASCPU"] = 'X86_64' - env_libvpx.Append(CCFLAGS=['-DWEBM_X86ASM']) + env_libvpx.Append(CPPFLAGS=['-DWEBM_X86ASM']) webm_simd_optimizations = True @@ -337,7 +337,7 @@ if webm_cpu_arm: env_libvpx["ASFLAGS"] = '' env_libvpx["ASCOM"] = '$AS $ASFLAGS -o $TARGET $SOURCES' - env_libvpx.Append(CCFLAGS=['-DWEBM_ARMASM']) + env_libvpx.Append(CPPFLAGS=['-DWEBM_ARMASM']) webm_simd_optimizations = True diff --git a/modules/webm/video_stream_webm.cpp b/modules/webm/video_stream_webm.cpp index 06f9e39dc7..f2497eeec1 100644 --- a/modules/webm/video_stream_webm.cpp +++ b/modules/webm/video_stream_webm.cpp @@ -375,7 +375,7 @@ int VideoStreamPlaybackWebm::get_mix_rate() const { inline bool VideoStreamPlaybackWebm::has_enough_video_frames() const { if (video_frames_pos > 0) { - const double audio_delay = AudioServer::get_singleton()->get_output_delay(); + const double audio_delay = AudioServer::get_singleton()->get_output_latency(); const double video_time = video_frames[video_frames_pos - 1]->time; return video_time >= time + audio_delay + delay_compensation; } @@ -383,7 +383,7 @@ inline bool VideoStreamPlaybackWebm::has_enough_video_frames() const { } bool VideoStreamPlaybackWebm::should_process(WebMFrame &video_frame) { - const double audio_delay = AudioServer::get_singleton()->get_output_delay(); + const double audio_delay = AudioServer::get_singleton()->get_output_latency(); return video_frame.time >= time + audio_delay + delay_compensation; } diff --git a/modules/websocket/SCsub b/modules/websocket/SCsub index 0345e533bc..12b4969cf7 100644 --- a/modules/websocket/SCsub +++ b/modules/websocket/SCsub @@ -88,7 +88,7 @@ if env['builtin_libwebsockets'] and not env["platform"] == "javascript": # alrea env_lws.Append(CPPPATH=[helper_dir]) if env["platform"] == "uwp": - env_lws.Append(CCFLAGS=["/DLWS_MINGW_SUPPORT"]) + env_lws.Append(CPPFLAGS=["/DLWS_MINGW_SUPPORT"]) env_thirdparty = env_lws.Clone() env_thirdparty.disable_warnings() diff --git a/modules/xatlas_unwrap/SCsub b/modules/xatlas_unwrap/SCsub index ad364d5aaf..7a40945f27 100644 --- a/modules/xatlas_unwrap/SCsub +++ b/modules/xatlas_unwrap/SCsub @@ -1,7 +1,5 @@ #!/usr/bin/env python -import platform - Import('env') Import('env_modules') @@ -21,23 +19,6 @@ if env['builtin_xatlas']: if (not env.msvc): env_xatlas_unwrap.Append(CXXFLAGS="-std=c++11") - if env["platform"] == 'x11': - # if not specifically one of the *BSD, then use LINUX as default - if platform.system() == "FreeBSD": - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_FREEBSD", "-DPOSH_COMPILER_GCC"]) - elif platform.system() == "OpenBSD": - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_OPENBSD", "-DPOSH_COMPILER_GCC"]) - else: - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_LINUX", "-DPOSH_COMPILER_GCC"]) - elif env["platform"] == 'osx': - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_DARWIN", "-DPOSH_COMPILER_GCC"]) - elif env["platform"] == 'windows': - if env.msvc: - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_WIN32", "-DNV_CC_MSVC", "-DPOSH_COMPILER_MSVC" ]) - else: - env_xatlas_unwrap.Append(CCFLAGS=["-DNV_OS_MINGW", "-DNV_CC_GNUC", "-DPOSH_COMPILER_GCC", "-U__STRICT_ANSI__"]) - env.Append(LIBS=["dbghelp"]) - env_thirdparty = env_xatlas_unwrap.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/platform/android/SCsub b/platform/android/SCsub index d494372bcd..22ed476c6f 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -34,114 +34,6 @@ env_thirdparty = env_android.Clone() env_thirdparty.disable_warnings() android_objects.append(env_thirdparty.SharedObject('#thirdparty/misc/ifaddrs-android.cc')) -abspath = env.Dir(".").abspath - -with open_utf8(abspath + "/build.gradle.template", "r") as gradle_basein: - gradle_text = gradle_basein.read() - -gradle_maven_flat_text = "" -if len(env.android_flat_dirs) > 0: - gradle_maven_flat_text += "flatDir {\n" - gradle_maven_flat_text += "\tdirs " - for x in env.android_flat_dirs: - gradle_maven_flat_text += "'" + x + "'," - - gradle_maven_flat_text = gradle_maven_flat_text[:-1] - gradle_maven_flat_text += "\n\t}\n" - -gradle_maven_repos_text = "" -gradle_maven_repos_text += gradle_maven_flat_text - -if len(env.android_maven_repos) > 0: - gradle_maven_repos_text += "" - for x in env.android_maven_repos: - gradle_maven_repos_text += "\tmaven {\n" - gradle_maven_repos_text += "\t" + x + "\n" - gradle_maven_repos_text += "\t}\n" - -gradle_maven_dependencies_text = "" - -for x in env.android_dependencies: - gradle_maven_dependencies_text += x + "\n\t" - -gradle_java_dirs_text = "" - -for x in env.android_java_dirs: - gradle_java_dirs_text += ",'" + x.replace("\\", "/") + "'" - -gradle_plugins = "" -for x in env.android_gradle_plugins: - gradle_plugins += "apply plugin: \"" + x + "\"\n" - -gradle_classpath = "" -for x in env.android_gradle_classpath: - gradle_classpath += "\t\tclasspath \"" + x + "\"\n" - -gradle_res_dirs_text = "" - -for x in env.android_res_dirs: - gradle_res_dirs_text += ",'" + x.replace("\\", "/") + "'" - -gradle_aidl_dirs_text = "" - -for x in env.android_aidl_dirs: - gradle_aidl_dirs_text += ",'" + x.replace("\\", "/") + "'" - -gradle_jni_dirs_text = "" - -for x in env.android_jni_dirs: - gradle_jni_dirs_text += ",'" + x.replace("\\", "/") + "'" - -gradle_asset_dirs_text = "" - -for x in env.android_asset_dirs: - gradle_asset_dirs_text += ",'" + x.replace("\\", "/") + "'" - -gradle_default_config_text = "" - -minSdk = 18 -targetSdk = 28 - -for x in env.android_default_config: - if x.startswith("minSdkVersion") and int(x.split(" ")[-1]) < minSdk: - x = "minSdkVersion " + str(minSdk) - if x.startswith("targetSdkVersion") and int(x.split(" ")[-1]) > targetSdk: - x = "targetSdkVersion " + str(targetSdk) - - gradle_default_config_text += x + "\n\t\t" - -if "minSdkVersion" not in gradle_default_config_text: - gradle_default_config_text += ("minSdkVersion " + str(minSdk) + "\n\t\t") - -if "targetSdkVersion" not in gradle_default_config_text: - gradle_default_config_text += ("targetSdkVersion " + str(targetSdk) + "\n\t\t") - -gradle_text = gradle_text.replace("$$GRADLE_REPOSITORY_URLS$$", gradle_maven_repos_text) -gradle_text = gradle_text.replace("$$GRADLE_DEPENDENCIES$$", gradle_maven_dependencies_text) -gradle_text = gradle_text.replace("$$GRADLE_JAVA_DIRS$$", gradle_java_dirs_text) -gradle_text = gradle_text.replace("$$GRADLE_RES_DIRS$$", gradle_res_dirs_text) -gradle_text = gradle_text.replace("$$GRADLE_ASSET_DIRS$$", gradle_asset_dirs_text) -gradle_text = gradle_text.replace("$$GRADLE_AIDL_DIRS$$", gradle_aidl_dirs_text) -gradle_text = gradle_text.replace("$$GRADLE_JNI_DIRS$$", gradle_jni_dirs_text) -gradle_text = gradle_text.replace("$$GRADLE_DEFAULT_CONFIG$$", gradle_default_config_text) -gradle_text = gradle_text.replace("$$GRADLE_PLUGINS$$", gradle_plugins) -gradle_text = gradle_text.replace("$$GRADLE_CLASSPATH$$", gradle_classpath) - -with open_utf8(abspath + "/java/build.gradle", "w") as gradle_baseout: - gradle_baseout.write(gradle_text) - - -with open_utf8(abspath + "/AndroidManifest.xml.template", "r") as pp_basein: - manifest = pp_basein.read() - -manifest = manifest.replace("$$ADD_APPLICATION_CHUNKS$$", env.android_manifest_chunk) -manifest = manifest.replace("$$ADD_PERMISSION_CHUNKS$$", env.android_permission_chunk) -manifest = manifest.replace("$$ADD_APPATTRIBUTE_CHUNKS$$", env.android_appattributes_chunk) - -with open_utf8(abspath + "/java/AndroidManifest.xml", "w") as pp_baseout: - pp_baseout.write(manifest) - - lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"]) lib_arch_dir = '' diff --git a/platform/android/detect.py b/platform/android/detect.py index 5623274050..6c67067db7 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -150,19 +150,21 @@ def configure(env): if (env["target"].startswith("release")): if (env["optimize"] == "speed"): #optimize for speed (default) env.Append(LINKFLAGS=['-O2']) - env.Append(CPPFLAGS=['-O2', '-DNDEBUG', '-fomit-frame-pointer']) + env.Append(CCFLAGS=['-O2', '-fomit-frame-pointer']) + env.Append(CPPFLAGS=['-DNDEBUG']) else: #optimize for size - env.Append(CPPFLAGS=['-Os', '-DNDEBUG']) + env.Append(CCFLAGS=['-Os']) + env.Append(CPPFLAGS=['-DNDEBUG']) env.Append(LINKFLAGS=['-Os']) if (can_vectorize): - env.Append(CPPFLAGS=['-ftree-vectorize']) + env.Append(CCFLAGS=['-ftree-vectorize']) if (env["target"] == "release_debug"): env.Append(CPPFLAGS=['-DDEBUG_ENABLED']) elif (env["target"] == "debug"): env.Append(LINKFLAGS=['-O0']) - env.Append(CPPFLAGS=['-O0', '-D_DEBUG', '-UNDEBUG', '-DDEBUG_ENABLED', - '-DDEBUG_MEMORY_ENABLED', '-g', '-fno-limit-debug-info']) + env.Append(CCFLAGS=['-O0', '-g', '-fno-limit-debug-info']) + env.Append(CPPFLAGS=['-D_DEBUG', '-UNDEBUG', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) ## Compiler configuration @@ -216,15 +218,16 @@ def configure(env): if env['android_stl']: env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"]) env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"]) - env.Append(CXXFLAGS=['-frtti',"-std=gnu++14"]) + env.Append(CXXFLAGS=['-frtti', "-std=gnu++14"]) else: - env.Append(CXXFLAGS=['-fno-rtti', '-fno-exceptions', '-DNO_SAFE_CAST']) + env.Append(CXXFLAGS=['-fno-rtti', '-fno-exceptions']) + env.Append(CPPFLAGS=['-DNO_SAFE_CAST']) ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): print("Using NDK unified headers") sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" - env.Append(CPPFLAGS=["--sysroot="+sysroot]) + env.Append(CPPFLAGS=["--sysroot=" + sysroot]) env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/android/support/include"]) # For unified headers this define has to be set manually @@ -233,48 +236,51 @@ def configure(env): print("Using NDK deprecated headers") env.Append(CPPFLAGS=["-isystem", lib_sysroot + "/usr/include"]) - env.Append(CPPFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split()) + env.Append(CCFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split()) env.Append(CPPFLAGS='-DNO_STATVFS -DGLES_ENABLED'.split()) env['neon_enabled'] = False if env['android_arch'] == 'x86': target_opts = ['-target', 'i686-none-linux-android'] # The NDK adds this if targeting API < 21, so we can drop it when Godot targets it at least - env.Append(CPPFLAGS=['-mstackrealign']) + env.Append(CCFLAGS=['-mstackrealign']) elif env['android_arch'] == 'x86_64': target_opts = ['-target', 'x86_64-none-linux-android'] elif env["android_arch"] == "armv6": target_opts = ['-target', 'armv6-none-linux-androideabi'] - env.Append(CPPFLAGS='-D__ARM_ARCH_6__ -march=armv6 -mfpu=vfp -mfloat-abi=softfp'.split()) + env.Append(CCFLAGS='-march=armv6 -mfpu=vfp -mfloat-abi=softfp'.split()) + env.Append(CPPFLAGS=['-D__ARM_ARCH_6__']) elif env["android_arch"] == "armv7": target_opts = ['-target', 'armv7-none-linux-androideabi'] - env.Append(CPPFLAGS='-D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -march=armv7-a -mfloat-abi=softfp'.split()) + env.Append(CCFLAGS='-march=armv7-a -mfloat-abi=softfp'.split()) + env.Append(CPPFLAGS='-D__ARM_ARCH_7__ -D__ARM_ARCH_7A__'.split()) if env['android_neon']: env['neon_enabled'] = True - env.Append(CPPFLAGS=['-mfpu=neon', '-D__ARM_NEON__']) + env.Append(CCFLAGS=['-mfpu=neon']) + env.Append(CPPFLAGS=['-D__ARM_NEON__']) else: - env.Append(CPPFLAGS=['-mfpu=vfpv3-d16']) + env.Append(CCFLAGS=['-mfpu=vfpv3-d16']) elif env["android_arch"] == "arm64v8": target_opts = ['-target', 'aarch64-none-linux-android'] + env.Append(CCFLAGS=['-mfix-cortex-a53-835769']) env.Append(CPPFLAGS=['-D__ARM_ARCH_8A__']) - env.Append(CPPFLAGS=['-mfix-cortex-a53-835769']) - env.Append(CPPFLAGS=target_opts) - env.Append(CPPFLAGS=common_opts) + env.Append(CCFLAGS=target_opts) + env.Append(CCFLAGS=common_opts) ## Link flags if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): if LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"): - env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a','-Wl,--exclude-libs,libatomic.a','-nostdlib++']) + env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a', '-Wl,--exclude-libs,libatomic.a', '-nostdlib++']) else: - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/"+arch_subpath+"/libandroid_support.a"]) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"]) env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) - env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/"+arch_subpath+"/"]) - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/"+arch_subpath+"/libc++_shared.so"]) + env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"]) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"]) else: env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) if mt_link: diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index e489bce3f8..2a3d0843a8 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -417,6 +417,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { name = "noname"; pname = pname.replace("$genname", name); + return pname; } @@ -1143,11 +1144,12 @@ public: r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "one_click_deploy/clear_previous_install"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "*.apk"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE, "*.apk"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "custom_package/use_custom_build"), false)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "command_line/extra_args"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "version/code", PROPERTY_HINT_RANGE, "1,4096,1,or_greater"), 1)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "version/name"), "1.0")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "package/unique_name", PROPERTY_HINT_PLACEHOLDER_TEXT, "com.example.$genname"), "")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "package/name", PROPERTY_HINT_PLACEHOLDER_TEXT, "Game Name"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "package/unique_name", PROPERTY_HINT_PLACEHOLDER_TEXT, "ext.domain.name"), "org.godotengine.$genname")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "package/name", PROPERTY_HINT_PLACEHOLDER_TEXT, "Game Name [default if blank]"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "package/signed"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "screen/immersive_mode"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "screen/orientation", PROPERTY_HINT_ENUM, "Landscape,Portrait"), 0)); @@ -1388,21 +1390,25 @@ public: virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { String err; - r_missing_templates = find_export_template("android_debug.apk") == String() || find_export_template("android_release.apk") == String(); - if (p_preset->get("custom_package/debug") != "") { - if (FileAccess::exists(p_preset->get("custom_package/debug"))) { - r_missing_templates = false; - } else { - err += TTR("Custom debug template not found.") + "\n"; + if (!bool(p_preset->get("custom_package/use_custom_build"))) { + + r_missing_templates = find_export_template("android_debug.apk") == String() || find_export_template("android_release.apk") == String(); + + if (p_preset->get("custom_package/debug") != "") { + if (FileAccess::exists(p_preset->get("custom_package/debug"))) { + r_missing_templates = false; + } else { + err += TTR("Custom debug template not found.") + "\n"; + } } - } - if (p_preset->get("custom_package/release") != "") { - if (FileAccess::exists(p_preset->get("custom_package/release"))) { - r_missing_templates = false; - } else { - err += TTR("Custom release template not found.") + "\n"; + if (p_preset->get("custom_package/release") != "") { + if (FileAccess::exists(p_preset->get("custom_package/release"))) { + r_missing_templates = false; + } else { + err += TTR("Custom release template not found.") + "\n"; + } } } @@ -1435,6 +1441,30 @@ public: } } + if (bool(p_preset->get("custom_package/use_custom_build"))) { + String sdk_path = EditorSettings::get_singleton()->get("export/android/custom_build_sdk_path"); + if (sdk_path == "") { + err += TTR("Custom build requires a valid Android SDK path in Editor Settings.") + "\n"; + valid = false; + } else { + Error errn; + DirAccess *da = DirAccess::open(sdk_path.plus_file("tools"), &errn); + if (errn != OK) { + err += TTR("Invalid Android SDK path for custom build in Editor Settings.") + "\n"; + valid = false; + } + if (da) { + memdelete(da); + } + } + + if (!FileAccess::exists("res://android/build/build.gradle")) { + + err += TTR("Android project is not installed for compiling. Install from Editor menu.") + "\n"; + valid = false; + } + } + bool apk_expansion = p_preset->get("apk_expansion/enable"); if (apk_expansion) { @@ -1473,6 +1503,260 @@ public: return list; } + void _update_custom_build_project() { + + DirAccessRef da = DirAccess::open("res://android"); + + ERR_FAIL_COND(!da); + Map<String, List<String> > directory_paths; + Map<String, List<String> > manifest_sections; + Map<String, List<String> > gradle_sections; + da->list_dir_begin(); + String d = da->get_next(); + while (d != String()) { + + if (!d.begins_with(".") && d != "build" && da->current_is_dir()) { //a dir and not the build dir + //add directories found + DirAccessRef ds = DirAccess::open(String("res://android").plus_file(d)); + if (ds) { + ds->list_dir_begin(); + String sd = ds->get_next(); + while (sd != String()) { + + if (!sd.begins_with(".") && ds->current_is_dir()) { + String key = sd.to_upper(); + if (!directory_paths.has(key)) { + directory_paths[key] = List<String>(); + } + String path = ProjectSettings::get_singleton()->get_resource_path().plus_file("android").plus_file(d).plus_file(sd); + directory_paths[key].push_back(path); + print_line("Add: " + sd + ":" + path); + } + + sd = ds->get_next(); + } + ds->list_dir_end(); + } + //parse manifest + { + FileAccessRef f = FileAccess::open(String("res://android").plus_file(d).plus_file("AndroidManifest.conf"), FileAccess::READ); + if (f) { + + String section; + while (!f->eof_reached()) { + String l = f->get_line(); + String k = l.strip_edges(); + if (k.begins_with("[")) { + section = k.substr(1, k.length() - 2).strip_edges().to_upper(); + print_line("Section: " + section); + } else if (k != String()) { + if (!manifest_sections.has(section)) { + manifest_sections[section] = List<String>(); + } + manifest_sections[section].push_back(l); + } + } + + f->close(); + } + } + //parse gradle + { + FileAccessRef f = FileAccess::open(String("res://android").plus_file(d).plus_file("gradle.conf"), FileAccess::READ); + if (f) { + + String section; + while (!f->eof_reached()) { + String l = f->get_line().strip_edges(); + String k = l.strip_edges(); + if (k.begins_with("[")) { + section = k.substr(1, k.length() - 2).strip_edges().to_upper(); + print_line("Section: " + section); + } else if (k != String()) { + if (!gradle_sections.has(section)) { + gradle_sections[section] = List<String>(); + } + gradle_sections[section].push_back(l); + } + } + } + } + } + d = da->get_next(); + } + da->list_dir_end(); + + { //fix gradle build + + String new_file; + { + FileAccessRef f = FileAccess::open("res://android/build/build.gradle", FileAccess::READ); + if (f) { + + while (!f->eof_reached()) { + String l = f->get_line(); + + if (l.begins_with("//CHUNK_")) { + String text = l.replace_first("//CHUNK_", ""); + int begin_pos = text.find("_BEGIN"); + if (begin_pos != -1) { + text = text.substr(0, begin_pos); + text = text.to_upper(); //just in case + + String end_marker = "//CHUNK_" + text + "_END"; + size_t pos = f->get_position(); + bool found = false; + while (!f->eof_reached()) { + l = f->get_line(); + if (l.begins_with(end_marker)) { + found = true; + break; + } + } + + new_file += "//CHUNK_" + text + "_BEGIN\n"; + + if (!found) { + ERR_PRINTS("No end marker found in build.gradle for chunk: " + text); + f->seek(pos); + } else { + + //add chunk lines + if (gradle_sections.has(text)) { + for (List<String>::Element *E = gradle_sections[text].front(); E; E = E->next()) { + new_file += E->get() + "\n"; + } + } + new_file += end_marker + "\n"; + } + } else { + new_file += l + "\n"; //pass line by + } + } else if (l.begins_with("//DIR_")) { + String text = l.replace_first("//DIR_", ""); + int begin_pos = text.find("_BEGIN"); + if (begin_pos != -1) { + text = text.substr(0, begin_pos); + text = text.to_upper(); //just in case + + String end_marker = "//DIR_" + text + "_END"; + size_t pos = f->get_position(); + bool found = false; + while (!f->eof_reached()) { + l = f->get_line(); + if (l.begins_with(end_marker)) { + found = true; + break; + } + } + + new_file += "//DIR_" + text + "_BEGIN\n"; + + if (!found) { + ERR_PRINTS("No end marker found in build.gradle for dir: " + text); + f->seek(pos); + } else { + //add chunk lines + if (directory_paths.has(text)) { + for (List<String>::Element *E = directory_paths[text].front(); E; E = E->next()) { + new_file += ",'" + E->get().replace("'", "\'") + "'"; + new_file += "\n"; + } + } + new_file += end_marker + "\n"; + } + } else { + new_file += l + "\n"; //pass line by + } + + } else { + new_file += l + "\n"; + } + } + } + } + + FileAccessRef f = FileAccess::open("res://android/build/build.gradle", FileAccess::WRITE); + f->store_string(new_file); + f->close(); + } + + { //fix manifest + + String new_file; + { + FileAccessRef f = FileAccess::open("res://android/build/AndroidManifest.xml", FileAccess::READ); + if (f) { + + while (!f->eof_reached()) { + String l = f->get_line(); + + if (l.begins_with("<!--CHUNK_")) { + String text = l.replace_first("<!--CHUNK_", ""); + int begin_pos = text.find("_BEGIN-->"); + if (begin_pos != -1) { + text = text.substr(0, begin_pos); + text = text.to_upper(); //just in case + + String end_marker = "<!--CHUNK_" + text + "_END-->"; + size_t pos = f->get_position(); + bool found = false; + while (!f->eof_reached()) { + l = f->get_line(); + if (l.begins_with(end_marker)) { + found = true; + break; + } + } + + new_file += "<!--CHUNK_" + text + "_BEGIN-->\n"; + + if (!found) { + ERR_PRINTS("No end marker found in AndroidManifest.conf for chunk: " + text); + f->seek(pos); + } else { + //add chunk lines + if (manifest_sections.has(text)) { + for (List<String>::Element *E = manifest_sections[text].front(); E; E = E->next()) { + new_file += E->get() + "\n"; + } + } + new_file += end_marker + "\n"; + } + } else { + new_file += l + "\n"; //pass line by + } + + } else if (l.strip_edges().begins_with("<application")) { + String last_tag = "android:icon=\"@drawable/icon\""; + int last_tag_pos = l.find(last_tag); + if (last_tag_pos == -1) { + WARN_PRINTS("No adding of application tags because could not find last tag for <application: " + last_tag); + new_file += l + "\n"; + } else { + String base = l.substr(0, last_tag_pos + last_tag.length()); + if (manifest_sections.has("application_attribs")) { + for (List<String>::Element *E = manifest_sections["application_attribs"].front(); E; E = E->next()) { + String to_add = E->get().strip_edges(); + base += " " + to_add + " "; + } + } + base += ">\n"; + new_file += base; + } + } else { + new_file += l + "\n"; + } + } + } + } + + FileAccessRef f = FileAccess::open("res://android/build/AndroidManifest.xml", FileAccess::WRITE); + f->store_string(new_file); + f->close(); + } + } + virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) { ExportNotifier notifier(*this, p_preset, p_debug, p_path, p_flags); @@ -1481,21 +1765,86 @@ public: EditorProgress ep("export", "Exporting for Android", 105); - if (p_debug) - src_apk = p_preset->get("custom_package/debug"); - else - src_apk = p_preset->get("custom_package/release"); + if (bool(p_preset->get("custom_package/use_custom_build"))) { //custom build + //re-generate build.gradle and AndroidManifest.xml - src_apk = src_apk.strip_edges(); - if (src_apk == "") { + { //test that installed build version is alright + FileAccessRef f = FileAccess::open("res://android/.build_version", FileAccess::READ); + if (!f) { + EditorNode::get_singleton()->show_warning(TTR("Trying to build from a custom built template, but no version info for it exists. Please reinstall from the 'Project' menu.")); + return ERR_UNCONFIGURED; + } + String version = f->get_line().strip_edges(); + if (version != VERSION_FULL_CONFIG) { + EditorNode::get_singleton()->show_warning(vformat(TTR("Android build version mismatch:\n Template installed: %s\n Godot Version: %s\nPlease reinstall Android build template from 'Project' menu."), version, VERSION_FULL_CONFIG)); + return ERR_UNCONFIGURED; + } + } + //build project if custom build is enabled + String sdk_path = EDITOR_GET("export/android/custom_build_sdk_path"); + + ERR_FAIL_COND_V(sdk_path == "", ERR_UNCONFIGURED); + + _update_custom_build_project(); + + OS::get_singleton()->set_environment("ANDROID_HOME", sdk_path); //set and overwrite if required + + String build_command; +#ifdef WINDOWS_ENABLED + build_command = "gradlew.bat"; +#else + build_command = "gradlew"; +#endif + + String build_path = ProjectSettings::get_singleton()->get_resource_path().plus_file("android/build"); + + build_command = build_path.plus_file(build_command); + + List<String> cmdline; + cmdline.push_back("build"); + cmdline.push_back("-p"); + cmdline.push_back(build_path); + /*{ used for debug + int ec; + String pipe; + OS::get_singleton()->execute(build_command, cmdline, true, NULL, NULL, &ec); + print_line("exit code: " + itos(ec)); + } + */ + int result = EditorNode::get_singleton()->execute_and_show_output(TTR("Building Android Project (gradle)"), build_command, cmdline); + if (result != 0) { + EditorNode::get_singleton()->show_warning(TTR("Building of Android project failed, check output for the error.\nAlternatively visit docs.godotengine.org for Android build documentation.")); + return ERR_CANT_CREATE; + } if (p_debug) { - src_apk = find_export_template("android_debug.apk"); + src_apk = build_path.plus_file("build/outputs/apk/debug/build-debug-unsigned.apk"); } else { - src_apk = find_export_template("android_release.apk"); + src_apk = build_path.plus_file("build/outputs/apk/release/build-release-unsigned.apk"); } + + if (!FileAccess::exists(src_apk)) { + EditorNode::get_singleton()->show_warning(TTR("No build apk generated at: ") + "\n" + src_apk); + return ERR_CANT_CREATE; + } + + } else { + + if (p_debug) + src_apk = p_preset->get("custom_package/debug"); + else + src_apk = p_preset->get("custom_package/release"); + + src_apk = src_apk.strip_edges(); if (src_apk == "") { - EditorNode::add_io_error("Package not found: " + src_apk); - return ERR_FILE_NOT_FOUND; + if (p_debug) { + src_apk = find_export_template("android_debug.apk"); + } else { + src_apk = find_export_template("android_release.apk"); + } + if (src_apk == "") { + EditorNode::add_io_error("Package not found: " + src_apk); + return ERR_FILE_NOT_FOUND; + } } } @@ -1923,10 +2272,6 @@ public: zipClose(final_apk, NULL); unzClose(tmp_unaligned); - if (err) { - return err; - } - return OK; } @@ -1979,6 +2324,8 @@ void register_android_exporter() { EDITOR_DEF("export/android/debug_keystore_user", "androiddebugkey"); EDITOR_DEF("export/android/debug_keystore_pass", "android"); EDITOR_DEF("export/android/force_system_user", false); + EDITOR_DEF("export/android/custom_build_sdk_path", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/custom_build_sdk_path", PROPERTY_HINT_GLOBAL_DIR, "*.keystore")); EDITOR_DEF("export/android/timestamping_authority_url", ""); EDITOR_DEF("export/android/shutdown_adb_on_exit", true); diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h index f8d46ea5d2..b8e78627ec 100644 --- a/platform/android/file_access_android.h +++ b/platform/android/file_access_android.h @@ -70,6 +70,8 @@ public: virtual bool file_exists(const String &p_path); ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file) { return 0; } + virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; } //static void make_default(); diff --git a/platform/android/file_access_jandroid.h b/platform/android/file_access_jandroid.h index 4f02fea81d..9429100d65 100644 --- a/platform/android/file_access_jandroid.h +++ b/platform/android/file_access_jandroid.h @@ -74,6 +74,8 @@ public: static void setup(jobject p_io); virtual uint64_t _get_modified_time(const String &p_file) { return 0; } + virtual uint32_t _get_unix_permissions(const String &p_file) { return 0; } + virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) { return FAILED; } FileAccessJAndroid(); ~FileAccessJAndroid(); diff --git a/platform/android/AndroidManifest.xml.template b/platform/android/java/AndroidManifest.xml index daaf847f11..613d24fbd2 100644 --- a/platform/android/AndroidManifest.xml.template +++ b/platform/android/java/AndroidManifest.xml @@ -11,11 +11,20 @@ android:largeScreens="true" android:xlargeScreens="true"/> +<!--glEsVersion is modified by the exporter, changing this value here has no effect--> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> +<!--Adding custom text to manifest is fine, but do it outside the custom user and application BEGIN/ENDregions, as that gets rewritten--> -$$ADD_PERMISSION_CHUNKS$$ +<!--Custom permissions XML added by add-ons. It's recommended to add them from the export preset, though--> +<!--CHUNK_USER_PERMISSIONS_BEGIN--> +<!--CHUNK_USER_PERMISSIONS_END--> + +<!--Anything in this line after the icon will be erased when doing custom build. If you want to add tags manually, do before it.--> + <application android:label="@string/godot_project_name_string" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" android:icon="@drawable/icon"> + +<!--The following values are replaced when Godot exports, modifying them here has no effect. Do theses changes in the--> +<!--export preset. Adding new ones is fine.--> - <application android:label="@string/godot_project_name_string" android:icon="@drawable/icon" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" $$ADD_APPATTRIBUTE_CHUNKS$$ > <activity android:name="org.godotengine.godot.Godot" android:label="@string/godot_project_name_string" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" @@ -32,13 +41,15 @@ $$ADD_PERMISSION_CHUNKS$$ </activity> <service android:name="org.godotengine.godot.GodotDownloaderService" /> -$$ADD_APPLICATION_CHUNKS$$ +<!--Custom application XML added by add-ons--> +<!--CHUNK_APPLICATION_BEGIN--> +<!--CHUNK_APPLICATION_END--> </application> <instrumentation android:icon="@drawable/icon" android:label="@string/godot_project_name_string" android:name="org.godotengine.godot.GodotInstrumentation" - android:targetPackage="com.godot.game" /> + android:targetPackage="org.godotengine.game" /> </manifest> diff --git a/platform/android/build.gradle.template b/platform/android/java/build.gradle index 2fea250061..c468277daa 100644 --- a/platform/android/build.gradle.template +++ b/platform/android/java/build.gradle @@ -1,12 +1,17 @@ +//Gradle project for Godot Engine Android port. +//Do not modify code between the BEGIN/END sections, as it's autogenerated by add-ons + buildscript { repositories { google() jcenter() - $$GRADLE_REPOSITORY_URLS$$ +//CHUNK_BUILDSCRIPT_REPOSITORIES_BEGIN +//CHUNK_BUILDSCRIPT_REPOSITORIES_END } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' - $$GRADLE_CLASSPATH$$ +//CHUNK_BUILDSCRIPT_DEPENDENCIES_BEGIN +//CHUNK_BUILDSCRIPT_DEPENDENCIES_END } } @@ -17,13 +22,16 @@ allprojects { mavenCentral() google() jcenter() - $$GRADLE_REPOSITORY_URLS$$ +//CHUNK_ALLPROJECTS_REPOSITORIES_BEGIN +//CHUNK_ALLPROJECTS_REPOSITORIES_END + } } dependencies { implementation "com.android.support:support-core-utils:28.0.0" - $$GRADLE_DEPENDENCIES$$ +//CHUNK_DEPENDENCIES_BEGIN +//CHUNK_DEPENDENCIES_END } android { @@ -42,7 +50,10 @@ android { exclude 'META-INF/NOTICE' } defaultConfig { - $$GRADLE_DEFAULT_CONFIG$$ + minSdkVersion 18 + targetSdkVersion 28 +//CHUNK_ANDROID_DEFAULTCONFIG_BEGIN +//CHUNK_ANDROID_DEFAULTCONFIG_END } // Both signing and zip-aligning will be done at export time buildTypes.all { buildType -> @@ -53,36 +64,50 @@ android { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src' - $$GRADLE_JAVA_DIRS$$ +//DIR_SRC_BEGIN +//DIR_SRC_END ] res.srcDirs = [ 'res' - $$GRADLE_RES_DIRS$$ +//DIR_RES_BEGIN +//DIR_RES_END ] aidl.srcDirs = [ 'aidl' - $$GRADLE_AIDL_DIRS$$ +//DIR_AIDL_BEGIN +//DIR_AIDL_END ] assets.srcDirs = [ 'assets' - $$GRADLE_ASSET_DIRS$$ +//DIR_ASSETS_BEGIN +//DIR_ASSETS_END + ] } debug.jniLibs.srcDirs = [ 'libs/debug' - $$GRADLE_JNI_DIRS$$ +//DIR_JNI_DEBUG_BEGIN +//DIR_JNI_DEBUG_END ] release.jniLibs.srcDirs = [ 'libs/release' - $$GRADLE_JNI_DIRS$$ +//DIR_JNI_RELEASE_BEGIN +//DIR_JNI_RELEASE_END ] } +// No longer used, as it's not useful for build source template +// applicationVariants.all { variant -> +// variant.outputs.all { output -> +// output.outputFileName = "../../../../../../../bin/android_${variant.name}.apk" +// } +// } - applicationVariants.all { variant -> - variant.outputs.all { output -> - output.outputFileName = "../../../../../../../bin/android_${variant.name}.apk" - } - } } -$$GRADLE_PLUGINS$$ +//CHUNK_GLOBAL_BEGIN +//CHUNK_GLOBAL_END + + + + + diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py index ae8cc58a4a..874b1ab1fb 100644 --- a/platform/haiku/detect.py +++ b/platform/haiku/detect.py @@ -150,6 +150,6 @@ def configure(env): env.Append(CPPPATH=['#platform/haiku']) env.Append(CPPFLAGS=['-DUNIX_ENABLED', '-DOPENGL_ENABLED', '-DGLES_ENABLED']) env.Append(CPPFLAGS=['-DMEDIA_KIT_ENABLED']) - # env.Append(CCFLAGS=['-DFREETYPE_ENABLED']) + # env.Append(CPPFLAGS=['-DFREETYPE_ENABLED']) env.Append(CPPFLAGS=['-DPTHREAD_NO_RENAME']) # TODO: enable when we have pthread_setname_np env.Append(LIBS=['be', 'game', 'media', 'network', 'bnetapi', 'z', 'GL']) diff --git a/platform/iphone/detect.py b/platform/iphone/detect.py index 853f24379e..d56e28a4af 100644 --- a/platform/iphone/detect.py +++ b/platform/iphone/detect.py @@ -45,20 +45,21 @@ def configure(env): if (env["target"].startswith("release")): env.Append(CPPFLAGS=['-DNDEBUG', '-DNS_BLOCK_ASSERTIONS=1']) if (env["optimize"] == "speed"): #optimize for speed (default) - env.Append(CPPFLAGS=['-O2', '-ftree-vectorize', '-fomit-frame-pointer']) + env.Append(CCFLAGS=['-O2', '-ftree-vectorize', '-fomit-frame-pointer']) env.Append(LINKFLAGS=['-O2']) else: #optimize for size - env.Append(CPPFLAGS=['-Os', '-ftree-vectorize']) + env.Append(CCFLAGS=['-Os', '-ftree-vectorize']) env.Append(LINKFLAGS=['-Os']) if env["target"] == "release_debug": env.Append(CPPFLAGS=['-DDEBUG_ENABLED']) elif (env["target"] == "debug"): - env.Append(CPPFLAGS=['-D_DEBUG', '-DDEBUG=1', '-gdwarf-2', '-O0', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Append(CCFLAGS=['-gdwarf-2', '-O0']) + env.Append(CPPFLAGS=['-D_DEBUG', '-DDEBUG=1', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) if (env["use_lto"]): - env.Append(CPPFLAGS=['-flto']) + env.Append(CCFLAGS=['-flto']) env.Append(LINKFLAGS=['-flto']) ## Architecture @@ -104,7 +105,7 @@ def configure(env): detect_darwin_sdk_path('iphonesimulator', env) env['ENV']['MACOSX_DEPLOYMENT_TARGET'] = '10.9' arch_flag = "i386" if env["arch"] == "x86" else env["arch"] - env.Append(CCFLAGS=('-arch ' + arch_flag + ' -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks -fasm-blocks -isysroot $IPHONESDK -mios-simulator-version-min=10.0 -DCUSTOM_MATRIX_TRANSFORM_H=\\\"build/iphone/matrix4_iphone.h\\\" -DCUSTOM_VECTOR3_TRANSFORM_H=\\\"build/iphone/vector3_iphone.h\\\"').split()) + env.Append(CCFLAGS=('-arch ' + arch_flag + ' -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks -fasm-blocks -isysroot $IPHONESDK -mios-simulator-version-min=10.0').split()) elif (env["arch"] == "arm"): detect_darwin_sdk_path('iphone', env) env.Append(CCFLAGS='-fno-objc-arc -arch armv7 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -isysroot $IPHONESDK -fvisibility=hidden -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=10.0 -MMD -MT dependencies'.split()) @@ -115,9 +116,9 @@ def configure(env): env.Append(CPPFLAGS=['-DLIBYUV_DISABLE_NEON']) if env['ios_exceptions']: - env.Append(CPPFLAGS=['-fexceptions']) + env.Append(CCFLAGS=['-fexceptions']) else: - env.Append(CPPFLAGS=['-fno-exceptions']) + env.Append(CCFLAGS=['-fno-exceptions']) ## Link flags diff --git a/platform/osx/detect.py b/platform/osx/detect.py index 36a753e683..8024897195 100644 --- a/platform/osx/detect.py +++ b/platform/osx/detect.py @@ -53,16 +53,18 @@ def configure(env): elif (env["target"] == "release_debug"): if (env["optimize"] == "speed"): #optimize for speed (default) - env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-O2']) else: #optimize for size - env.Prepend(CCFLAGS=['-Os', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-Os']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED']) if (env["debug_symbols"] == "yes"): env.Prepend(CCFLAGS=['-g1']) if (env["debug_symbols"] == "full"): env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "debug"): - env.Prepend(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Prepend(CCFLAGS=['-g3']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) ## Architecture @@ -88,10 +90,10 @@ def configure(env): env['AR'] = mpprefix + "/libexec/llvm-" + mpclangver + "/bin/llvm-ar" env['RANLIB'] = mpprefix + "/libexec/llvm-" + mpclangver + "/bin/llvm-ranlib" env['AS'] = mpprefix + "/libexec/llvm-" + mpclangver + "/bin/llvm-as" - env.Append(CCFLAGS=['-D__MACPORTS__']) #hack to fix libvpx MM256_BROADCASTSI128_SI256 define + env.Append(CPPFLAGS=['-D__MACPORTS__']) #hack to fix libvpx MM256_BROADCASTSI128_SI256 define detect_darwin_sdk_path('osx', env) - env.Append(CPPFLAGS=['-isysroot', '$MACOS_SDK_PATH']) + env.Append(CCFLAGS=['-isysroot', '$MACOS_SDK_PATH']) env.Append(LINKFLAGS=['-isysroot', '$MACOS_SDK_PATH']) else: # osxcross build @@ -110,7 +112,7 @@ def configure(env): env['AR'] = basecmd + "ar" env['RANLIB'] = basecmd + "ranlib" env['AS'] = basecmd + "as" - env.Append(CCFLAGS=['-D__MACPORTS__']) #hack to fix libvpx MM256_BROADCASTSI128_SI256 define + env.Append(CPPFLAGS=['-D__MACPORTS__']) #hack to fix libvpx MM256_BROADCASTSI128_SI256 define if (env["CXX"] == "clang++"): env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND']) @@ -129,5 +131,5 @@ def configure(env): env.Append(LINKFLAGS=['-framework', 'Cocoa', '-framework', 'Carbon', '-framework', 'OpenGL', '-framework', 'AGL', '-framework', 'AudioUnit', '-framework', 'CoreAudio', '-framework', 'CoreMIDI', '-lz', '-framework', 'IOKit', '-framework', 'ForceFeedback', '-framework', 'CoreVideo']) env.Append(LIBS=['pthread']) - env.Append(CPPFLAGS=['-mmacosx-version-min=10.9']) + env.Append(CCFLAGS=['-mmacosx-version-min=10.9']) env.Append(LINKFLAGS=['-mmacosx-version-min=10.9']) diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index 5e94bc457b..1a63d6ff75 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -568,7 +568,7 @@ Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_p f->close(); if (is_execute) { // Chmod with 0755 if the file is executable - f->_chmod(file, 0755); + FileAccess::set_unix_permissions(file, 0755); } memdelete(f); } else { diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 5a4c0593bc..fec524c04b 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -337,6 +337,11 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt } - (void)windowDidMove:(NSNotification *)notification { + + if (OS_OSX::singleton->get_main_loop()) { + OS_OSX::singleton->input->release_pressed_events(); + } + /* [window->nsgl.context update]; @@ -965,10 +970,10 @@ static const _KeyCodeMap _keycodes[55] = { { 'i', KEY_I }, { 'o', KEY_O }, { 'p', KEY_P }, - { '[', KEY_BRACERIGHT }, - { ']', KEY_BRACELEFT }, - { '{', KEY_BRACERIGHT }, - { '}', KEY_BRACELEFT }, + { '[', KEY_BRACELEFT }, + { ']', KEY_BRACERIGHT }, + { '{', KEY_BRACELEFT }, + { '}', KEY_BRACERIGHT }, { 'a', KEY_A }, { 's', KEY_S }, { 'd', KEY_D }, diff --git a/platform/server/detect.py b/platform/server/detect.py index f13ee72fd2..5306a2bf69 100644 --- a/platform/server/detect.py +++ b/platform/server/detect.py @@ -63,9 +63,10 @@ def configure(env): elif (env["target"] == "release_debug"): if (env["optimize"] == "speed"): #optimize for speed (default) - env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-O2']) else: #optimize for size - env.Prepend(CCFLAGS=['-Os', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-Os']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED']) if (env["debug_symbols"] == "yes"): env.Prepend(CCFLAGS=['-g1']) @@ -73,7 +74,8 @@ def configure(env): env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "debug"): - env.Prepend(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Prepend(CCFLAGS=['-g3']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) env.Append(LINKFLAGS=['-rdynamic']) ## Architecture diff --git a/platform/uwp/detect.py b/platform/uwp/detect.py index f8f1b066f6..17f8242466 100644 --- a/platform/uwp/detect.py +++ b/platform/uwp/detect.py @@ -53,18 +53,20 @@ def configure(env): ## Build type if (env["target"] == "release"): - env.Append(CPPFLAGS=['/O2', '/GL']) - env.Append(CPPFLAGS=['/MD']) + env.Append(CCFLAGS=['/O2', '/GL']) + env.Append(CCFLAGS=['/MD']) env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS', '/LTCG']) elif (env["target"] == "release_debug"): - env.Append(CCFLAGS=['/O2', '/Zi', '/DDEBUG_ENABLED']) - env.Append(CPPFLAGS=['/MD']) + env.Append(CCFLAGS=['/O2', '/Zi']) + env.Append(CCFLAGS=['/MD']) + env.Append(CPPFLAGS=['/DDEBUG_ENABLED']) env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) elif (env["target"] == "debug"): - env.Append(CCFLAGS=['/Zi', '/DDEBUG_ENABLED', '/DDEBUG_MEMORY_ENABLED']) - env.Append(CPPFLAGS=['/MDd']) + env.Append(CCFLAGS=['/Zi']) + env.Append(CCFLAGS=['/MDd']) + env.Append(CPPFLAGS=['/DDEBUG_ENABLED', '/DDEBUG_MEMORY_ENABLED']) env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) env.Append(LINKFLAGS=['/DEBUG']) @@ -136,18 +138,19 @@ def configure(env): ## Compile flags env.Append(CPPPATH=['#platform/uwp', '#drivers/windows']) - env.Append(CCFLAGS=['/DUWP_ENABLED', '/DWINDOWS_ENABLED', '/DTYPED_METHOD_BIND']) - env.Append(CCFLAGS=['/DGLES_ENABLED', '/DGL_GLEXT_PROTOTYPES', '/DEGL_EGLEXT_PROTOTYPES', '/DANGLE_ENABLED']) + env.Append(CPPFLAGS=['/DUWP_ENABLED', '/DWINDOWS_ENABLED', '/DTYPED_METHOD_BIND']) + env.Append(CPPFLAGS=['/DGLES_ENABLED', '/DGL_GLEXT_PROTOTYPES', '/DEGL_EGLEXT_PROTOTYPES', '/DANGLE_ENABLED']) winver = "0x0602" # Windows 8 is the minimum target for UWP build - env.Append(CCFLAGS=['/DWINVER=%s' % winver, '/D_WIN32_WINNT=%s' % winver]) + env.Append(CPPFLAGS=['/DWINVER=%s' % winver, '/D_WIN32_WINNT=%s' % winver]) - env.Append(CPPFLAGS=['/D', '__WRL_NO_DEFAULT_LIB__', '/D', 'WIN32', '/DPNG_ABORT=abort']) + env.Append(CPPFLAGS=['/D__WRL_NO_DEFAULT_LIB__', '/DWIN32', '/DPNG_ABORT=abort']) env.Append(CPPFLAGS=['/AI', vc_base_path + 'lib/store/references']) env.Append(CPPFLAGS=['/AI', vc_base_path + 'lib/x86/store/references']) - env.Append(CCFLAGS='/FS /MP /GS /wd"4453" /wd"28204" /wd"4291" /Zc:wchar_t /Gm- /fp:precise /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP" /errorReport:prompt /WX- /Zc:forScope /Gd /EHsc /nologo'.split()) - env.Append(CXXFLAGS='/ZW /FS'.split()) + env.Append(CCFLAGS='/FS /MP /GS /wd"4453" /wd"28204" /wd"4291" /Zc:wchar_t /Gm- /fp:precise /errorReport:prompt /WX- /Zc:forScope /Gd /EHsc /nologo'.split()) + env.Append(CPPFLAGS=['/D_UNICODE', '/DUNICODE', '/D "WINAPI_FAMILY=WINAPI_FAMILY_APP"']) + env.Append(CXXFLAGS=['/ZW']) env.Append(CCFLAGS=['/AI', vc_base_path + '\\vcpackages', '/AI', os.environ['WINDOWSSDKDIR'] + '\\References\\CommonConfiguration\\Neutral']) ## Link flags diff --git a/platform/windows/detect.py b/platform/windows/detect.py index 2f7334657f..5c38eebf04 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -273,7 +273,8 @@ def configure_mingw(env): env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "release_debug"): - env.Append(CCFLAGS=['-O2', '-DDEBUG_ENABLED']) + env.Append(CCFLAGS=['-O2']) + env.Append(CPPFLAGS=['-DDEBUG_ENABLED']) if (env["debug_symbols"] == "yes"): env.Prepend(CCFLAGS=['-g1']) if (env["debug_symbols"] == "full"): @@ -284,7 +285,8 @@ def configure_mingw(env): env.Prepend(CCFLAGS=['-Os']) elif (env["target"] == "debug"): - env.Append(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Append(CCFLAGS=['-g3']) + env.Append(CPPFLAGS=['-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) ## Compiler configuration @@ -325,12 +327,13 @@ def configure_mingw(env): ## Compile flags - env.Append(CCFLAGS=['-DWINDOWS_ENABLED', '-mwindows']) - env.Append(CCFLAGS=['-DOPENGL_ENABLED']) - env.Append(CCFLAGS=['-DWASAPI_ENABLED']) - env.Append(CCFLAGS=['-DWINMIDI_ENABLED']) - env.Append(CCFLAGS=['-DWINVER=%s' % env['target_win_version'], '-D_WIN32_WINNT=%s' % env['target_win_version']]) - env.Append(LIBS=['mingw32', 'opengl32', 'dsound', 'ole32', 'd3d9', 'winmm', 'gdi32', 'iphlpapi', 'shlwapi', 'wsock32', 'ws2_32', 'kernel32', 'oleaut32', 'dinput8', 'dxguid', 'ksuser', 'imm32', 'bcrypt','avrt']) + env.Append(CCFLAGS=['-mwindows']) + env.Append(CPPFLAGS=['-DWINDOWS_ENABLED']) + env.Append(CPPFLAGS=['-DOPENGL_ENABLED']) + env.Append(CPPFLAGS=['-DWASAPI_ENABLED']) + env.Append(CPPFLAGS=['-DWINMIDI_ENABLED']) + env.Append(CPPFLAGS=['-DWINVER=%s' % env['target_win_version'], '-D_WIN32_WINNT=%s' % env['target_win_version']]) + env.Append(LIBS=['mingw32', 'opengl32', 'dsound', 'ole32', 'd3d9', 'winmm', 'gdi32', 'iphlpapi', 'shlwapi', 'wsock32', 'ws2_32', 'kernel32', 'oleaut32', 'dinput8', 'dxguid', 'ksuser', 'imm32', 'bcrypt', 'avrt', 'uuid']) env.Append(CPPFLAGS=['-DMINGW_ENABLED']) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 1a5050a15a..0b61770d87 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -53,6 +53,7 @@ #include <avrt.h> #include <direct.h> +#include <knownfolders.h> #include <process.h> #include <regstr.h> #include <shlobj.h> @@ -345,6 +346,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) control_mem = false; shift_mem = false; } else { // WM_INACTIVE + input->release_pressed_events(); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); alt_mem = false; }; @@ -785,6 +787,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; case WM_ENTERSIZEMOVE: { + input->release_pressed_events(); move_timer_id = SetTimer(hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC)NULL); } break; case WM_EXITSIZEMOVE: { @@ -1410,26 +1413,29 @@ Error OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int void OS_Windows::set_clipboard(const String &p_text) { + // Convert LF line endings to CRLF in clipboard content + // Otherwise, line endings won't be visible when pasted in other software + String text = p_text.replace("\n", "\r\n"); + if (!OpenClipboard(hWnd)) { ERR_EXPLAIN("Unable to open clipboard."); ERR_FAIL(); }; EmptyClipboard(); - HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE, (p_text.length() + 1) * sizeof(CharType)); + HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE, (text.length() + 1) * sizeof(CharType)); if (mem == NULL) { ERR_EXPLAIN("Unable to allocate memory for clipboard contents."); ERR_FAIL(); }; LPWSTR lptstrCopy = (LPWSTR)GlobalLock(mem); - memcpy(lptstrCopy, p_text.c_str(), (p_text.length() + 1) * sizeof(CharType)); - //memset((lptstrCopy + p_text.length()), 0, sizeof(CharType)); + memcpy(lptstrCopy, text.c_str(), (text.length() + 1) * sizeof(CharType)); GlobalUnlock(mem); SetClipboardData(CF_UNICODETEXT, mem); // set the CF_TEXT version (not needed?) - CharString utf8 = p_text.utf8(); + CharString utf8 = text.utf8(); mem = GlobalAlloc(GMEM_MOVEABLE, utf8.length() + 1); if (mem == NULL) { ERR_EXPLAIN("Unable to allocate memory for clipboard contents."); @@ -2460,7 +2466,7 @@ void OS_Windows::GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, DeleteDC(hMainDC); } -Error OS_Windows::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr) { +Error OS_Windows::execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id, String *r_pipe, int *r_exitcode, bool read_stderr, Mutex *p_pipe_mutex) { if (p_blocking && r_pipe) { @@ -2479,7 +2485,13 @@ Error OS_Windows::execute(const String &p_path, const List<String> &p_arguments, char buf[65535]; while (fgets(buf, 65535, f)) { + if (p_pipe_mutex) { + p_pipe_mutex->lock(); + } (*r_pipe) += buf; + if (p_pipe_mutex) { + p_pipe_mutex->unlock(); + } } int rv = _pclose(f); @@ -2870,39 +2882,41 @@ String OS_Windows::get_godot_dir_name() const { String OS_Windows::get_system_dir(SystemDir p_dir) const { - int id; + KNOWNFOLDERID id; switch (p_dir) { case SYSTEM_DIR_DESKTOP: { - id = CSIDL_DESKTOPDIRECTORY; + id = FOLDERID_Desktop; } break; case SYSTEM_DIR_DCIM: { - id = CSIDL_MYPICTURES; + id = FOLDERID_Pictures; } break; case SYSTEM_DIR_DOCUMENTS: { - id = CSIDL_PERSONAL; + id = FOLDERID_Documents; } break; case SYSTEM_DIR_DOWNLOADS: { - id = 0x000C; + id = FOLDERID_Downloads; } break; case SYSTEM_DIR_MOVIES: { - id = CSIDL_MYVIDEO; + id = FOLDERID_Videos; } break; case SYSTEM_DIR_MUSIC: { - id = CSIDL_MYMUSIC; + id = FOLDERID_Music; } break; case SYSTEM_DIR_PICTURES: { - id = CSIDL_MYPICTURES; + id = FOLDERID_Pictures; } break; case SYSTEM_DIR_RINGTONES: { - id = CSIDL_MYMUSIC; + id = FOLDERID_Music; } break; } - WCHAR szPath[MAX_PATH]; - HRESULT res = SHGetFolderPathW(NULL, id, NULL, 0, szPath); + PWSTR szPath; + HRESULT res = SHGetKnownFolderPath(id, 0, NULL, &szPath); ERR_FAIL_COND_V(res != S_OK, String()); - return String(szPath); + String path = String(szPath); + CoTaskMemFree(szPath); + return path; } String OS_Windows::get_user_data_dir() const { diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index c15e1cabc3..0e0b9bf3f6 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -261,7 +261,7 @@ public: virtual void delay_usec(uint32_t p_usec) const; virtual uint64_t get_ticks_usec() const; - virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false); + virtual Error execute(const String &p_path, const List<String> &p_arguments, bool p_blocking, ProcessID *r_child_id = NULL, String *r_pipe = NULL, int *r_exitcode = NULL, bool read_stderr = false, Mutex *p_pipe_mutex = NULL); virtual Error kill(const ProcessID &p_pid); virtual int get_process_id() const; diff --git a/platform/x11/detect.py b/platform/x11/detect.py index 5f7b825f5e..f8ae5e9acb 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -1,7 +1,7 @@ import os import platform import sys -from methods import get_compiler_version, using_gcc +from methods import get_compiler_version, using_gcc, using_clang def is_active(): @@ -58,11 +58,13 @@ def get_opts(): return [ BoolVariable('use_llvm', 'Use the LLVM compiler', False), + BoolVariable('use_lld', 'Use the LLD linker', False), + BoolVariable('use_thinlto', 'Use ThinLTO', False), BoolVariable('use_static_cpp', 'Link libgcc and libstdc++ statically for better portability', False), BoolVariable('use_ubsan', 'Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)', False), BoolVariable('use_asan', 'Use LLVM/GCC compiler address sanitizer (ASAN))', False), BoolVariable('use_lsan', 'Use LLVM/GCC compiler leak sanitizer (LSAN))', False), - BoolVariable('pulseaudio', 'Detect & use pulseaudio', True), + BoolVariable('pulseaudio', 'Detect and use PulseAudio', True), BoolVariable('udev', 'Use udev for gamepad connection callbacks', False), EnumVariable('debug_symbols', 'Add debugging symbols to release builds', 'yes', ('yes', 'no', 'full')), BoolVariable('separate_debug_symbols', 'Create a separate file containing debugging symbols', False), @@ -97,9 +99,10 @@ def configure(env): elif (env["target"] == "release_debug"): if (env["optimize"] == "speed"): #optimize for speed (default) - env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-O2']) else: #optimize for size - env.Prepend(CCFLAGS=['-Os', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-Os']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED']) if (env["debug_symbols"] == "yes"): env.Prepend(CCFLAGS=['-g1']) @@ -107,7 +110,8 @@ def configure(env): env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "debug"): - env.Prepend(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Prepend(CCFLAGS=['-g3']) + env.Prepend(CPPFLAGS=['-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) env.Append(LINKFLAGS=['-rdynamic']) ## Architecture @@ -130,6 +134,15 @@ def configure(env): env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND']) env.extra_suffix = ".llvm" + env.extra_suffix + if env['use_lld']: + if env['use_llvm']: + env.Append(LINKFLAGS=['-fuse-ld=lld']) + if env['use_thinlto']: + # A convenience so you don't need to write use_lto too when using SCons + env['use_lto'] = True + else: + print("Using LLD with GCC is not supported yet, try compiling with 'use_llvm=yes'.") + sys.exit(255) if env['use_ubsan'] or env['use_asan'] or env['use_lsan']: env.extra_suffix += "s" @@ -147,11 +160,17 @@ def configure(env): env.Append(LINKFLAGS=['-fsanitize=leak']) if env['use_lto']: - env.Append(CCFLAGS=['-flto']) if not env['use_llvm'] and env.GetOption("num_jobs") > 1: + env.Append(CCFLAGS=['-flto']) env.Append(LINKFLAGS=['-flto=' + str(env.GetOption("num_jobs"))]) else: - env.Append(LINKFLAGS=['-flto']) + if env['use_lld'] and env['use_thinlto']: + env.Append(CCFLAGS=['-flto=thin']) + env.Append(LINKFLAGS=['-flto=thin']) + else: + env.Append(CCFLAGS=['-flto']) + env.Append(LINKFLAGS=['-flto']) + if not env['use_llvm']: env['RANLIB'] = 'gcc-ranlib' env['AR'] = 'gcc-ar' @@ -165,6 +184,12 @@ def configure(env): if version != None and version[0] >= '6': env.Append(CCFLAGS=['-fpie']) env.Append(LINKFLAGS=['-no-pie']) + # Do the same for clang should be fine with Clang 4 and higher + if using_clang(env): + version = get_compiler_version(env) + if version != None and version[0] >= '4': + env.Append(CCFLAGS=['-fpie']) + env.Append(LINKFLAGS=['-no-pie']) ## Dependencies @@ -307,10 +332,10 @@ def configure(env): ## Cross-compilation if (is64 and env["bits"] == "32"): - env.Append(CPPFLAGS=['-m32']) + env.Append(CCFLAGS=['-m32']) env.Append(LINKFLAGS=['-m32', '-L/usr/lib/i386-linux-gnu']) elif (not is64 and env["bits"] == "64"): - env.Append(CPPFLAGS=['-m64']) + env.Append(CCFLAGS=['-m64']) env.Append(LINKFLAGS=['-m64', '-L/usr/lib/i686-linux-gnu']) # Link those statically for portability diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index c96047dfbd..8d857de239 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1165,7 +1165,7 @@ int OS_X11::get_screen_dpi(int p_screen) const { int height_mm = DisplayHeightMM(x11_display, p_screen); double xdpi = (width_mm ? sc.width / (double)width_mm * 25.4 : 0); double ydpi = (height_mm ? sc.height / (double)height_mm * 25.4 : 0); - if (xdpi || xdpi) + if (xdpi || ydpi) return (xdpi + ydpi) / (xdpi && ydpi ? 2 : 1); //could not get dpi @@ -2076,7 +2076,9 @@ void OS_X11::process_xevents() { case FocusOut: window_has_focus = false; + input->release_pressed_events(); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); + if (mouse_mode_grab) { //dear X11, I try, I really try, but you never work, you do whathever you want. if (mouse_mode == MOUSE_MODE_CAPTURED) { @@ -3036,34 +3038,40 @@ bool OS_X11::is_vsync_enabled() const { */ void OS_X11::set_context(int p_context) { - char *config_name = NULL; XClassHint *classHint = XAllocClassHint(); if (classHint) { - char *wm_class = (char *)"Godot"; - if (p_context == CONTEXT_EDITOR) - classHint->res_name = (char *)"Godot_Editor"; - if (p_context == CONTEXT_PROJECTMAN) - classHint->res_name = (char *)"Godot_ProjectList"; + CharString name_str; + switch (p_context) { + case CONTEXT_EDITOR: + name_str = "Godot_Editor"; + break; + case CONTEXT_PROJECTMAN: + name_str = "Godot_ProjectList"; + break; + case CONTEXT_ENGINE: + name_str = "Godot_Engine"; + break; + } + CharString class_str; if (p_context == CONTEXT_ENGINE) { - classHint->res_name = (char *)"Godot_Engine"; - String config_name_tmp = GLOBAL_GET("application/config/name"); - if (config_name_tmp.length() > 0) { - config_name = strdup(config_name_tmp.utf8().get_data()); + String config_name = GLOBAL_GET("application/config/name"); + if (config_name.length() == 0) { + class_str = "Godot_Engine"; } else { - config_name = strdup("Godot Engine"); + class_str = config_name.utf8(); } - - wm_class = config_name; + } else { + class_str = "Godot"; } - classHint->res_class = wm_class; + classHint->res_class = class_str.ptrw(); + classHint->res_name = name_str.ptrw(); XSetClassHint(x11_display, x11_window, classHint); XFree(classHint); - free(config_name); } } diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index 932db8f001..25ad6bd5c9 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -645,6 +645,9 @@ void AnimatedSprite::_reset_timeout() { void AnimatedSprite::set_animation(const StringName &p_animation) { + ERR_EXPLAIN(vformat("There is no animation with name '%s'.", p_animation)); + ERR_FAIL_COND(frames->get_animation_names().find(p_animation) == -1); + if (animation == p_animation) return; diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index faefd85968..73f583111b 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -37,7 +37,7 @@ void AudioStreamPlayer2D::_mix_audio() { if (!stream_playback.is_valid() || !active || - (stream_paused && !stream_fade_out)) { + (stream_paused && !stream_paused_fade_out)) { return; } @@ -50,7 +50,7 @@ void AudioStreamPlayer2D::_mix_audio() { AudioFrame *buffer = mix_buffer.ptrw(); int buffer_size = mix_buffer.size(); - if (stream_fade_out) { + if (stream_paused_fade_out) { // Short fadeout ramp buffer_size = MIN(buffer_size, 128); } @@ -84,10 +84,10 @@ void AudioStreamPlayer2D::_mix_audio() { } //mix! - AudioFrame target_volume = stream_fade_out ? AudioFrame(0.f, 0.f) : current.vol; - AudioFrame vol_prev = stream_fade_in ? AudioFrame(0.f, 0.f) : prev_outputs[i].vol; + AudioFrame target_volume = stream_paused_fade_out ? AudioFrame(0.f, 0.f) : current.vol; + AudioFrame vol_prev = stream_paused_fade_in ? AudioFrame(0.f, 0.f) : prev_outputs[i].vol; AudioFrame vol_inc = (target_volume - vol_prev) / float(buffer_size); - AudioFrame vol = stream_fade_in ? AudioFrame(0.f, 0.f) : current.vol; + AudioFrame vol = stream_paused_fade_in ? AudioFrame(0.f, 0.f) : current.vol; int cc = AudioServer::get_singleton()->get_channel_count(); @@ -139,15 +139,9 @@ void AudioStreamPlayer2D::_mix_audio() { active = false; } - if (stream_stop) { - active = false; - set_physics_process_internal(false); - setplay = -1; - } - output_ready = false; - stream_fade_in = false; - stream_fade_out = false; + stream_paused_fade_in = false; + stream_paused_fade_out = false; } void AudioStreamPlayer2D::_notification(int p_what) { @@ -329,7 +323,6 @@ void AudioStreamPlayer2D::play(float p_from_pos) { } if (stream_playback.is_valid()) { - stream_stop = false; active = true; setplay = p_from_pos; output_ready = false; @@ -347,8 +340,9 @@ void AudioStreamPlayer2D::seek(float p_seconds) { void AudioStreamPlayer2D::stop() { if (stream_playback.is_valid()) { - stream_stop = true; - stream_fade_out = true; + active = false; + set_physics_process_internal(false); + setplay = -1; } } @@ -463,8 +457,8 @@ void AudioStreamPlayer2D::set_stream_paused(bool p_pause) { if (p_pause != stream_paused) { stream_paused = p_pause; - stream_fade_in = p_pause ? false : true; - stream_fade_out = p_pause ? true : false; + stream_paused_fade_in = p_pause ? false : true; + stream_paused_fade_out = p_pause ? true : false; } } @@ -549,9 +543,8 @@ AudioStreamPlayer2D::AudioStreamPlayer2D() { output_ready = false; area_mask = 1; stream_paused = false; - stream_fade_in = false; - stream_fade_out = false; - stream_stop = false; + stream_paused_fade_in = false; + stream_paused_fade_out = false; AudioServer::get_singleton()->connect("bus_layout_changed", this, "_bus_layout_changed"); } diff --git a/scene/2d/audio_stream_player_2d.h b/scene/2d/audio_stream_player_2d.h index 0cd18fb93b..e9cdfa2303 100644 --- a/scene/2d/audio_stream_player_2d.h +++ b/scene/2d/audio_stream_player_2d.h @@ -73,9 +73,8 @@ private: float pitch_scale; bool autoplay; bool stream_paused; - bool stream_fade_in; - bool stream_fade_out; - bool stream_stop; + bool stream_paused_fade_in; + bool stream_paused_fade_out; StringName bus; void _mix_audio(); diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index d1fce74085..6b12db9e44 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -438,7 +438,7 @@ void Light2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "energy", PROPERTY_HINT_RANGE, "0.01,100,0.01"), "set_energy", "get_energy"); ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Add,Sub,Mix,Mask"), "set_mode", "get_mode"); ADD_GROUP("Range", "range_"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "range_height", PROPERTY_HINT_RANGE, "-100,100,0.1"), "set_height", "get_height"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "range_height", PROPERTY_HINT_RANGE, "-2048,2048,0.1,or_lesser,or_greater"), "set_height", "get_height"); ADD_PROPERTY(PropertyInfo(Variant::INT, "range_z_min", PROPERTY_HINT_RANGE, itos(VS::CANVAS_ITEM_Z_MIN) + "," + itos(VS::CANVAS_ITEM_Z_MAX) + ",1"), "set_z_range_min", "get_z_range_min"); ADD_PROPERTY(PropertyInfo(Variant::INT, "range_z_max", PROPERTY_HINT_RANGE, itos(VS::CANVAS_ITEM_Z_MIN) + "," + itos(VS::CANVAS_ITEM_Z_MAX) + ",1"), "set_z_range_max", "get_z_range_max"); ADD_PROPERTY(PropertyInfo(Variant::INT, "range_layer_min", PROPERTY_HINT_RANGE, "-512,512,1"), "set_layer_range_min", "get_layer_range_min"); diff --git a/scene/2d/navigation_2d.cpp b/scene/2d/navigation_2d.cpp index 57e0a5b118..72b5f2fb12 100644 --- a/scene/2d/navigation_2d.cpp +++ b/scene/2d/navigation_2d.cpp @@ -542,7 +542,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect if (CLOCK_TANGENT(apex_point, portal_left, left) >= 0) { //process - if (portal_left.distance_squared_to(apex_point) < CMP_EPSILON || CLOCK_TANGENT(apex_point, left, portal_right) > 0) { + if (Math::is_zero_approx(portal_left.distance_squared_to(apex_point)) || CLOCK_TANGENT(apex_point, left, portal_right) > 0) { left_poly = p; portal_left = left; } else { @@ -552,7 +552,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect left_poly = p; portal_left = apex_point; portal_right = apex_point; - if (!path.size() || path[path.size() - 1].distance_to(apex_point) > CMP_EPSILON) + if (!path.size() || !Math::is_zero_approx(path[path.size() - 1].distance_to(apex_point))) path.push_back(apex_point); skip = true; } @@ -560,7 +560,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect if (!skip && CLOCK_TANGENT(apex_point, portal_right, right) <= 0) { //process - if (portal_right.distance_squared_to(apex_point) < CMP_EPSILON || CLOCK_TANGENT(apex_point, right, portal_left) < 0) { + if (Math::is_zero_approx(portal_right.distance_squared_to(apex_point)) || CLOCK_TANGENT(apex_point, right, portal_left) < 0) { right_poly = p; portal_right = right; } else { @@ -570,7 +570,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect right_poly = p; portal_right = apex_point; portal_left = apex_point; - if (!path.size() || path[path.size() - 1].distance_to(apex_point) > CMP_EPSILON) + if (!path.size() || !Math::is_zero_approx(path[path.size() - 1].distance_to(apex_point))) path.push_back(apex_point); } } @@ -596,7 +596,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect } } - if (!path.size() || path[path.size() - 1].distance_squared_to(begin_point) > CMP_EPSILON) { + if (!path.size() || !Math::is_zero_approx(path[path.size() - 1].distance_squared_to(begin_point))) { path.push_back(begin_point); // Add the begin point } else { path.write[path.size() - 1] = begin_point; // Replace first midpoint by the exact begin point @@ -604,7 +604,7 @@ Vector<Vector2> Navigation2D::get_simple_path(const Vector2 &p_start, const Vect path.invert(); - if (path.size() <= 1 || path[path.size() - 1].distance_squared_to(end_point) > CMP_EPSILON) { + if (path.size() <= 1 || !Math::is_zero_approx(path[path.size() - 1].distance_squared_to(end_point))) { path.push_back(end_point); // Add the end point } else { path.write[path.size() - 1] = end_point; // Replace last midpoint by the exact end point diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 690f1d4b4a..578c9aa5f9 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -1275,9 +1275,6 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const if (collided) { found_collision = true; - } - - if (collided) { colliders.push_back(collision); motion = collision.remainder; diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 4d5ffc31b3..ff8c218575 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -38,7 +38,7 @@ void AudioStreamPlayer3D::_mix_audio() { if (!stream_playback.is_valid() || !active || - (stream_paused && !stream_fade_out)) { + (stream_paused && !stream_paused_fade_out)) { return; } @@ -53,7 +53,7 @@ void AudioStreamPlayer3D::_mix_audio() { AudioFrame *buffer = mix_buffer.ptrw(); int buffer_size = mix_buffer.size(); - if (stream_fade_out) { + if (stream_paused_fade_out) { // Short fadeout ramp buffer_size = MIN(buffer_size, 128); } @@ -109,10 +109,10 @@ void AudioStreamPlayer3D::_mix_audio() { int buffers = AudioServer::get_singleton()->get_channel_count(); for (int k = 0; k < buffers; k++) { - AudioFrame target_volume = stream_fade_out ? AudioFrame(0.f, 0.f) : current.vol[k]; - AudioFrame vol_prev = stream_fade_in ? AudioFrame(0.f, 0.f) : prev_outputs[i].vol[k]; + AudioFrame target_volume = stream_paused_fade_out ? AudioFrame(0.f, 0.f) : current.vol[k]; + AudioFrame vol_prev = stream_paused_fade_in ? AudioFrame(0.f, 0.f) : prev_outputs[i].vol[k]; AudioFrame vol_inc = (target_volume - vol_prev) / float(buffer_size); - AudioFrame vol = stream_fade_in ? AudioFrame(0.f, 0.f) : current.vol[k]; + AudioFrame vol = stream_paused_fade_in ? AudioFrame(0.f, 0.f) : current.vol[k]; if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.bus_index, k)) continue; //may have been deleted, will be updated on process @@ -198,15 +198,9 @@ void AudioStreamPlayer3D::_mix_audio() { active = false; } - if (stream_stop) { - active = false; - set_physics_process_internal(false); - setplay = -1; - } - output_ready = false; - stream_fade_in = false; - stream_fade_out = false; + stream_paused_fade_in = false; + stream_paused_fade_out = false; } float AudioStreamPlayer3D::_get_attenuation_db(float p_distance) const { @@ -224,6 +218,7 @@ float AudioStreamPlayer3D::_get_attenuation_db(float p_distance) const { case ATTENUATION_LOGARITHMIC: { att = -20 * Math::log(p_distance / unit_size + CMP_EPSILON); } break; + case ATTENUATION_DISABLED: break; default: { ERR_PRINT("Unknown attenuation type"); break; @@ -662,7 +657,6 @@ float AudioStreamPlayer3D::get_pitch_scale() const { void AudioStreamPlayer3D::play(float p_from_pos) { if (stream_playback.is_valid()) { - stream_stop = false; active = true; setplay = p_from_pos; output_ready = false; @@ -680,8 +674,9 @@ void AudioStreamPlayer3D::seek(float p_seconds) { void AudioStreamPlayer3D::stop() { if (stream_playback.is_valid()) { - stream_stop = true; - stream_fade_out = true; + active = false; + set_physics_process_internal(false); + setplay = -1; } } @@ -831,7 +826,7 @@ float AudioStreamPlayer3D::get_attenuation_filter_db() const { } void AudioStreamPlayer3D::set_attenuation_model(AttenuationModel p_model) { - ERR_FAIL_INDEX(p_model, 3); + ERR_FAIL_INDEX((int)p_model, 4); attenuation_model = p_model; } @@ -877,8 +872,8 @@ void AudioStreamPlayer3D::set_stream_paused(bool p_pause) { if (p_pause != stream_paused) { stream_paused = p_pause; - stream_fade_in = stream_paused ? false : true; - stream_fade_out = stream_paused ? true : false; + stream_paused_fade_in = stream_paused ? false : true; + stream_paused_fade_out = stream_paused ? true : false; } } @@ -962,7 +957,7 @@ void AudioStreamPlayer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("_bus_layout_changed"), &AudioStreamPlayer3D::_bus_layout_changed); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "attenuation_model", PROPERTY_HINT_ENUM, "Inverse,InverseSquare,Log"), "set_attenuation_model", "get_attenuation_model"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "attenuation_model", PROPERTY_HINT_ENUM, "Inverse,InverseSquare,Log,Disabled"), "set_attenuation_model", "get_attenuation_model"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_db", PROPERTY_HINT_RANGE, "-80,80"), "set_unit_db", "get_unit_db"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_size", PROPERTY_HINT_RANGE, "0.1,100,0.1"), "set_unit_size", "get_unit_size"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "max_db", PROPERTY_HINT_RANGE, "-24,6"), "set_max_db", "get_max_db"); @@ -987,6 +982,7 @@ void AudioStreamPlayer3D::_bind_methods() { BIND_ENUM_CONSTANT(ATTENUATION_INVERSE_DISTANCE); BIND_ENUM_CONSTANT(ATTENUATION_INVERSE_SQUARE_DISTANCE); BIND_ENUM_CONSTANT(ATTENUATION_LOGARITHMIC); + BIND_ENUM_CONSTANT(ATTENUATION_DISABLED); BIND_ENUM_CONSTANT(OUT_OF_RANGE_MIX); BIND_ENUM_CONSTANT(OUT_OF_RANGE_PAUSE); @@ -1022,9 +1018,8 @@ AudioStreamPlayer3D::AudioStreamPlayer3D() { out_of_range_mode = OUT_OF_RANGE_MIX; doppler_tracking = DOPPLER_TRACKING_DISABLED; stream_paused = false; - stream_fade_in = false; - stream_fade_out = false; - stream_stop = false; + stream_paused_fade_in = false; + stream_paused_fade_out = false; velocity_tracker.instance(); AudioServer::get_singleton()->connect("bus_layout_changed", this, "_bus_layout_changed"); diff --git a/scene/3d/audio_stream_player_3d.h b/scene/3d/audio_stream_player_3d.h index 1175547028..98bc74b2e4 100644 --- a/scene/3d/audio_stream_player_3d.h +++ b/scene/3d/audio_stream_player_3d.h @@ -46,6 +46,7 @@ public: ATTENUATION_INVERSE_DISTANCE, ATTENUATION_INVERSE_SQUARE_DISTANCE, ATTENUATION_LOGARITHMIC, + ATTENUATION_DISABLED, }; enum OutOfRangeMode { @@ -109,9 +110,8 @@ private: float pitch_scale; bool autoplay; bool stream_paused; - bool stream_fade_in; - bool stream_fade_out; - bool stream_stop; + bool stream_paused_fade_in; + bool stream_paused_fade_out; StringName bus; void _mix_audio(); diff --git a/scene/3d/camera.cpp b/scene/3d/camera.cpp index 368cebeeab..54d7681a3a 100644 --- a/scene/3d/camera.cpp +++ b/scene/3d/camera.cpp @@ -55,16 +55,23 @@ void Camera::_update_camera_mode() { case PROJECTION_ORTHOGONAL: { set_orthogonal(size, near, far); } break; + case PROJECTION_FRUSTUM: { + set_frustum(size, frustum_offset, near, far); + } break; } } void Camera::_validate_property(PropertyInfo &p_property) const { if (p_property.name == "fov") { - if (mode == PROJECTION_ORTHOGONAL) { + if (mode != PROJECTION_PERSPECTIVE) { p_property.usage = PROPERTY_USAGE_NOEDITOR; } } else if (p_property.name == "size") { - if (mode == PROJECTION_PERSPECTIVE) { + if (mode != PROJECTION_ORTHOGONAL && mode != PROJECTION_FRUSTUM) { + p_property.usage = PROPERTY_USAGE_NOEDITOR; + } + } else if (p_property.name == "frustum_offset") { + if (mode != PROJECTION_FRUSTUM) { p_property.usage = PROPERTY_USAGE_NOEDITOR; } } @@ -177,8 +184,24 @@ void Camera::set_orthogonal(float p_size, float p_z_near, float p_z_far) { update_gizmo(); } +void Camera::set_frustum(float p_size, Vector2 p_offset, float p_z_near, float p_z_far) { + if (!force_change && size == p_size && frustum_offset == p_offset && p_z_near == near && p_z_far == far && mode == PROJECTION_FRUSTUM) + return; + + size = p_size; + frustum_offset = p_offset; + + near = p_z_near; + far = p_z_far; + mode = PROJECTION_FRUSTUM; + force_change = false; + + VisualServer::get_singleton()->camera_set_frustum(camera, size, frustum_offset, near, far); + update_gizmo(); +} + void Camera::set_projection(Camera::Projection p_mode) { - if (p_mode == PROJECTION_PERSPECTIVE || p_mode == PROJECTION_ORTHOGONAL) { + if (p_mode == PROJECTION_PERSPECTIVE || p_mode == PROJECTION_ORTHOGONAL || p_mode == PROJECTION_FRUSTUM) { mode = p_mode; _update_camera_mode(); _change_notify(); @@ -470,16 +493,19 @@ void Camera::_bind_methods() { ClassDB::bind_method(D_METHOD("project_position", "screen_point"), &Camera::project_position); ClassDB::bind_method(D_METHOD("set_perspective", "fov", "z_near", "z_far"), &Camera::set_perspective); ClassDB::bind_method(D_METHOD("set_orthogonal", "size", "z_near", "z_far"), &Camera::set_orthogonal); + ClassDB::bind_method(D_METHOD("set_frustum", "size", "offset", "z_near", "z_far"), &Camera::set_frustum); ClassDB::bind_method(D_METHOD("make_current"), &Camera::make_current); ClassDB::bind_method(D_METHOD("clear_current", "enable_next"), &Camera::clear_current, DEFVAL(true)); ClassDB::bind_method(D_METHOD("set_current"), &Camera::set_current); ClassDB::bind_method(D_METHOD("is_current"), &Camera::is_current); ClassDB::bind_method(D_METHOD("get_camera_transform"), &Camera::get_camera_transform); ClassDB::bind_method(D_METHOD("get_fov"), &Camera::get_fov); + ClassDB::bind_method(D_METHOD("get_frustum_offset"), &Camera::get_frustum_offset); ClassDB::bind_method(D_METHOD("get_size"), &Camera::get_size); ClassDB::bind_method(D_METHOD("get_zfar"), &Camera::get_zfar); ClassDB::bind_method(D_METHOD("get_znear"), &Camera::get_znear); ClassDB::bind_method(D_METHOD("set_fov"), &Camera::set_fov); + ClassDB::bind_method(D_METHOD("set_frustum_offset"), &Camera::set_frustum_offset); ClassDB::bind_method(D_METHOD("set_size"), &Camera::set_size); ClassDB::bind_method(D_METHOD("set_zfar"), &Camera::set_zfar); ClassDB::bind_method(D_METHOD("set_znear"), &Camera::set_znear); @@ -510,15 +536,17 @@ void Camera::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset"); ADD_PROPERTY(PropertyInfo(Variant::INT, "doppler_tracking", PROPERTY_HINT_ENUM, "Disabled,Idle,Physics"), "set_doppler_tracking", "get_doppler_tracking"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "projection", PROPERTY_HINT_ENUM, "Perspective,Orthogonal"), "set_projection", "get_projection"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "projection", PROPERTY_HINT_ENUM, "Perspective,Orthogonal,Frustum"), "set_projection", "get_projection"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "current"), "set_current", "is_current"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "fov", PROPERTY_HINT_RANGE, "1,179,0.1"), "set_fov", "get_fov"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "size", PROPERTY_HINT_RANGE, "0.1,16384,0.01"), "set_size", "get_size"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frustum_offset"), "set_frustum_offset", "get_frustum_offset"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "near", PROPERTY_HINT_EXP_RANGE, "0.01,8192,0.01,or_greater"), "set_znear", "get_znear"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "far", PROPERTY_HINT_EXP_RANGE, "0.1,8192,0.1,or_greater"), "set_zfar", "get_zfar"); BIND_ENUM_CONSTANT(PROJECTION_PERSPECTIVE); BIND_ENUM_CONSTANT(PROJECTION_ORTHOGONAL); + BIND_ENUM_CONSTANT(PROJECTION_FRUSTUM); BIND_ENUM_CONSTANT(KEEP_WIDTH); BIND_ENUM_CONSTANT(KEEP_HEIGHT); @@ -543,6 +571,10 @@ float Camera::get_znear() const { return near; } +Vector2 Camera::get_frustum_offset() const { + return frustum_offset; +} + float Camera::get_zfar() const { return far; @@ -570,6 +602,11 @@ void Camera::set_znear(float p_znear) { _update_camera_mode(); } +void Camera::set_frustum_offset(Vector2 p_offset) { + frustum_offset = p_offset; + _update_camera_mode(); +} + void Camera::set_zfar(float p_zfar) { far = p_zfar; _update_camera_mode(); @@ -648,6 +685,7 @@ Camera::Camera() { camera = VisualServer::get_singleton()->camera_create(); size = 1; fov = 0; + frustum_offset = Vector2(); near = 0; far = 0; current = false; diff --git a/scene/3d/camera.h b/scene/3d/camera.h index a531324a85..fe8cb84f0d 100644 --- a/scene/3d/camera.h +++ b/scene/3d/camera.h @@ -46,7 +46,8 @@ public: enum Projection { PROJECTION_PERSPECTIVE, - PROJECTION_ORTHOGONAL + PROJECTION_ORTHOGONAL, + PROJECTION_FRUSTUM }; enum KeepAspect { @@ -68,6 +69,7 @@ private: float fov; float size; + Vector2 frustum_offset; float near, far; float v_offset; float h_offset; @@ -110,6 +112,7 @@ public: void set_perspective(float p_fovy_degrees, float p_z_near, float p_z_far); void set_orthogonal(float p_size, float p_z_near, float p_z_far); + void set_frustum(float p_size, Vector2 p_offset, float p_near, float p_far); void set_projection(Camera::Projection p_mode); void make_current(); @@ -123,12 +126,15 @@ public: float get_size() const; float get_zfar() const; float get_znear() const; + Vector2 get_frustum_offset() const; + Projection get_projection() const; void set_fov(float p_fov); void set_size(float p_size); void set_zfar(float p_zfar); void set_znear(float p_znear); + void set_frustum_offset(Vector2 p_offset); virtual Transform get_camera_transform() const; diff --git a/scene/3d/collision_shape.cpp b/scene/3d/collision_shape.cpp index ac33e2b714..6bb2b547c7 100644 --- a/scene/3d/collision_shape.cpp +++ b/scene/3d/collision_shape.cpp @@ -91,7 +91,7 @@ void CollisionShape::_notification(int p_what) { _update_in_shape_owner(); } if (get_tree()->is_debugging_collisions_hint()) { - _create_debug_shape(); + _update_debug_shape(); } } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { @@ -142,17 +142,24 @@ void CollisionShape::_bind_methods() { ClassDB::bind_method(D_METHOD("make_convex_from_brothers"), &CollisionShape::make_convex_from_brothers); ClassDB::set_method_flags("CollisionShape", "make_convex_from_brothers", METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); + ClassDB::bind_method(D_METHOD("_shape_changed"), &CollisionShape::_shape_changed); + ClassDB::bind_method(D_METHOD("_update_debug_shape"), &CollisionShape::_update_debug_shape); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape"), "set_shape", "get_shape"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); } void CollisionShape::set_shape(const Ref<Shape> &p_shape) { - if (!shape.is_null()) + if (!shape.is_null()) { shape->unregister_owner(this); + shape->disconnect("changed", this, "_shape_changed"); + } shape = p_shape; - if (!shape.is_null()) + if (!shape.is_null()) { shape->register_owner(this); + shape->connect("changed", this, "_shape_changed"); + } update_gizmo(); if (parent) { parent->shape_owner_clear_shapes(owner_id); @@ -161,6 +168,8 @@ void CollisionShape::set_shape(const Ref<Shape> &p_shape) { } } + if (is_inside_tree()) + _shape_changed(); update_configuration_warning(); } @@ -199,7 +208,8 @@ CollisionShape::~CollisionShape() { //VisualServer::get_singleton()->free(indicator); } -void CollisionShape::_create_debug_shape() { +void CollisionShape::_update_debug_shape() { + debug_shape_dirty = false; if (debug_shape) { debug_shape->queue_delete(); @@ -207,15 +217,19 @@ void CollisionShape::_create_debug_shape() { } Ref<Shape> s = get_shape(); - if (s.is_null()) return; Ref<Mesh> mesh = s->get_debug_mesh(); - MeshInstance *mi = memnew(MeshInstance); mi->set_mesh(mesh); - add_child(mi); debug_shape = mi; } + +void CollisionShape::_shape_changed() { + if (get_tree()->is_debugging_collisions_hint() && !debug_shape_dirty) { + debug_shape_dirty = true; + call_deferred("_update_debug_shape"); + } +} diff --git a/scene/3d/collision_shape.h b/scene/3d/collision_shape.h index 0c8e383a7f..98427b8590 100644 --- a/scene/3d/collision_shape.h +++ b/scene/3d/collision_shape.h @@ -45,12 +45,14 @@ class CollisionShape : public Spatial { CollisionObject *parent; Node *debug_shape; + bool debug_shape_dirty; void resource_changed(RES res); bool disabled; protected: - void _create_debug_shape(); + void _update_debug_shape(); + void _shape_changed(); void _update_in_shape_owner(bool p_xform_only = false); diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp index 469a1e87db..d4e242dcb7 100644 --- a/scene/3d/cpu_particles.cpp +++ b/scene/3d/cpu_particles.cpp @@ -1394,6 +1394,7 @@ CPUParticles::CPUParticles() { redraw = false; multimesh = VisualServer::get_singleton()->multimesh_create(); + VisualServer::get_singleton()->multimesh_set_visible_instances(multimesh, 0); set_base(multimesh); set_emitting(true); diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp index 190967d76c..84078911cb 100644 --- a/scene/3d/path.cpp +++ b/scene/3d/path.cpp @@ -173,7 +173,7 @@ void PathFollow::_update_transform() { float dot = t_prev.dot(t_cur); float angle = Math::acos(CLAMP(dot, -1, 1)); - if (likely(Math::abs(angle) > CMP_EPSILON)) { + if (likely(!Math::is_zero_approx(angle))) { if (rotation_mode == ROTATION_Y) { // assuming we're referring to global Y-axis. is this correct? axis.x = 0; @@ -184,7 +184,7 @@ void PathFollow::_update_transform() { // all components are allowed } - if (likely(axis.length() > CMP_EPSILON)) { + if (likely(!Math::is_zero_approx(axis.length()))) { t.rotate_basis(axis.normalized(), angle); } } @@ -193,7 +193,7 @@ void PathFollow::_update_transform() { float tilt_angle = c->interpolate_baked_tilt(o); Vector3 tilt_axis = t_cur; // not sure what tilt is supposed to do, is this correct?? - if (likely(Math::abs(tilt_angle) > CMP_EPSILON)) { + if (likely(!Math::is_zero_approx(Math::abs(tilt_angle)))) { if (rotation_mode == ROTATION_Y) { tilt_axis.x = 0; tilt_axis.z = 0; @@ -203,7 +203,7 @@ void PathFollow::_update_transform() { // all components are allowed } - if (likely(tilt_axis.length() > CMP_EPSILON)) { + if (likely(!Math::is_zero_approx(tilt_axis.length()))) { t.rotate_basis(tilt_axis.normalized(), tilt_angle); } } diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index 05214ed669..e2dc89aa6e 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -1203,9 +1203,6 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve if (collided) { found_collision = true; - } - - if (collided) { colliders.push_back(collision); motion = collision.remainder; diff --git a/scene/3d/skeleton.cpp b/scene/3d/skeleton.cpp index dafcf95b1f..15c089ec10 100644 --- a/scene/3d/skeleton.cpp +++ b/scene/3d/skeleton.cpp @@ -773,6 +773,8 @@ void Skeleton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_bone_rest", "bone_idx"), &Skeleton::get_bone_rest); ClassDB::bind_method(D_METHOD("set_bone_rest", "bone_idx", "rest"), &Skeleton::set_bone_rest); + ClassDB::bind_method(D_METHOD("localize_rests"), &Skeleton::localize_rests); + ClassDB::bind_method(D_METHOD("set_bone_disable_rest", "bone_idx", "disable"), &Skeleton::set_bone_disable_rest); ClassDB::bind_method(D_METHOD("is_bone_rest_disabled", "bone_idx"), &Skeleton::is_bone_rest_disabled); diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp index c7f7b14a8f..fde135c972 100644 --- a/scene/3d/vehicle_body.cpp +++ b/scene/3d/vehicle_body.cpp @@ -716,7 +716,7 @@ void VehicleBody::_update_friction(PhysicsDirectBodyState *s) { real_t rollingFriction = 0.f; if (wheelInfo.m_raycastInfo.m_isInContact) { - if (engine_force != 0.f) { + if (engine_force != 0.f && wheelInfo.engine_traction != false) { rollingFriction = -engine_force * s->get_step(); } else { real_t defaultRollingFrictionImpulse = 0.f; diff --git a/scene/3d/visual_instance.cpp b/scene/3d/visual_instance.cpp index 1bbf1b7bc7..1aded826c0 100644 --- a/scene/3d/visual_instance.cpp +++ b/scene/3d/visual_instance.cpp @@ -123,6 +123,8 @@ void VisualInstance::_bind_methods() { ClassDB::bind_method(D_METHOD("_get_visual_instance_rid"), &VisualInstance::_get_visual_instance_rid); ClassDB::bind_method(D_METHOD("set_base", "base"), &VisualInstance::set_base); + ClassDB::bind_method(D_METHOD("get_base"), &VisualInstance::get_base); + ClassDB::bind_method(D_METHOD("get_instance"), &VisualInstance::get_instance); ClassDB::bind_method(D_METHOD("set_layer_mask", "mask"), &VisualInstance::set_layer_mask); ClassDB::bind_method(D_METHOD("get_layer_mask"), &VisualInstance::get_layer_mask); ClassDB::bind_method(D_METHOD("set_layer_mask_bit", "layer", "enabled"), &VisualInstance::set_layer_mask_bit); @@ -136,6 +138,12 @@ void VisualInstance::_bind_methods() { void VisualInstance::set_base(const RID &p_base) { VisualServer::get_singleton()->instance_set_base(instance, p_base); + base = p_base; +} + +RID VisualInstance::get_base() const { + + return base; } VisualInstance::VisualInstance() { diff --git a/scene/3d/visual_instance.h b/scene/3d/visual_instance.h index 3b6fccf65f..f5b7479bb1 100644 --- a/scene/3d/visual_instance.h +++ b/scene/3d/visual_instance.h @@ -43,6 +43,7 @@ class VisualInstance : public Spatial { GDCLASS(VisualInstance, Spatial); OBJ_CATEGORY("3D Visual Nodes"); + RID base; RID instance; uint32_t layers; @@ -69,6 +70,7 @@ public: virtual AABB get_transformed_aabb() const; // helper void set_base(const RID &p_base); + RID get_base() const; void set_layer_mask(uint32_t p_mask); uint32_t get_layer_mask() const; diff --git a/scene/3d/voxel_light_baker.cpp b/scene/3d/voxel_light_baker.cpp index 750ed97ae6..75b419ca58 100644 --- a/scene/3d/voxel_light_baker.cpp +++ b/scene/3d/voxel_light_baker.cpp @@ -835,7 +835,7 @@ void VoxelLightBaker::plot_light_directional(const Vector3 &p_direction, const C for (int i = 0; i < 3; i++) { - if (ABS(light_axis[i]) < CMP_EPSILON) + if (Math::is_zero_approx(light_axis[i])) continue; clip[clip_planes].normal[i] = 1.0; @@ -978,7 +978,7 @@ void VoxelLightBaker::plot_light_omni(const Vector3 &p_pos, const Color &p_color for (int c = 0; c < 3; c++) { - if (ABS(light_axis[c]) < CMP_EPSILON) + if (Math::is_zero_approx(light_axis[c])) continue; clip[clip_planes].normal[c] = 1.0; @@ -1113,7 +1113,7 @@ void VoxelLightBaker::plot_light_spot(const Vector3 &p_pos, const Vector3 &p_axi for (int c = 0; c < 3; c++) { - if (ABS(light_axis[c]) < CMP_EPSILON) + if (Math::is_zero_approx(light_axis[c])) continue; clip[clip_planes].normal[c] = 1.0; diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index 13b8ebe12d..d1d3582c9d 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -891,7 +891,7 @@ void AnimationTree::_process_graph(float p_delta) { t->loc = Vector3(); t->rot = Quat(); t->rot_blend_accum = 0; - t->scale = Vector3(); + t->scale = Vector3(1, 1, 1); } float prev_time = time - delta; @@ -952,11 +952,9 @@ void AnimationTree::_process_graph(float p_delta) { t->loc = loc; t->rot = rot; t->rot_blend_accum = 0; - t->scale = Vector3(); + t->scale = scale; } - scale -= Vector3(1.0, 1.0, 1.0); //helps make it work properly with Add nodes - if (err != OK) continue; @@ -1241,8 +1239,6 @@ void AnimationTree::_process_graph(float p_delta) { Transform xform; xform.origin = t->loc; - t->scale += Vector3(1.0, 1.0, 1.0); //helps make it work properly with Add nodes and root motion - xform.basis.set_quat_scale(t->rot, t->scale); if (t->root_motion) { diff --git a/scene/audio/audio_stream_player.cpp b/scene/audio/audio_stream_player.cpp index 47278b8fc1..144e58d8b9 100644 --- a/scene/audio/audio_stream_player.cpp +++ b/scene/audio/audio_stream_player.cpp @@ -32,33 +32,10 @@ #include "core/engine.h" -void AudioStreamPlayer::_mix_internal(bool p_fadeout) { - - int bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus); - - //get data - AudioFrame *buffer = mix_buffer.ptrw(); - int buffer_size = mix_buffer.size(); - - if (p_fadeout) { - // Short fadeout ramp - buffer_size = MIN(buffer_size, 128); - } - - stream_playback->mix(buffer, pitch_scale, buffer_size); - - //multiply volume interpolating to avoid clicks if this changes - float target_volume = p_fadeout ? -80.0 : volume_db; - float vol = Math::db2linear(mix_volume_db); - float vol_inc = (Math::db2linear(target_volume) - vol) / float(buffer_size); - for (int i = 0; i < buffer_size; i++) { - buffer[i] *= vol; - vol += vol_inc; - } +void AudioStreamPlayer::_mix_to_bus(const AudioFrame *p_frames,int p_amount) { - //set volume for next mix - mix_volume_db = target_volume; + int bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus); AudioFrame *targets[4] = { NULL, NULL, NULL, NULL }; @@ -83,42 +60,84 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) { for (int c = 0; c < 4; c++) { if (!targets[c]) break; - for (int i = 0; i < buffer_size; i++) { - targets[c][i] += buffer[i]; + for (int i = 0; i < p_amount; i++) { + targets[c][i] += p_frames[i]; } } } + +void AudioStreamPlayer::_mix_internal(bool p_fadeout) { + + + //get data + AudioFrame *buffer = mix_buffer.ptrw(); + int buffer_size = mix_buffer.size(); + + if (p_fadeout) { + // Short fadeout ramp + buffer_size = MIN(buffer_size, 128); + } + + stream_playback->mix(buffer, pitch_scale, buffer_size); + + //multiply volume interpolating to avoid clicks if this changes + float target_volume = p_fadeout ? -80.0 : volume_db; + float vol = Math::db2linear(mix_volume_db); + float vol_inc = (Math::db2linear(target_volume) - vol) / float(buffer_size); + + for (int i = 0; i < buffer_size; i++) { + buffer[i] *= vol; + vol += vol_inc; + } + + //set volume for next mix + mix_volume_db = target_volume; + + _mix_to_bus(buffer,buffer_size); + +} + void AudioStreamPlayer::_mix_audio() { + if (use_fadeout) { + _mix_to_bus(fadeout_buffer.ptr(),fadeout_buffer.size()); + use_fadeout=false; + } + if (!stream_playback.is_valid() || !active || - (stream_paused && !stream_fade)) { + (stream_paused && !stream_paused_fade)) { return; } - if (stream_fade) { - _mix_internal(true); - stream_fade = false; - - if (stream_stop) { - stream_playback->stop(); - active = false; - set_process_internal(false); + if (stream_paused) { + if (stream_paused_fade) { + _mix_internal(true); + stream_paused_fade = false; } return; } - if (setseek >= 0.0) { + if (setstop) { + _mix_internal(true); + stream_playback->stop(); + setstop=false; + } + + if (setseek >= 0.0 && !stop_has_priority) { if (stream_playback->is_playing()) { //fade out to avoid pops _mix_internal(true); } + stream_playback->start(setseek); setseek = -1.0; //reset seek mix_volume_db = volume_db; //reset ramp } + stop_has_priority = false; + _mix_internal(false); } @@ -135,7 +154,7 @@ void AudioStreamPlayer::_notification(int p_what) { if (p_what == NOTIFICATION_INTERNAL_PROCESS) { if (!active || (setseek < 0 && !stream_playback->is_playing())) { - active = false; + active = false; set_process_internal(false); emit_signal("finished"); } @@ -162,6 +181,28 @@ void AudioStreamPlayer::set_stream(Ref<AudioStream> p_stream) { AudioServer::get_singleton()->lock(); + if (active && stream_playback.is_valid() && !stream_paused) { + //changing streams out of the blue is not a great idea, but at least + //lets try to somehow avoid a click + + AudioFrame *buffer = fadeout_buffer.ptrw(); + int buffer_size = fadeout_buffer.size(); + + stream_playback->mix(buffer, pitch_scale, buffer_size); + + //multiply volume interpolating to avoid clicks if this changes + float target_volume = -80.0; + float vol = Math::db2linear(mix_volume_db); + float vol_inc = (Math::db2linear(target_volume) - vol) / float(buffer_size); + + for (int i = 0; i < buffer_size; i++) { + buffer[i] *= vol; + vol += vol_inc; + } + + use_fadeout=true; + } + mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); if (stream_playback.is_valid()) { @@ -169,6 +210,7 @@ void AudioStreamPlayer::set_stream(Ref<AudioStream> p_stream) { stream.unref(); active = false; setseek = -1; + setstop = false; } if (p_stream.is_valid()) { @@ -209,8 +251,8 @@ void AudioStreamPlayer::play(float p_from_pos) { if (stream_playback.is_valid()) { //mix_volume_db = volume_db; do not reset volume ramp here, can cause clicks - stream_stop = false; setseek = p_from_pos; + stop_has_priority=false; active = true; set_process_internal(true); } @@ -225,16 +267,16 @@ void AudioStreamPlayer::seek(float p_seconds) { void AudioStreamPlayer::stop() { - if (stream_playback.is_valid()) { - stream_stop = true; - stream_fade = true; + if (stream_playback.is_valid() && active) { + setstop=true; + stop_has_priority=true; } } bool AudioStreamPlayer::is_playing() const { if (stream_playback.is_valid()) { - return active; //&& stream_playback->is_playing(); + return active && !setstop; //&& stream_playback->is_playing(); } return false; @@ -301,7 +343,7 @@ void AudioStreamPlayer::set_stream_paused(bool p_pause) { if (p_pause != stream_paused) { stream_paused = p_pause; - stream_fade = p_pause ? true : false; + stream_paused_fade = p_pause ? true : false; } } @@ -315,7 +357,7 @@ void AudioStreamPlayer::_validate_property(PropertyInfo &property) const { if (property.name == "bus") { String options; - for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { + for (int i = 0; i <AudioServer::get_singleton()->get_bus_count(); i++) { if (i > 0) options += ","; String name = AudioServer::get_singleton()->get_bus_name(i); @@ -397,9 +439,11 @@ AudioStreamPlayer::AudioStreamPlayer() { setseek = -1; active = false; stream_paused = false; - stream_fade = false; - stream_stop = false; + stream_paused_fade = false; mix_target = MIX_TARGET_STEREO; + fadeout_buffer.resize(512); + setstop=false; + use_fadeout=false; AudioServer::get_singleton()->connect("bus_layout_changed", this, "_bus_layout_changed"); } diff --git a/scene/audio/audio_stream_player.h b/scene/audio/audio_stream_player.h index 590bef95b0..0b782b67e7 100644 --- a/scene/audio/audio_stream_player.h +++ b/scene/audio/audio_stream_player.h @@ -49,17 +49,20 @@ private: Ref<AudioStreamPlayback> stream_playback; Ref<AudioStream> stream; Vector<AudioFrame> mix_buffer; + Vector<AudioFrame> fadeout_buffer; + bool use_fadeout; volatile float setseek; volatile bool active; + volatile bool setstop; + volatile bool stop_has_priority; float mix_volume_db; float pitch_scale; float volume_db; bool autoplay; bool stream_paused; - bool stream_fade; - bool stream_stop; + bool stream_paused_fade; StringName bus; MixTarget mix_target; @@ -72,6 +75,7 @@ private: bool _is_active() const; void _bus_layout_changed(); + void _mix_to_bus(const AudioFrame *p_frames, int p_amount); protected: void _validate_property(PropertyInfo &property) const; diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 806c8afa5b..d68cdd5f8d 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -59,7 +59,7 @@ void BaseButton::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - if (status.disabled || ((1 << (b->get_button_index() - 1)) & button_mask) == 0) + if (((1 << (b->get_button_index() - 1)) & button_mask) == 0) return; if (status.pressing_button) diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 7aca6acd00..accf8aa7c2 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -776,6 +776,12 @@ void ColorPickerButton::_notification(int p_what) { if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST && popup) { popup->hide(); } + + if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + if (popup && !is_visible_in_tree()) { + popup->hide(); + } + } } void ColorPickerButton::set_pick_color(const Color &p_color) { @@ -825,6 +831,8 @@ void ColorPickerButton::_update_picker() { add_child(popup); picker->connect("color_changed", this, "_color_changed"); popup->connect("modal_closed", this, "_modal_closed"); + popup->connect("about_to_show", this, "set_pressed", varray(true)); + popup->connect("popup_hide", this, "set_pressed", varray(false)); picker->set_pick_color(color); picker->set_edit_alpha(edit_alpha); } @@ -855,4 +863,6 @@ ColorPickerButton::ColorPickerButton() { picker = NULL; popup = NULL; edit_alpha = true; + + set_toggle_mode(true); } diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 30ad81bb2e..dabff08fea 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -1053,7 +1053,7 @@ void GraphEdit::set_connection_activity(const StringName &p_from, int p_from_por if (E->get().from == p_from && E->get().from_port == p_from_port && E->get().to == p_to && E->get().to_port == p_to_port) { - if (ABS(E->get().activity - p_activity) < CMP_EPSILON) { + if (Math::is_equal_approx(E->get().activity, p_activity)) { //update only if changed top_layer->update(); connections_layer->update(); diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 0c5dc39273..1e8d73b6a4 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -722,6 +722,8 @@ void LineEdit::_notification(int p_what) { } else { x_ofs = MAX(style->get_margin(MARGIN_LEFT), x_ofs - r_icon->get_width() - style->get_margin(MARGIN_RIGHT)); } + + ofs_max -= r_icon->get_width(); } int caret_height = font->get_height() > y_area ? y_area : font->get_height(); @@ -918,6 +920,10 @@ void LineEdit::undo() { TextOperation op = undo_stack_pos->get(); text = op.text; set_cursor_position(op.cursor_pos); + + if (expand_to_text_length) + minimum_size_changed(); + _emit_text_change(); } @@ -932,6 +938,10 @@ void LineEdit::redo() { TextOperation op = undo_stack_pos->get(); text = op.text; set_cursor_position(op.cursor_pos); + + if (expand_to_text_length) + minimum_size_changed(); + _emit_text_change(); } @@ -1159,8 +1169,10 @@ void LineEdit::set_cursor_position(int p_pos) { } else if (cursor_pos > window_pos) { /* Adjust window if cursor goes too much to the right */ int window_width = get_size().width - style->get_minimum_size().width; - if (right_icon.is_valid()) { - window_width -= right_icon->get_width(); + bool display_clear_icon = !text.empty() && is_editable() && clear_button_enabled; + if (right_icon.is_valid() || display_clear_icon) { + Ref<Texture> r_icon = display_clear_icon ? Control::get_icon("clear") : right_icon; + window_width -= r_icon->get_width(); } if (window_width < 0) diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp index b67d8c00d6..5f21d73ab2 100644 --- a/scene/gui/menu_button.cpp +++ b/scene/gui/menu_button.cpp @@ -91,6 +91,16 @@ bool MenuButton::is_switch_on_hover() { return switch_on_hover; } +void MenuButton::_notification(int p_what) { + + if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + + if (!is_visible_in_tree()) { + popup->hide(); + } + } +} + void MenuButton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_popup"), &MenuButton::get_popup); @@ -116,15 +126,19 @@ MenuButton::MenuButton() { switch_on_hover = false; set_flat(true); + set_toggle_mode(true); set_disable_shortcuts(false); set_enabled_focus_mode(FOCUS_NONE); + set_process_unhandled_key_input(true); + set_action_mode(ACTION_MODE_BUTTON_PRESS); + popup = memnew(PopupMenu); popup->hide(); add_child(popup); popup->set_as_toplevel(true); popup->set_pass_on_modal_close_click(false); - set_process_unhandled_key_input(true); - set_action_mode(ACTION_MODE_BUTTON_PRESS); + popup->connect("about_to_show", this, "set_pressed", varray(true)); // For when switching from another MenuButton. + popup->connect("popup_hide", this, "set_pressed", varray(false)); } MenuButton::~MenuButton() { diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h index 794840035e..42e909d991 100644 --- a/scene/gui/menu_button.h +++ b/scene/gui/menu_button.h @@ -52,6 +52,7 @@ class MenuButton : public Button { void _gui_input(Ref<InputEvent> p_event); protected: + void _notification(int p_what); static void _bind_methods(); public: diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index b9b270ce0c..8c75393d01 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -72,6 +72,11 @@ void OptionButton::_notification(int p_what) { Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2))); arrow->draw(ci, ofs, clr); + } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + + if (!is_visible_in_tree()) { + popup->hide(); + } } } @@ -340,6 +345,7 @@ void OptionButton::_bind_methods() { OptionButton::OptionButton() { current = -1; + set_toggle_mode(true); set_text_align(ALIGN_LEFT); set_action_mode(ACTION_MODE_BUTTON_PRESS); @@ -350,6 +356,7 @@ OptionButton::OptionButton() { popup->set_pass_on_modal_close_click(false); popup->connect("id_pressed", this, "_selected"); popup->connect("id_focused", this, "_focused"); + popup->connect("popup_hide", this, "set_pressed", varray(false)); } OptionButton::~OptionButton() { diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 94c73b2e42..23c61f37d6 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -239,7 +239,7 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { for (int i = search_from; i >= 0; i--) { - if (i < 0 || i >= items.size()) + if (i >= items.size()) continue; if (!items[i].separator && !items[i].disabled) { diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 3fbf809012..101eb2ac88 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -753,6 +753,8 @@ void RichTextLabel::_scroll_changed(double) { else scroll_following = false; + scroll_updated = true; + update(); } @@ -778,7 +780,6 @@ void RichTextLabel::_update_scroll() { main->first_invalid_line = 0; //invalidate ALL _validate_line_caches(main); } - scroll_updated = true; } void RichTextLabel::_notification(int p_what) { @@ -901,13 +902,21 @@ void RichTextLabel::_find_click(ItemFrame *p_frame, const Point2i &p_click, Item Control::CursorShape RichTextLabel::get_cursor_shape(const Point2 &p_pos) const { - if (selection.click) + if (!underline_meta || selection.click) return CURSOR_ARROW; if (main->first_invalid_line < main->lines.size()) return CURSOR_ARROW; //invalid - return get_default_cursor_shape(); + int line = 0; + Item *item = NULL; + + ((RichTextLabel *)(this))->_find_click(main, p_pos, &item, &line); + + if (item && ((RichTextLabel *)(this))->_find_meta(item, NULL)) + return CURSOR_POINTING_HAND; + + return CURSOR_ARROW; } void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { @@ -1997,7 +2006,7 @@ bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p Item *it = main; int charidx = 0; - if (p_from_selection && selection.active && selection.enabled) { + if (p_from_selection && selection.active) { it = selection.to; charidx = selection.to_char + 1; } diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 39a0b0aaf2..c77705f35f 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -350,6 +350,10 @@ void TextEdit::_update_scrollbars() { total_width += cache.breakpoint_gutter_width; } + if (draw_info_gutter) { + total_width += cache.info_gutter_width; + } + if (draw_fold_gutter) { total_width += cache.fold_gutter_width; } @@ -608,6 +612,13 @@ void TextEdit::_notification(int p_what) { cache.breakpoint_gutter_width = 0; } + if (draw_info_gutter) { + info_gutter_width = (get_row_height()); + cache.info_gutter_width = info_gutter_width; + } else { + cache.info_gutter_width = 0; + } + if (draw_fold_gutter) { fold_gutter_width = (get_row_height() * 55) / 100; cache.fold_gutter_width = fold_gutter_width; @@ -637,7 +648,7 @@ void TextEdit::_notification(int p_what) { RID ci = get_canvas_item(); VisualServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), true); - int xmargin_beg = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width; + int xmargin_beg = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width; int xmargin_end = size.width - cache.style_normal->get_margin(MARGIN_RIGHT); //let's do it easy for now: cache.style_normal->draw(ci, Rect2(Point2(), size)); @@ -952,10 +963,53 @@ void TextEdit::_notification(int p_what) { } } + // draw info icons + if (draw_info_gutter && text.has_info_icon(line)) { + int vertical_gap = (get_row_height() * 40) / 100; + int horizontal_gap = (cache.info_gutter_width * 30) / 100; + int gutter_left = cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width; + + Ref<Texture> info_icon = text.get_info_icon(line); + // ensure the icon fits the gutter size + Size2i icon_size = info_icon->get_size(); + if (icon_size.width > cache.info_gutter_width - horizontal_gap) { + icon_size.width = cache.info_gutter_width - horizontal_gap; + } + if (icon_size.height > get_row_height() - horizontal_gap) { + icon_size.height = get_row_height() - horizontal_gap; + } + + Size2i icon_pos; + int xofs = horizontal_gap - (info_icon->get_width() / 4); + int yofs = vertical_gap - (info_icon->get_height() / 4); + icon_pos.x = gutter_left + xofs + ofs_x; + icon_pos.y = ofs_y + yofs; + + draw_texture_rect(info_icon, Rect2(icon_pos, icon_size)); + } + + // draw execution marker + if (executing_line == line) { + if (draw_breakpoint_gutter) { + int icon_extra_size = 4; + int vertical_gap = (get_row_height() * 40) / 100; + int horizontal_gap = (cache.breakpoint_gutter_width * 30) / 100; + int marker_height = get_row_height() - (vertical_gap * 2) + icon_extra_size; + int marker_width = cache.breakpoint_gutter_width - (horizontal_gap * 2) + icon_extra_size; + cache.executing_icon->draw_rect(ci, Rect2(cache.style_normal->get_margin(MARGIN_LEFT) + horizontal_gap - 2 - icon_extra_size / 2, ofs_y + vertical_gap - icon_extra_size / 2, marker_width, marker_height), false, Color(cache.executing_line_color.r, cache.executing_line_color.g, cache.executing_line_color.b)); + } else { +#ifdef TOOLS_ENABLED + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y + get_row_height() - EDSCALE, xmargin_end - xmargin_beg, EDSCALE), cache.executing_line_color); +#else + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.executing_line_color); +#endif + } + } + // draw fold markers if (draw_fold_gutter) { int horizontal_gap = (cache.fold_gutter_width * 30) / 100; - int gutter_left = cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + cache.line_number_w; + int gutter_left = cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + cache.line_number_w + cache.info_gutter_width; if (is_folded(line)) { int xofs = horizontal_gap - (cache.can_fold_icon->get_width()) / 2; int yofs = (get_row_height() - cache.folded_icon->get_height()) / 2; @@ -975,7 +1029,7 @@ void TextEdit::_notification(int p_what) { fc = line_num_padding + fc; } - cache.font->draw(ci, Point2(cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + ofs_x, yofs + cache.font->get_ascent()), fc, text.is_safe(line) ? cache.safe_line_number_color : cache.line_number_color); + cache.font->draw(ci, Point2(cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + cache.info_gutter_width + ofs_x, yofs + cache.font->get_ascent()), fc, text.is_safe(line) ? cache.safe_line_number_color : cache.line_number_color); } } @@ -1566,6 +1620,10 @@ void TextEdit::backspace_at_cursor() { set_line_as_breakpoint(prev_line, true); } + if (text.has_info_icon(cursor.line)) { + set_line_info_icon(prev_line, text.get_info_icon(cursor.line), text.get_info(cursor.line)); + } + if (auto_brace_completion_enabled && cursor.column > 0 && _is_pair_left_symbol(text[cursor.line][cursor.column - 1])) { @@ -1718,7 +1776,7 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co col = text[row].size(); } else { - int colx = p_mouse.x - (cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width); + int colx = p_mouse.x - (cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width); colx += cursor.x_ofs; col = get_char_pos_for_line(colx, row, wrap_index); if (is_wrap_enabled() && wrap_index < times_line_wraps(row)) { @@ -1816,18 +1874,28 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // toggle breakpoint on gutter click if (draw_breakpoint_gutter) { int gutter = cache.style_normal->get_margin(MARGIN_LEFT); - if (mb->get_position().x > gutter && mb->get_position().x <= gutter + cache.breakpoint_gutter_width + 3) { + if (mb->get_position().x > gutter - 6 && mb->get_position().x <= gutter + cache.breakpoint_gutter_width - 3) { set_line_as_breakpoint(row, !is_line_set_as_breakpoint(row)); emit_signal("breakpoint_toggled", row); return; } } + // emit info clicked + if (draw_info_gutter && text.has_info_icon(row)) { + int left_margin = cache.style_normal->get_margin(MARGIN_LEFT); + int gutter_left = left_margin + cache.breakpoint_gutter_width; + if (mb->get_position().x > gutter_left - 6 && mb->get_position().x <= gutter_left + cache.info_gutter_width - 3) { + emit_signal("info_clicked", row, text.get_info(row)); + return; + } + } + // toggle fold on gutter click if can if (draw_fold_gutter) { int left_margin = cache.style_normal->get_margin(MARGIN_LEFT); - int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.line_number_w; + int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.line_number_w + cache.info_gutter_width; if (mb->get_position().x > gutter_left - 6 && mb->get_position().x <= gutter_left + cache.fold_gutter_width - 3) { if (is_folded(row)) { unfold_line(row); @@ -1841,7 +1909,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // unfold on folded icon click if (is_folded(row)) { int line_width = text.get_line_width(row); - line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width - cursor.x_ofs; + line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.info_gutter_width + cache.fold_gutter_width - cursor.x_ofs; if (mb->get_position().x > line_width - 3 && mb->get_position().x <= line_width + cache.folded_eol_icon->get_width() + 3) { unfold_line(row); return; @@ -3374,8 +3442,11 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i if (shift_first_line) { text.set_breakpoint(p_line + 1, text.is_breakpoint(p_line)); text.set_hidden(p_line + 1, text.is_hidden(p_line)); + text.set_info_icon(p_line + 1, text.get_info_icon(p_line), text.get_info(p_line)); + text.set_breakpoint(p_line, false); text.set_hidden(p_line, false); + text.set_info_icon(p_line, NULL, ""); } text.set_line_wrap_amount(p_line, -1); @@ -3628,7 +3699,7 @@ int TextEdit::get_total_visible_rows() const { void TextEdit::_update_wrap_at() { - wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - wrap_right_offset; + wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - wrap_right_offset; update_cursor_wrap_offset(); text.clear_wrap_cache(); @@ -3662,7 +3733,7 @@ void TextEdit::adjust_viewport_to_cursor() { set_line_as_last_visible(cur_line, cur_wrap); } - int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width; + int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width; if (v_scroll->is_visible_in_tree()) visible_width -= v_scroll->get_combined_minimum_size().width; visible_width -= 20; // give it a little more space @@ -3693,7 +3764,7 @@ void TextEdit::center_viewport_to_cursor() { unfold_line(cursor.line); set_line_as_center_visible(cursor.line, get_cursor_wrap_index()); - int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width; + int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width; if (v_scroll->is_visible_in_tree()) visible_width -= v_scroll->get_combined_minimum_size().width; visible_width -= 20; // give it a little more space @@ -4132,7 +4203,7 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { if (highlighted_word != String()) return CURSOR_POINTING_HAND; - int gutter = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width; + int gutter = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width; if ((completion_active && completion_rect.has_point(p_pos))) { return CURSOR_ARROW; } @@ -4143,18 +4214,27 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { int left_margin = cache.style_normal->get_margin(MARGIN_LEFT); // breakpoint icon - if (draw_breakpoint_gutter && p_pos.x > left_margin && p_pos.x <= left_margin + cache.breakpoint_gutter_width + 3) { + if (draw_breakpoint_gutter && p_pos.x > left_margin - 6 && p_pos.x <= left_margin + cache.breakpoint_gutter_width - 3) { return CURSOR_POINTING_HAND; } + // info icons + int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.info_gutter_width; + if (draw_info_gutter && p_pos.x > left_margin + cache.breakpoint_gutter_width - 6 && p_pos.x <= gutter_left - 3) { + if (text.has_info_icon(row)) { + return CURSOR_POINTING_HAND; + } + return CURSOR_ARROW; + } + // fold icon - int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.line_number_w; - if (draw_fold_gutter && p_pos.x > gutter_left - 6 && p_pos.x <= gutter_left + cache.fold_gutter_width - 3) { + if (draw_fold_gutter && p_pos.x > gutter_left + cache.line_number_w - 6 && p_pos.x <= gutter_left + cache.line_number_w + cache.fold_gutter_width - 3) { if (is_folded(row) || can_fold(row)) return CURSOR_POINTING_HAND; else return CURSOR_ARROW; } + return CURSOR_ARROW; } else { int row, col; @@ -4162,7 +4242,7 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { // eol fold icon if (is_folded(row)) { int line_width = text.get_line_width(row); - line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width - cursor.x_ofs; + line_width += cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width - cursor.x_ofs; if (p_pos.x > line_width - 3 && p_pos.x <= line_width + cache.folded_eol_icon->get_width() + 3) { return CURSOR_POINTING_HAND; } @@ -4352,6 +4432,7 @@ void TextEdit::_update_caches() { cache.current_line_color = get_color("current_line_color"); cache.line_length_guideline_color = get_color("line_length_guideline_color"); cache.breakpoint_color = get_color("breakpoint_color"); + cache.executing_line_color = get_color("executing_line_color"); cache.code_folding_color = get_color("code_folding_color"); cache.brace_mismatch_color = get_color("brace_mismatch_color"); cache.word_highlighted_color = get_color("word_highlighted_color"); @@ -4366,9 +4447,10 @@ void TextEdit::_update_caches() { #endif cache.row_height = cache.font->get_height() + cache.line_spacing; cache.tab_icon = get_icon("tab"); - cache.folded_icon = get_icon("GuiTreeArrowRight", "EditorIcons"); - cache.can_fold_icon = get_icon("GuiTreeArrowDown", "EditorIcons"); + cache.folded_icon = get_icon("folded"); + cache.can_fold_icon = get_icon("fold"); cache.folded_eol_icon = get_icon("GuiEllipsis", "EditorIcons"); + cache.executing_icon = get_icon("MainPlay", "EditorIcons"); text.set_font(cache.font); if (syntax_highlighter) { @@ -4934,6 +5016,17 @@ bool TextEdit::is_line_set_as_safe(int p_line) const { return text.is_safe(p_line); } +void TextEdit::set_executing_line(int p_line) { + ERR_FAIL_INDEX(p_line, text.size()); + executing_line = p_line; + update(); +} + +void TextEdit::clear_executing_line() { + executing_line = -1; + update(); +} + bool TextEdit::is_line_set_as_breakpoint(int p_line) const { ERR_FAIL_INDEX_V(p_line, text.size(), false); @@ -4973,6 +5066,19 @@ void TextEdit::remove_breakpoints() { } } +void TextEdit::set_line_info_icon(int p_line, Ref<Texture> p_icon, String p_info) { + ERR_FAIL_INDEX(p_line, text.size()); + text.set_info_icon(p_line, p_icon, p_info); + update(); +} + +void TextEdit::clear_info_icons() { + for (int i = 0; i < text.size(); i++) { + text.set_info_icon(i, NULL, ""); + } + update(); +} + void TextEdit::set_line_as_hidden(int p_line, bool p_hidden) { ERR_FAIL_INDEX(p_line, text.size()); @@ -5189,6 +5295,17 @@ bool TextEdit::is_folded(int p_line) const { return false; } +Vector<int> TextEdit::get_folded_lines() const { + Vector<int> folded_lines; + + for (int i = 0; i < text.size(); i++) { + if (is_folded(i)) { + folded_lines.push_back(i); + } + } + return folded_lines; +} + void TextEdit::fold_line(int p_line) { ERR_FAIL_INDEX(p_line, text.size()); @@ -5329,6 +5446,9 @@ void TextEdit::undo() { TextOperation op = undo_stack_pos->get(); _do_text_op(op, true); + if (op.from_line != op.to_line || op.to_column != op.from_column + 1) + select(op.from_line, op.from_column, op.to_line, op.to_column); + current_op.version = op.prev_version; if (undo_stack_pos->get().chain_backward) { while (true) { @@ -5455,6 +5575,7 @@ int TextEdit::get_indent_size() { void TextEdit::set_draw_tabs(bool p_draw) { draw_tabs = p_draw; + update(); } bool TextEdit::is_drawing_tabs() const { @@ -5999,6 +6120,24 @@ int TextEdit::get_fold_gutter_width() const { return cache.fold_gutter_width; } +void TextEdit::set_draw_info_gutter(bool p_draw) { + draw_info_gutter = p_draw; + update(); +} + +bool TextEdit::is_drawing_info_gutter() const { + return draw_info_gutter; +} + +void TextEdit::set_info_gutter_width(int p_gutter_width) { + info_gutter_width = p_gutter_width; + update(); +} + +int TextEdit::get_info_gutter_width() const { + return info_gutter_width; +} + void TextEdit::set_hiding_enabled(int p_enabled) { if (!p_enabled) unhide_all_lines(); @@ -6155,8 +6294,12 @@ void TextEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("set_show_line_numbers", "enable"), &TextEdit::set_show_line_numbers); ClassDB::bind_method(D_METHOD("is_show_line_numbers_enabled"), &TextEdit::is_show_line_numbers_enabled); + ClassDB::bind_method(D_METHOD("set_draw_tabs"), &TextEdit::set_draw_tabs); + ClassDB::bind_method(D_METHOD("is_drawing_tabs"), &TextEdit::is_drawing_tabs); ClassDB::bind_method(D_METHOD("set_breakpoint_gutter_enabled", "enable"), &TextEdit::set_breakpoint_gutter_enabled); ClassDB::bind_method(D_METHOD("is_breakpoint_gutter_enabled"), &TextEdit::is_breakpoint_gutter_enabled); + ClassDB::bind_method(D_METHOD("set_draw_fold_gutter"), &TextEdit::set_draw_fold_gutter); + ClassDB::bind_method(D_METHOD("is_drawing_fold_gutter"), &TextEdit::is_drawing_fold_gutter); ClassDB::bind_method(D_METHOD("set_hiding_enabled", "enable"), &TextEdit::set_hiding_enabled); ClassDB::bind_method(D_METHOD("is_hiding_enabled"), &TextEdit::is_hiding_enabled); @@ -6203,7 +6346,9 @@ void TextEdit::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "highlight_current_line"), "set_highlight_current_line", "is_highlight_current_line_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "syntax_highlighting"), "set_syntax_coloring", "is_syntax_coloring_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_line_numbers"), "set_show_line_numbers", "is_show_line_numbers_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_tabs"), "set_draw_tabs", "is_drawing_tabs"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "breakpoint_gutter"), "set_breakpoint_gutter_enabled", "is_breakpoint_gutter_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fold_gutter"), "set_draw_fold_gutter", "is_drawing_fold_gutter"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "highlight_all_occurrences"), "set_highlight_all_occurrences", "is_highlight_all_occurrences_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "override_selected_font_color"), "set_override_selected_font_color", "is_overriding_selected_font_color"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled"); @@ -6224,6 +6369,7 @@ void TextEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("request_completion")); ADD_SIGNAL(MethodInfo("breakpoint_toggled", PropertyInfo(Variant::INT, "row"))); ADD_SIGNAL(MethodInfo("symbol_lookup", PropertyInfo(Variant::STRING, "symbol"), PropertyInfo(Variant::INT, "row"), PropertyInfo(Variant::INT, "column"))); + ADD_SIGNAL(MethodInfo("info_clicked", PropertyInfo(Variant::INT, "row"), PropertyInfo(Variant::STRING, "info"))); BIND_ENUM_CONSTANT(MENU_CUT); BIND_ENUM_CONSTANT(MENU_COPY); @@ -6259,6 +6405,8 @@ TextEdit::TextEdit() { breakpoint_gutter_width = 0; cache.fold_gutter_width = 0; fold_gutter_width = 0; + info_gutter_width = 0; + cache.info_gutter_width = 0; set_default_cursor_shape(CURSOR_IBEAM); indent_size = 4; @@ -6331,6 +6479,7 @@ TextEdit::TextEdit() { line_length_guideline_col = 80; draw_breakpoint_gutter = false; draw_fold_gutter = false; + draw_info_gutter = false; hiding_enabled = false; next_operation_is_complex = false; scroll_past_end_of_file_enabled = false; @@ -6363,6 +6512,8 @@ TextEdit::TextEdit() { menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z); menu->connect("id_pressed", this, "menu_option"); first_draw = true; + + executing_line = -1; } TextEdit::~TextEdit() { diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index 96b409c6d4..4badd85e07 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -79,6 +79,8 @@ public: bool safe : 1; int wrap_amount_cache : 24; Map<int, ColorRegionInfo> region_info; + Ref<Texture> info_icon; + String info; String data; }; @@ -109,6 +111,13 @@ public: bool is_hidden(int p_line) const { return text[p_line].hidden; } void set_safe(int p_line, bool p_safe) { text.write[p_line].safe = p_safe; } bool is_safe(int p_line) const { return text[p_line].safe; } + void set_info_icon(int p_line, Ref<Texture> p_icon, String p_info) { + text.write[p_line].info_icon = p_icon; + text.write[p_line].info = p_info; + } + bool has_info_icon(int p_line) const { return text[p_line].info_icon.is_valid(); } + const Ref<Texture> &get_info_icon(int p_line) const { return text[p_line].info_icon; } + const String &get_info(int p_line) const { return text[p_line].info; } void insert(int p_at, const String &p_text); void remove(int p_at); int size() const { return text.size(); } @@ -157,6 +166,7 @@ private: Ref<Texture> can_fold_icon; Ref<Texture> folded_icon; Ref<Texture> folded_eol_icon; + Ref<Texture> executing_icon; Ref<StyleBox> style_normal; Ref<StyleBox> style_focus; Ref<StyleBox> style_readonly; @@ -178,6 +188,7 @@ private: Color selection_color; Color mark_color; Color breakpoint_color; + Color executing_line_color; Color code_folding_color; Color current_line_color; Color line_length_guideline_color; @@ -193,6 +204,7 @@ private: int line_number_w; int breakpoint_gutter_width; int fold_gutter_width; + int info_gutter_width; } cache; Map<int, int> color_region_cache; @@ -291,6 +303,8 @@ private: bool draw_fold_gutter; int fold_gutter_width; bool hiding_enabled; + bool draw_info_gutter; + int info_gutter_width; bool highlight_all_occurrences; bool scroll_past_end_of_file_enabled; @@ -333,6 +347,8 @@ private: bool context_menu_enabled; + int executing_line; + int get_visible_rows() const; int get_total_visible_rows() const; @@ -474,12 +490,17 @@ public: void set_line_as_marked(int p_line, bool p_marked); void set_line_as_breakpoint(int p_line, bool p_breakpoint); bool is_line_set_as_breakpoint(int p_line) const; + void set_executing_line(int p_line); + void clear_executing_line(); void set_line_as_safe(int p_line, bool p_safe); bool is_line_set_as_safe(int p_line) const; void get_breakpoints(List<int> *p_breakpoints) const; Array get_breakpoints_array() const; void remove_breakpoints(); + void set_line_info_icon(int p_line, Ref<Texture> p_icon, String p_info = ""); + void clear_info_icons(); + void set_line_as_hidden(int p_line, bool p_hidden); bool is_line_hidden(int p_line) const; void fold_all_lines(); @@ -490,6 +511,7 @@ public: bool can_fold(int p_line) const; bool is_folded(int p_line) const; + Vector<int> get_folded_lines() const; void fold_line(int p_line); void unfold_line(int p_line); void toggle_fold_line(int p_line); @@ -650,6 +672,12 @@ public: void set_fold_gutter_width(int p_gutter_width); int get_fold_gutter_width() const; + void set_draw_info_gutter(bool p_draw); + bool is_drawing_info_gutter() const; + + void set_info_gutter_width(int p_gutter_width); + int get_info_gutter_width() const; + void set_hiding_enabled(int p_enabled); int is_hiding_enabled() const; diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 7e59606d2b..f22fe5b6a5 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -3938,7 +3938,6 @@ Tree::Tree() { cache.click_item = NULL; cache.click_column = 0; cache.hover_cell = -1; - cache.hover_index = -1; last_keypress = 0; focus_in_id = 0; diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index 8b68b3215c..e65314644e 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -286,7 +286,7 @@ bool HTTPRequest::_update_connection() { call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, PoolByteArray()); return true; } - if (got_response && body_len < 0) { + if (body_len < 0) { // Chunked transfer is done call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, body); return true; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index cbe700c826..0465ffe442 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -41,6 +41,8 @@ VARIANT_ENUM_CAST(Node::PauseMode); +int Node::orphan_node_count = 0; + void Node::_notification(int p_notification) { switch (p_notification) { @@ -84,11 +86,14 @@ void Node::_notification(int p_notification) { add_to_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id())); get_tree()->node_count++; + orphan_node_count--; } break; case NOTIFICATION_EXIT_TREE: { get_tree()->node_count--; + orphan_node_count++; + if (data.input) remove_from_group("_vp_input" + itos(get_viewport()->get_instance_id())); if (data.unhandled_input) @@ -2938,6 +2943,8 @@ Node::Node() { data.use_placeholder = false; data.display_folded = false; data.ready_first = true; + + orphan_node_count++; } Node::~Node() { @@ -2948,6 +2955,8 @@ Node::~Node() { ERR_FAIL_COND(data.parent); ERR_FAIL_COND(data.children.size()); + + orphan_node_count--; } //////////////////////////////// diff --git a/scene/main/node.h b/scene/main/node.h index b490db37c5..9b9ca06455 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -75,6 +75,8 @@ public: bool operator()(const Node *p_a, const Node *p_b) const { return p_b->data.process_priority == p_a->data.process_priority ? p_b->is_greater_than(p_a) : p_b->data.process_priority > p_a->data.process_priority; } }; + static int orphan_node_count; + private: struct GroupData { diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 81c38cec89..125e0a2882 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -1160,7 +1160,7 @@ void SceneTree::_update_root_rect() { WARN_PRINT("Font oversampling only works with the resize modes 'Keep Width', 'Keep Height', and 'Expand'."); } - if (stretch_aspect == STRETCH_ASPECT_IGNORE || ABS(viewport_aspect - video_mode_aspect) < CMP_EPSILON) { + if (stretch_aspect == STRETCH_ASPECT_IGNORE || Math::is_equal_approx(viewport_aspect, video_mode_aspect)) { //same aspect or ignore aspect viewport_size = desired_res; screen_size = video_mode; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 52f63ddc1d..ae2c571201 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -2482,11 +2482,7 @@ void Viewport::_gui_hid_control(Control *p_control) { if (gui.mouse_over == p_control) gui.mouse_over = NULL; if (gui.tooltip == p_control) - gui.tooltip = NULL; - if (gui.tooltip == p_control) { - gui.tooltip = NULL; _gui_cancel_tooltip(); - } } void Viewport::_gui_remove_control(Control *p_control) { diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 9face3e476..47f5b152f0 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -782,7 +782,11 @@ void unregister_scene_types() { ResourceLoader::remove_resource_format_loader(resource_loader_bmfont); resource_loader_bmfont.unref(); + //SpatialMaterial is not initialised when 3D is disabled, so it shouldn't be cleaned up either +#ifndef _3D_DISABLED SpatialMaterial::finish_shaders(); +#endif // _3D_DISABLED + ParticlesMaterial::finish_shaders(); CanvasItemMaterial::finish_shaders(); SceneStringNames::free(); diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index e58ec9d71e..9c79b2ba3b 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -1477,7 +1477,7 @@ int Animation::_find(const Vector<K> &p_keys, float p_time) const { middle = (low + high) / 2; - if (Math::abs(p_time - keys[middle].time) < CMP_EPSILON) { //match + if (Math::is_equal_approx(p_time, keys[middle].time)) { //match return middle; } else if (p_time < keys[middle].time) high = middle - 1; //search low end of array @@ -1680,10 +1680,10 @@ T Animation::_interpolate(const Vector<TKey<T> > &p_keys, float p_time, Interpol float delta = p_keys[next].time - p_keys[idx].time; float from = p_time - p_keys[idx].time; - if (Math::absf(delta) > CMP_EPSILON) - c = from / delta; - else + if (Math::is_zero_approx(delta)) c = 0; + else + c = from / delta; } else { @@ -1691,10 +1691,10 @@ T Animation::_interpolate(const Vector<TKey<T> > &p_keys, float p_time, Interpol float delta = (length - p_keys[idx].time) + p_keys[next].time; float from = p_time - p_keys[idx].time; - if (Math::absf(delta) > CMP_EPSILON) - c = from / delta; - else + if (Math::is_zero_approx(delta)) c = 0; + else + c = from / delta; } } else { @@ -1707,10 +1707,10 @@ T Animation::_interpolate(const Vector<TKey<T> > &p_keys, float p_time, Interpol float delta = endtime + p_keys[next].time; float from = endtime + p_time; - if (Math::absf(delta) > CMP_EPSILON) - c = from / delta; - else + if (Math::is_zero_approx(delta)) c = 0; + else + c = from / delta; } } else { // no loop @@ -1723,10 +1723,10 @@ T Animation::_interpolate(const Vector<TKey<T> > &p_keys, float p_time, Interpol float delta = p_keys[next].time - p_keys[idx].time; float from = p_time - p_keys[idx].time; - if (Math::absf(delta) > CMP_EPSILON) - c = from / delta; - else + if (Math::is_zero_approx(delta)) c = 0; + else + c = from / delta; } else { @@ -2774,9 +2774,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons const Vector3 &v1 = t1.value.loc; const Vector3 &v2 = t2.value.loc; - if (v0.distance_to(v2) < CMP_EPSILON) { + if (Math::is_zero_approx(v0.distance_to(v2))) { //0 and 2 are close, let's see if 1 is close - if (v0.distance_to(v1) > CMP_EPSILON) { + if (!Math::is_zero_approx(v0.distance_to(v1))) { //not close, not optimizable return false; } @@ -2813,9 +2813,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons //localize both to rotation from q0 - if ((q0 - q2).length() < CMP_EPSILON) { + if (Math::is_zero_approx((q0 - q2).length())) { - if ((q0 - q1).length() > CMP_EPSILON) + if (!Math::is_zero_approx((q0 - q1).length())) return false; } else { @@ -2863,9 +2863,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons const Vector3 &v1 = t1.value.scale; const Vector3 &v2 = t2.value.scale; - if (v0.distance_to(v2) < CMP_EPSILON) { + if (Math::is_zero_approx(v0.distance_to(v2))) { //0 and 2 are close, let's see if 1 is close - if (v0.distance_to(v1) > CMP_EPSILON) { + if (!Math::is_zero_approx(v0.distance_to(v1))) { //not close, not optimizable return false; } diff --git a/scene/resources/box_shape.cpp b/scene/resources/box_shape.cpp index d93754076c..d819e9f776 100644 --- a/scene/resources/box_shape.cpp +++ b/scene/resources/box_shape.cpp @@ -51,6 +51,7 @@ Vector<Vector3> BoxShape::_gen_debug_mesh_lines() { void BoxShape::_update_shape() { PhysicsServer::get_singleton()->shape_set_data(get_shape(), extents); + Shape::_update_shape(); } void BoxShape::set_extents(const Vector3 &p_extents) { diff --git a/scene/resources/capsule_shape.cpp b/scene/resources/capsule_shape.cpp index 3f7bf1e0ec..669b261bfe 100644 --- a/scene/resources/capsule_shape.cpp +++ b/scene/resources/capsule_shape.cpp @@ -75,6 +75,7 @@ void CapsuleShape::_update_shape() { d["radius"] = radius; d["height"] = height; PhysicsServer::get_singleton()->shape_set_data(get_shape(), d); + Shape::_update_shape(); } void CapsuleShape::set_radius(float p_radius) { diff --git a/scene/resources/concave_polygon_shape.cpp b/scene/resources/concave_polygon_shape.cpp index b192d088d8..b4cc38c8c0 100644 --- a/scene/resources/concave_polygon_shape.cpp +++ b/scene/resources/concave_polygon_shape.cpp @@ -65,6 +65,7 @@ Vector<Vector3> ConcavePolygonShape::_gen_debug_mesh_lines() { } void ConcavePolygonShape::_update_shape() { + Shape::_update_shape(); } void ConcavePolygonShape::set_faces(const PoolVector<Vector3> &p_faces) { diff --git a/scene/resources/convex_polygon_shape.cpp b/scene/resources/convex_polygon_shape.cpp index 5845e4be50..499688a185 100644 --- a/scene/resources/convex_polygon_shape.cpp +++ b/scene/resources/convex_polygon_shape.cpp @@ -58,7 +58,7 @@ Vector<Vector3> ConvexPolygonShape::_gen_debug_mesh_lines() { void ConvexPolygonShape::_update_shape() { PhysicsServer::get_singleton()->shape_set_data(get_shape(), points); - emit_changed(); + Shape::_update_shape(); } void ConvexPolygonShape::set_points(const PoolVector<Vector3> &p_points) { diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index 464ca60d31..ece8ad4bb0 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -268,7 +268,7 @@ void Curve::update_auto_tangents(int i) { } if (i + 1 < _points.size()) { - if (p.right_mode == TANGENT_LINEAR && i + 1 < _points.size()) { + if (p.right_mode == TANGENT_LINEAR) { Vector2 v = (_points[i + 1].pos - p.pos).normalized(); p.right_tangent = v.y / v.x; } diff --git a/scene/resources/cylinder_shape.cpp b/scene/resources/cylinder_shape.cpp index 4fd829b349..f60f7ab376 100644 --- a/scene/resources/cylinder_shape.cpp +++ b/scene/resources/cylinder_shape.cpp @@ -68,6 +68,7 @@ void CylinderShape::_update_shape() { d["radius"] = radius; d["height"] = height; PhysicsServer::get_singleton()->shape_set_data(get_shape(), d); + Shape::_update_shape(); } void CylinderShape::set_radius(float p_radius) { diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index c7a815d8a4..79d93113b3 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -423,6 +423,8 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_stylebox("completion", "TextEdit", make_stylebox(tree_bg_png, 3, 3, 3, 3, 0, 0, 0, 0)); theme->set_icon("tab", "TextEdit", make_icon(tab_png)); + theme->set_icon("folded", "TextEdit", make_icon(arrow_right_png)); + theme->set_icon("fold", "TextEdit", make_icon(arrow_down_png)); theme->set_font("font", "TextEdit", default_font); @@ -437,6 +439,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("selection_color", "TextEdit", font_color_selection); theme->set_color("mark_color", "TextEdit", Color(1.0, 0.4, 0.4, 0.4)); theme->set_color("breakpoint_color", "TextEdit", Color(0.8, 0.8, 0.4, 0.2)); + theme->set_color("executing_line_color", "TextEdit", Color(0.2, 0.8, 0.2, 0.4)); theme->set_color("code_folding_color", "TextEdit", Color(0.8, 0.8, 0.8, 0.8)); theme->set_color("current_line_color", "TextEdit", Color(0.25, 0.25, 0.26, 0.8)); theme->set_color("caret_color", "TextEdit", control_font_color); @@ -795,7 +798,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_font("bold_italics_font", "RichTextLabel", default_font); theme->set_font("mono_font", "RichTextLabel", default_font); - theme->set_color("default_color", "RichTextLabel", control_font_color); + theme->set_color("default_color", "RichTextLabel", Color(1, 1, 1)); theme->set_color("font_color_selected", "RichTextLabel", font_color_selection); theme->set_color("selection_color", "RichTextLabel", Color(0.1, 0.1, 1, 0.8)); diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp index 1b406551ab..be0b9f9ac3 100644 --- a/scene/resources/multimesh.cpp +++ b/scene/resources/multimesh.cpp @@ -162,6 +162,16 @@ int MultiMesh::get_instance_count() const { return instance_count; } +void MultiMesh::set_visible_instance_count(int p_count) { + ERR_FAIL_COND(p_count < -1); + VisualServer::get_singleton()->multimesh_set_visible_instances(multimesh, p_count); + visible_instance_count = p_count; +} +int MultiMesh::get_visible_instance_count() const { + + return visible_instance_count; +} + void MultiMesh::set_instance_transform(int p_instance, const Transform &p_transform) { VisualServer::get_singleton()->multimesh_instance_set_transform(multimesh, p_instance, p_transform); @@ -255,6 +265,8 @@ void MultiMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_instance_count", "count"), &MultiMesh::set_instance_count); ClassDB::bind_method(D_METHOD("get_instance_count"), &MultiMesh::get_instance_count); + ClassDB::bind_method(D_METHOD("set_visible_instance_count", "count"), &MultiMesh::set_visible_instance_count); + ClassDB::bind_method(D_METHOD("get_visible_instance_count"), &MultiMesh::get_visible_instance_count); ClassDB::bind_method(D_METHOD("set_instance_transform", "instance", "transform"), &MultiMesh::set_instance_transform); ClassDB::bind_method(D_METHOD("set_instance_transform_2d", "instance", "transform"), &MultiMesh::set_instance_transform_2d); ClassDB::bind_method(D_METHOD("get_instance_transform", "instance"), &MultiMesh::get_instance_transform); @@ -276,6 +288,7 @@ void MultiMesh::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_format", PROPERTY_HINT_ENUM, "2D,3D"), "set_transform_format", "get_transform_format"); ADD_PROPERTY(PropertyInfo(Variant::INT, "custom_data_format", PROPERTY_HINT_ENUM, "None,Byte,Float"), "set_custom_data_format", "get_custom_data_format"); ADD_PROPERTY(PropertyInfo(Variant::INT, "instance_count", PROPERTY_HINT_RANGE, "0,16384,1,or_greater"), "set_instance_count", "get_instance_count"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "visible_instance_count", PROPERTY_HINT_RANGE, "-1,16384,1,or_greater"), "set_visible_instance_count", "get_visible_instance_count"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_mesh", "get_mesh"); ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR3_ARRAY, "transform_array", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_transform_array", "_get_transform_array"); ADD_PROPERTY(PropertyInfo(Variant::POOL_COLOR_ARRAY, "color_array", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_color_array", "_get_color_array"); @@ -299,6 +312,7 @@ MultiMesh::MultiMesh() { color_format = COLOR_NONE; custom_data_format = CUSTOM_DATA_NONE; transform_format = TRANSFORM_2D; + visible_instance_count = -1; instance_count = 0; } diff --git a/scene/resources/multimesh.h b/scene/resources/multimesh.h index ac2c69e022..24b4beaa89 100644 --- a/scene/resources/multimesh.h +++ b/scene/resources/multimesh.h @@ -64,6 +64,7 @@ private: ColorFormat color_format; CustomDataFormat custom_data_format; int instance_count; + int visible_instance_count; protected: static void _bind_methods(); @@ -93,6 +94,9 @@ public: void set_instance_count(int p_count); int get_instance_count() const; + void set_visible_instance_count(int p_count); + int get_visible_instance_count() const; + void set_instance_transform(int p_instance, const Transform &p_transform); void set_instance_transform_2d(int p_instance, const Transform2D &p_transform); Transform get_instance_transform(int p_instance) const; diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 626ed9f5b4..2c6f30f429 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -535,7 +535,7 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map float a = value; float b = original; - if (Math::abs(a - b) < CMP_EPSILON) + if (Math::is_equal_approx(a, b)) continue; } else if (bool(Variant::evaluate(Variant::OP_EQUAL, value, original))) { diff --git a/scene/resources/plane_shape.cpp b/scene/resources/plane_shape.cpp index 419ff8f972..08f6ccd764 100644 --- a/scene/resources/plane_shape.cpp +++ b/scene/resources/plane_shape.cpp @@ -64,6 +64,7 @@ Vector<Vector3> PlaneShape::_gen_debug_mesh_lines() { void PlaneShape::_update_shape() { PhysicsServer::get_singleton()->shape_set_data(get_shape(), plane); + Shape::_update_shape(); } void PlaneShape::set_plane(Plane p_plane) { diff --git a/scene/resources/ray_shape.cpp b/scene/resources/ray_shape.cpp index b7925d8a58..0acfffdc06 100644 --- a/scene/resources/ray_shape.cpp +++ b/scene/resources/ray_shape.cpp @@ -47,7 +47,7 @@ void RayShape::_update_shape() { d["length"] = length; d["slips_on_slope"] = slips_on_slope; PhysicsServer::get_singleton()->shape_set_data(get_shape(), d); - emit_changed(); + Shape::_update_shape(); } void RayShape::set_length(float p_length) { diff --git a/scene/resources/shape.cpp b/scene/resources/shape.cpp index 825b7f4c8b..6ba46f066c 100644 --- a/scene/resources/shape.cpp +++ b/scene/resources/shape.cpp @@ -96,6 +96,11 @@ Ref<ArrayMesh> Shape::get_debug_mesh() { return debug_mesh_cache; } +void Shape::_update_shape() { + emit_changed(); + debug_mesh_cache.unref(); +} + void Shape::_bind_methods() { ClassDB::bind_method(D_METHOD("set_margin", "margin"), &Shape::set_margin); diff --git a/scene/resources/shape.h b/scene/resources/shape.h index de99a967a8..ba763eaab1 100644 --- a/scene/resources/shape.h +++ b/scene/resources/shape.h @@ -51,6 +51,8 @@ protected: Shape(RID p_shape); virtual Vector<Vector3> _gen_debug_mesh_lines() = 0; // { return Vector<Vector3>(); } + virtual void _update_shape(); + public: virtual RID get_rid() const { return shape; } diff --git a/scene/resources/sphere_shape.cpp b/scene/resources/sphere_shape.cpp index 492cf3959d..af89413ced 100644 --- a/scene/resources/sphere_shape.cpp +++ b/scene/resources/sphere_shape.cpp @@ -58,6 +58,7 @@ Vector<Vector3> SphereShape::_gen_debug_mesh_lines() { void SphereShape::_update_shape() { PhysicsServer::get_singleton()->shape_set_data(get_shape(), radius); + Shape::_update_shape(); } void SphereShape::set_radius(float p_radius) { diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 4229147ba2..b8f21948c3 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -240,6 +240,9 @@ bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_po if (!g->nodes.has(p_from_node)) return false; + if (p_from_node == p_to_node) + return false; + if (p_from_port < 0 || p_from_port >= g->nodes[p_from_node].node->get_output_port_count()) return false; diff --git a/servers/audio/audio_rb_resampler.cpp b/servers/audio/audio_rb_resampler.cpp index 88f3ed8d15..ad5bcde382 100644 --- a/servers/audio/audio_rb_resampler.cpp +++ b/servers/audio/audio_rb_resampler.cpp @@ -201,10 +201,8 @@ void AudioRBResampler::clear() { return; //should be stopped at this point but just in case - if (rb) { - memdelete_arr(rb); - memdelete_arr(read_buf); - } + memdelete_arr(rb); + memdelete_arr(read_buf); rb = NULL; offset = 0; rb_read_pos = 0; diff --git a/servers/audio/effects/audio_effect_record.cpp b/servers/audio/effects/audio_effect_record.cpp index 2dd71f9452..96d5c9df89 100644 --- a/servers/audio/effects/audio_effect_record.cpp +++ b/servers/audio/effects/audio_effect_record.cpp @@ -66,7 +66,7 @@ void AudioEffectRecordInstance::_io_thread_process() { while (is_recording) { //Check: The current recording has been requested to stop - if (is_recording && !base->recording_active) { + if (!base->recording_active) { is_recording = false; } diff --git a/servers/audio/effects/audio_effect_spectrum_analyzer.cpp b/servers/audio/effects/audio_effect_spectrum_analyzer.cpp index 01a52aa01f..46d92336f3 100644 --- a/servers/audio/effects/audio_effect_spectrum_analyzer.cpp +++ b/servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -130,7 +130,7 @@ Vector2 AudioEffectSpectrumAnalyzerInstance::get_magnitude_for_frequency_range(f } uint64_t time = OS::get_singleton()->get_ticks_usec(); float diff = double(time - last_fft_time) / 1000000.0 + base->get_tap_back_pos(); - diff -= AudioServer::get_singleton()->get_output_delay(); + diff -= AudioServer::get_singleton()->get_output_latency(); float fft_time_size = float(fft_size) / mix_rate; int fft_index = fft_pos; diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp index c83c3029f3..fc3ecedd03 100644 --- a/servers/audio_server.cpp +++ b/servers/audio_server.cpp @@ -68,16 +68,21 @@ void AudioDriver::audio_server_process(int p_frames, int32_t *p_buffer, bool p_u void AudioDriver::update_mix_time(int p_frames) { - _mix_amount += p_frames; + _last_mix_frames = p_frames; if (OS::get_singleton()) _last_mix_time = OS::get_singleton()->get_ticks_usec(); } -double AudioDriver::get_mix_time() const { +double AudioDriver::get_time_since_last_mix() const { + + return (OS::get_singleton()->get_ticks_usec() - _last_mix_time) / 1000000.0; +} + +double AudioDriver::get_time_to_next_mix() const { double total = (OS::get_singleton()->get_ticks_usec() - _last_mix_time) / 1000000.0; - total += _mix_amount / (double)get_mix_rate(); - return total; + double mix_buffer = _last_mix_frames / (double)get_mix_rate(); + return mix_buffer - total; } void AudioDriver::input_buffer_init(int driver_buffer_frames) { @@ -148,7 +153,7 @@ Array AudioDriver::capture_get_device_list() { AudioDriver::AudioDriver() { _last_mix_time = 0; - _mix_amount = 0; + _last_mix_frames = 0; input_position = 0; input_size = 0; @@ -281,13 +286,6 @@ void AudioServer::_driver_process(int p_frames, int32_t *p_buffer) { to_mix -= to_copy; } - // Calculate latency for Performance.AUDIO_OUTPUT_LATENCY - if (OS::get_singleton()) { - uint64_t ticks = OS::get_singleton()->get_ticks_usec(); - output_latency = (ticks - output_latency_ticks) / 1000000.f; - output_latency_ticks = ticks; - } - #ifdef DEBUG_ENABLED prof_time += OS::get_singleton()->get_ticks_usec() - prof_ticks; #endif @@ -1107,13 +1105,19 @@ AudioServer *AudioServer::get_singleton() { return singleton; } -double AudioServer::get_mix_time() const { +double AudioServer::get_output_latency() const { - return 0; + return AudioDriver::get_singleton()->get_latency(); } -double AudioServer::get_output_delay() const { - return 0; +double AudioServer::get_time_to_next_mix() const { + + return AudioDriver::get_singleton()->get_time_to_next_mix(); +} + +double AudioServer::get_time_since_last_mix() const { + + return AudioDriver::get_singleton()->get_time_since_last_mix(); } AudioServer *AudioServer::singleton = NULL; @@ -1357,6 +1361,10 @@ void AudioServer::_bind_methods() { ClassDB::bind_method(D_METHOD("get_device"), &AudioServer::get_device); ClassDB::bind_method(D_METHOD("set_device", "device"), &AudioServer::set_device); + ClassDB::bind_method(D_METHOD("get_time_to_next_mix"), &AudioServer::get_time_to_next_mix); + ClassDB::bind_method(D_METHOD("get_time_since_last_mix"), &AudioServer::get_time_since_last_mix); + ClassDB::bind_method(D_METHOD("get_output_latency"), &AudioServer::get_output_latency); + ClassDB::bind_method(D_METHOD("capture_get_device_list"), &AudioServer::capture_get_device_list); ClassDB::bind_method(D_METHOD("capture_get_device"), &AudioServer::capture_get_device); ClassDB::bind_method(D_METHOD("capture_set_device", "name"), &AudioServer::capture_set_device); @@ -1386,6 +1394,8 @@ AudioServer::AudioServer() { #ifdef DEBUG_ENABLED prof_time = 0; #endif + mix_time = 0; + mix_size = 0; } AudioServer::~AudioServer() { diff --git a/servers/audio_server.h b/servers/audio_server.h index 3b69cb1b88..e56d87ce84 100644 --- a/servers/audio_server.h +++ b/servers/audio_server.h @@ -45,7 +45,7 @@ class AudioDriver { static AudioDriver *singleton; uint64_t _last_mix_time; - uint64_t _mix_amount; + uint64_t _last_mix_frames; #ifdef DEBUG_ENABLED uint64_t prof_ticks; @@ -71,7 +71,8 @@ protected: #endif public: - double get_mix_time() const; //useful for video -> audio sync + double get_time_since_last_mix() const; //useful for video -> audio sync + double get_time_to_next_mix() const; enum SpeakerMode { SPEAKER_MODE_STEREO, @@ -163,6 +164,9 @@ public: typedef void (*AudioCallback)(void *p_userdata); private: + uint64_t mix_time; + int mix_size; + uint32_t buffer_size; uint64_t mix_count; uint64_t mix_frames; @@ -351,8 +355,9 @@ public: static AudioServer *get_singleton(); - virtual double get_mix_time() const; //useful for video -> audio sync - virtual double get_output_delay() const; + virtual double get_output_latency() const; + virtual double get_time_to_next_mix() const; + virtual double get_time_since_last_mix() const; void *audio_data_alloc(uint32_t p_data_len, const uint8_t *p_from_data = NULL); void audio_data_free(void *p_data); @@ -377,7 +382,6 @@ public: String capture_get_device(); void capture_set_device(const String &p_name); - float get_output_latency() { return output_latency; } AudioServer(); virtual ~AudioServer(); }; diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp index baf7431e28..3073cc8b11 100644 --- a/servers/physics/collision_solver_sat.cpp +++ b/servers/physics/collision_solver_sat.cpp @@ -98,7 +98,7 @@ static void _generate_contacts_edge_edge(const Vector3 *p_points_A, int p_point_ Vector3 c = rel_A.cross(rel_B).cross(rel_B); - if (Math::abs(rel_A.dot(c)) < CMP_EPSILON) { + if (Math::is_zero_approx(rel_A.dot(c))) { // should handle somehow.. //ERR_PRINT("TODO FIX"); @@ -678,7 +678,7 @@ static void _collision_box_box(const ShapeSW *p_a, const Transform &p_transform_ Vector3 axis = p_transform_a.basis.get_axis(i).cross(p_transform_b.basis.get_axis(j)); - if (axis.length_squared() < CMP_EPSILON) + if (Math::is_zero_approx(axis.length_squared())) continue; axis.normalize(); @@ -767,7 +767,7 @@ static void _collision_box_capsule(const ShapeSW *p_a, const Transform &p_transf // cylinder Vector3 box_axis = p_transform_a.basis.get_axis(i); Vector3 axis = box_axis.cross(cyl_axis); - if (axis.length_squared() < CMP_EPSILON) + if (Math::is_zero_approx(axis.length_squared())) continue; if (!separator.test_axis(axis.normalized())) diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp index 268b9eefeb..1b3de3e913 100644 --- a/servers/physics/joints/cone_twist_joint_sw.cpp +++ b/servers/physics/joints/cone_twist_joint_sw.cpp @@ -127,10 +127,10 @@ bool ConeTwistJointSW::setup(real_t p_timestep) { Vector3 relPos = pivotBInW - pivotAInW; Vector3 normal[3]; - if (relPos.length_squared() > CMP_EPSILON) { - normal[0] = relPos.normalized(); - } else { + if (Math::is_zero_approx(relPos.length_squared())) { normal[0] = Vector3(real_t(1.0), 0, 0); + } else { + normal[0] = relPos.normalized(); } plane_space(normal[0], normal[1], normal[2]); diff --git a/servers/physics/joints/generic_6dof_joint_sw.cpp b/servers/physics/joints/generic_6dof_joint_sw.cpp index 756348f448..813d9b7704 100644 --- a/servers/physics/joints/generic_6dof_joint_sw.cpp +++ b/servers/physics/joints/generic_6dof_joint_sw.cpp @@ -107,7 +107,7 @@ real_t G6DOFRotationalLimitMotorSW::solveAngularLimits( // correction velocity real_t motor_relvel = m_limitSoftness * (target_velocity - m_damping * rel_vel); - if (motor_relvel < CMP_EPSILON && motor_relvel > -CMP_EPSILON) { + if (Math::is_zero_approx(motor_relvel)) { return 0.0f; //no need for applying force } diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp index e972496b2b..1d1b30286e 100644 --- a/servers/physics/joints/hinge_joint_sw.cpp +++ b/servers/physics/joints/hinge_joint_sw.cpp @@ -167,10 +167,10 @@ bool HingeJointSW::setup(real_t p_step) { Vector3 relPos = pivotBInW - pivotAInW; Vector3 normal[3]; - if (relPos.length_squared() > CMP_EPSILON) { - normal[0] = relPos.normalized(); - } else { + if (Math::is_zero_approx(relPos.length_squared())) { normal[0] = Vector3(real_t(1.0), 0, 0); + } else { + normal[0] = relPos.normalized(); } plane_space(normal[0], normal[1], normal[2]); diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp index 4ab92715f4..e52cc376c0 100644 --- a/servers/physics/space_sw.cpp +++ b/servers/physics/space_sw.cpp @@ -351,10 +351,8 @@ bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform &p_sh CollisionSolverSW::CallbackResult cbkres = NULL; PhysicsServerSW::CollCbkData *cbkptr = NULL; - if (p_result_max > 0) { - cbkptr = &cbk; - cbkres = PhysicsServerSW::_shape_col_cbk; - } + cbkptr = &cbk; + cbkres = PhysicsServerSW::_shape_col_cbk; for (int i = 0; i < amount; i++) { diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index d6c3fff421..f4bff66389 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -237,8 +237,8 @@ public: Vector2 axis = p_axis; - if (Math::abs(axis.x) < CMP_EPSILON && - Math::abs(axis.y) < CMP_EPSILON) { + if (Math::is_zero_approx(axis.x) && + Math::is_zero_approx(axis.y)) { // strange case, try an upwards separator axis = Vector2(0.0, 1.0); } diff --git a/servers/physics_2d/shape_2d_sw.cpp b/servers/physics_2d/shape_2d_sw.cpp index 56b87f620c..66d2dcd417 100644 --- a/servers/physics_2d/shape_2d_sw.cpp +++ b/servers/physics_2d/shape_2d_sw.cpp @@ -586,7 +586,7 @@ bool ConvexPolygonShape2DSW::contains_point(const Vector2 &p_point) const { in = true; } - return (in && !out) || (!in && out); + return in != out; } bool ConvexPolygonShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const { diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index 831764b40c..f5acadd71c 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -333,10 +333,8 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D & CollisionSolver2DSW::CallbackResult cbkres = NULL; Physics2DServerSW::CollCbkData *cbkptr = NULL; - if (p_result_max > 0) { - cbkptr = &cbk; - cbkres = Physics2DServerSW::_shape_col_cbk; - } + cbkptr = &cbk; + cbkres = Physics2DServerSW::_shape_col_cbk; for (int i = 0; i < amount; i++) { @@ -353,7 +351,7 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D & cbk.valid_depth = 0; if (CollisionSolver2DSW::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, NULL, p_margin)) { - collided = p_result_max == 0 || cbk.amount > 0; + collided = cbk.amount > 0; } } diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp index 791d59038a..d5e154a7fc 100644 --- a/servers/visual/visual_server_canvas.cpp +++ b/servers/visual/visual_server_canvas.cpp @@ -33,11 +33,9 @@ #include "visual_server_raster.h" #include "visual_server_viewport.h" -void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RasterizerCanvas::Light *p_lights) { +static const int z_range = VS::CANVAS_ITEM_Z_MAX - VS::CANVAS_ITEM_Z_MIN + 1; - static const int z_range = VS::CANVAS_ITEM_Z_MAX - VS::CANVAS_ITEM_Z_MIN + 1; - RasterizerCanvas::Item *z_list[z_range]; - RasterizerCanvas::Item *z_last_list[z_range]; +void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RasterizerCanvas::Light *p_lights) { memset(z_list, 0, z_range * sizeof(RasterizerCanvas::Item *)); memset(z_last_list, 0, z_range * sizeof(RasterizerCanvas::Item *)); @@ -1456,5 +1454,15 @@ bool VisualServerCanvas::free(RID p_rid) { } VisualServerCanvas::VisualServerCanvas() { + + z_list = (RasterizerCanvas::Item **)memalloc(z_range * sizeof(RasterizerCanvas::Item *)); + z_last_list = (RasterizerCanvas::Item **)memalloc(z_range * sizeof(RasterizerCanvas::Item *)); + disable_scale = false; } + +VisualServerCanvas::~VisualServerCanvas() { + + memfree(z_list); + memfree(z_last_list); +} diff --git a/servers/visual/visual_server_canvas.h b/servers/visual/visual_server_canvas.h index 7691d68639..26424f927e 100644 --- a/servers/visual/visual_server_canvas.h +++ b/servers/visual/visual_server_canvas.h @@ -82,7 +82,7 @@ public: _FORCE_INLINE_ bool operator()(const Item *p_left, const Item *p_right) const { - if (Math::abs(p_left->ysort_pos.y - p_right->ysort_pos.y) < CMP_EPSILON) + if (Math::is_equal_approx(p_left->ysort_pos.y, p_right->ysort_pos.y)) return p_left->ysort_pos.x < p_right->ysort_pos.x; else return p_left->ysort_pos.y < p_right->ysort_pos.y; @@ -160,6 +160,9 @@ private: void _render_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RasterizerCanvas::Item **z_list, RasterizerCanvas::Item **z_last_list, Item *p_canvas_clip, Item *p_material_owner); void _light_mask_canvas_items(int p_z, RasterizerCanvas::Item *p_canvas_item, RasterizerCanvas::Light *p_masked_lights); + RasterizerCanvas::Item **z_list; + RasterizerCanvas::Item **z_last_list; + public: void render_canvas(Canvas *p_canvas, const Transform2D &p_transform, RasterizerCanvas::Light *p_lights, RasterizerCanvas::Light *p_masked_lights, const Rect2 &p_clip_rect); @@ -254,6 +257,7 @@ public: bool free(RID p_rid); VisualServerCanvas(); + ~VisualServerCanvas(); }; #endif // VISUALSERVERCANVAS_H diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 9c7f474f44..efe2a99d2e 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -430,6 +430,7 @@ public: BIND0R(RID, camera_create) BIND4(camera_set_perspective, RID, float, float, float) BIND4(camera_set_orthogonal, RID, float, float, float) + BIND5(camera_set_frustum, RID, float, Vector2, float, float) BIND2(camera_set_transform, RID, const Transform &) BIND2(camera_set_cull_mask, RID, uint32_t) BIND2(camera_set_environment, RID, RID) diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index a5858ab661..af580d6794 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -61,6 +61,16 @@ void VisualServerScene::camera_set_orthogonal(RID p_camera, float p_size, float camera->zfar = p_z_far; } +void VisualServerScene::camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far) { + Camera *camera = camera_owner.get(p_camera); + ERR_FAIL_COND(!camera); + camera->type = Camera::FRUSTUM; + camera->size = p_size; + camera->offset = p_offset; + camera->znear = p_z_near; + camera->zfar = p_z_far; +} + void VisualServerScene::camera_set_transform(RID p_camera, const Transform &p_transform) { Camera *camera = camera_owner.get(p_camera); @@ -1730,6 +1740,17 @@ void VisualServerScene::render_camera(RID p_camera, RID p_scenario, Size2 p_view ortho = false; } break; + case Camera::FRUSTUM: { + + camera_matrix.set_frustum( + camera->size, + p_viewport_size.width / (float)p_viewport_size.height, + camera->offset, + camera->znear, + camera->zfar, + camera->vaspect); + ortho = false; + } break; } _prepare_scene(camera->transform, camera_matrix, ortho, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); @@ -1871,7 +1892,7 @@ void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const Ca //failure } else if (ins->base_type == VS::INSTANCE_LIGHT && ins->visible) { - if (ins->visible && light_cull_count < MAX_LIGHTS_CULLED) { + if (light_cull_count < MAX_LIGHTS_CULLED) { InstanceLightData *light = static_cast<InstanceLightData *>(ins->base_data); @@ -1888,7 +1909,7 @@ void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const Ca } } else if (ins->base_type == VS::INSTANCE_REFLECTION_PROBE && ins->visible) { - if (ins->visible && reflection_probe_cull_count < MAX_REFLECTION_PROBES_CULLED) { + if (reflection_probe_cull_count < MAX_REFLECTION_PROBES_CULLED) { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(ins->base_data); @@ -2633,7 +2654,7 @@ void VisualServerScene::_bake_gi_probe_light(const GIProbeDataHeader *header, co for (int i = 0; i < 3; i++) { - if (ABS(light_axis[i]) < CMP_EPSILON) + if (Math::is_zero_approx(light_axis[i])) continue; clip[clip_planes].normal[i] = 1.0; @@ -2768,7 +2789,7 @@ void VisualServerScene::_bake_gi_probe_light(const GIProbeDataHeader *header, co for (int c = 0; c < 3; c++) { - if (ABS(light_axis[c]) < CMP_EPSILON) + if (Math::is_zero_approx(light_axis[c])) continue; clip[clip_planes].normal[c] = 1.0; diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h index 7583acd88f..2c2ba7e15f 100644 --- a/servers/visual/visual_server_scene.h +++ b/servers/visual/visual_server_scene.h @@ -77,12 +77,14 @@ public: enum Type { PERSPECTIVE, - ORTHOGONAL + ORTHOGONAL, + FRUSTUM }; Type type; float fov; float znear, zfar; float size; + Vector2 offset; uint32_t visible_layers; bool vaspect; RID env; @@ -97,6 +99,7 @@ public: znear = 0.05; zfar = 100; size = 1.0; + offset = Vector2(); vaspect = false; } }; @@ -106,6 +109,7 @@ public: virtual RID camera_create(); virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far); virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far); + virtual void camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far); virtual void camera_set_transform(RID p_camera, const Transform &p_transform); virtual void camera_set_cull_mask(RID p_camera, uint32_t p_layers); virtual void camera_set_environment(RID p_camera, RID p_env); diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 9f23ad644e..3e451511cd 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -360,6 +360,7 @@ public: FUNCRID(camera) FUNC4(camera_set_perspective, RID, float, float, float) FUNC4(camera_set_orthogonal, RID, float, float, float) + FUNC5(camera_set_frustum, RID, float, Vector2, float, float) FUNC2(camera_set_transform, RID, const Transform &) FUNC2(camera_set_cull_mask, RID, uint32_t) FUNC2(camera_set_environment, RID, RID) diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index 19c6106502..041fb2b84f 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -1863,6 +1863,7 @@ void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("camera_create"), &VisualServer::camera_create); ClassDB::bind_method(D_METHOD("camera_set_perspective", "camera", "fovy_degrees", "z_near", "z_far"), &VisualServer::camera_set_perspective); ClassDB::bind_method(D_METHOD("camera_set_orthogonal", "camera", "size", "z_near", "z_far"), &VisualServer::camera_set_orthogonal); + ClassDB::bind_method(D_METHOD("camera_set_frustum", "camera", "size", "offset", "z_near", "z_far"), &VisualServer::camera_set_frustum); ClassDB::bind_method(D_METHOD("camera_set_transform", "camera", "transform"), &VisualServer::camera_set_transform); ClassDB::bind_method(D_METHOD("camera_set_cull_mask", "camera", "layers"), &VisualServer::camera_set_cull_mask); ClassDB::bind_method(D_METHOD("camera_set_environment", "camera", "env"), &VisualServer::camera_set_environment); diff --git a/servers/visual_server.h b/servers/visual_server.h index c98c5b39a9..7693faf42b 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -584,6 +584,7 @@ public: virtual RID camera_create() = 0; virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far) = 0; virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far) = 0; + virtual void camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far) = 0; virtual void camera_set_transform(RID p_camera, const Transform &p_transform) = 0; virtual void camera_set_cull_mask(RID p_camera, uint32_t p_layers) = 0; virtual void camera_set_environment(RID p_camera, RID p_env) = 0; diff --git a/thirdparty/README.md b/thirdparty/README.md index 815c533645..e2c2334c0f 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -4,7 +4,7 @@ ## assimp - Upstream: http://github.com/assimp/assimp -- Version: git (d2b45377e4b09a1f43be95e45553afcc06b03f4b) +- Version: git (d3d98a7ec0c8d38e1952b46dfe53f7e9233dc92d) - License: BSD-3-Clause @@ -170,7 +170,7 @@ Files extracted from upstream source: ## libpng - Upstream: http://libpng.org/pub/png/libpng.html -- Version: 1.6.35 +- Version: 1.6.37 - License: libpng/zlib Files extracted from upstream source: diff --git a/thirdparty/assimp/code/FBXConverter.cpp b/thirdparty/assimp/code/FBXConverter.cpp index 000c4ed53b..09ae06a64f 100644 --- a/thirdparty/assimp/code/FBXConverter.cpp +++ b/thirdparty/assimp/code/FBXConverter.cpp @@ -78,6 +78,16 @@ namespace Assimp { FBXConverter::FBXConverter(aiScene* out, const Document& doc) : defaultMaterialIndex() + , lights() + , cameras() + , textures() + , materials_converted() + , textures_converted() + , meshes_converted() + , node_anim_chain_bits() + , mNodeNameInstances() + , mNodeNames() + , anim_fps() , out(out) , doc(doc) { // animations need to be converted first since this will @@ -410,19 +420,24 @@ namespace Assimp { void FBXConverter::GetUniqueName(const std::string &name, std::string &uniqueName) { - int i = 0; uniqueName = name; - while (mNodeNames.find(uniqueName) != mNodeNames.end()) + int i = 0; + auto it = mNodeNameInstances.find(name); // duplicate node name instance count + if (it != mNodeNameInstances.end()) { - ++i; - std::stringstream ext; - ext << name << std::setfill('0') << std::setw(3) << i; - uniqueName = ext.str(); + i = it->second; + while (mNodeNames.find(uniqueName) != mNodeNames.end()) + { + i++; + std::stringstream ext; + ext << name << std::setfill('0') << std::setw(3) << i; + uniqueName = ext.str(); + } } + mNodeNameInstances[name] = i; mNodeNames.insert(uniqueName); } - const char* FBXConverter::NameTransformationComp(TransformationComp comp) { switch (comp) { case TransformationComp_Translation: @@ -2041,6 +2056,12 @@ namespace Assimp { CalculatedOpacity = 1.0f - ((Transparent.r + Transparent.g + Transparent.b) / 3.0f); } + // try to get the transparency factor + const float TransparencyFactor = PropertyGet<float>(props, "TransparencyFactor", ok); + if (ok) { + out_mat->AddProperty(&TransparencyFactor, 1, AI_MATKEY_TRANSPARENCYFACTOR); + } + // use of TransparencyFactor is inconsistent. // Maya always stores it as 1.0, // so we can't use it to set AI_MATKEY_OPACITY. diff --git a/thirdparty/assimp/code/FBXConverter.h b/thirdparty/assimp/code/FBXConverter.h index 398baa445f..50637468b9 100644 --- a/thirdparty/assimp/code/FBXConverter.h +++ b/thirdparty/assimp/code/FBXConverter.h @@ -58,6 +58,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/texture.h> #include <assimp/camera.h> #include <assimp/StringComparison.h> +#include <unordered_map> +#include <unordered_set> struct aiScene; struct aiNode; @@ -74,8 +76,6 @@ namespace FBX { class Document; -using NodeNameCache = std::set<std::string>; - /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated @@ -419,7 +419,6 @@ private: void TransferDataToScene(); private: - // 0: not assigned yet, others: index is value - 1 unsigned int defaultMaterialIndex; @@ -429,22 +428,27 @@ private: std::vector<aiLight*> lights; std::vector<aiCamera*> cameras; std::vector<aiTexture*> textures; - - typedef std::map<const Material*, unsigned int> MaterialMap; + using MaterialMap = std::map<const Material*, unsigned int>; MaterialMap materials_converted; - typedef std::map<const Video*, unsigned int> VideoMap; + using VideoMap = std::map<const Video*, unsigned int>; VideoMap textures_converted; - typedef std::map<const Geometry*, std::vector<unsigned int> > MeshMap; + using MeshMap = std::map<const Geometry*, std::vector<unsigned int> >; MeshMap meshes_converted; // fixed node name -> which trafo chain components have animations? - typedef std::map<std::string, unsigned int> NodeAnimBitMap; + using NodeAnimBitMap = std::map<std::string, unsigned int> ; NodeAnimBitMap node_anim_chain_bits; + // number of nodes with the same name + using NodeAnimNameMap = std::unordered_map<std::string, unsigned int>; + NodeAnimNameMap mNodeNameInstances; + + using NodeNameCache = std::unordered_set<std::string>; NodeNameCache mNodeNames; + double anim_fps; aiScene* const out; diff --git a/thirdparty/assimp/code/FBXMaterial.cpp b/thirdparty/assimp/code/FBXMaterial.cpp index 08347740fa..f16f134404 100644 --- a/thirdparty/assimp/code/FBXMaterial.cpp +++ b/thirdparty/assimp/code/FBXMaterial.cpp @@ -55,6 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/ByteSwapper.h> #include <algorithm> // std::transform +#include "FBXUtil.h" namespace Assimp { namespace FBX { @@ -206,6 +207,20 @@ Texture::Texture(uint64_t id, const Element& element, const Document& doc, const props = GetPropertyTable(doc,"Texture.FbxFileTexture",element,sc); + // 3DS Max and FBX SDK use "Scaling" and "Translation" instead of "ModelUVScaling" and "ModelUVTranslation". Use these properties if available. + bool ok; + const aiVector3D& scaling = PropertyGet<aiVector3D>(*props, "Scaling", ok); + if (ok) { + uvScaling.x = scaling.x; + uvScaling.y = scaling.y; + } + + const aiVector3D& trans = PropertyGet<aiVector3D>(*props, "Translation", ok); + if (ok) { + uvTrans.x = trans.x; + uvTrans.y = trans.y; + } + // resolve video links if(doc.Settings().readTextures) { const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(ID()); @@ -307,7 +322,22 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std const Token& token = GetRequiredToken(*Content, 0); const char* data = token.begin(); if (!token.IsBinary()) { - DOMWarning("video content is not binary data, ignoring", &element); + if (*data != '"') { + DOMError("embedded content is not surrounded by quotation marks", &element); + } + else { + const char* encodedData = data + 1; + size_t encodedDataLen = static_cast<size_t>(token.end() - token.begin()); + // search for last quotation mark + while (encodedDataLen > 1 && encodedData[encodedDataLen] != '"') + encodedDataLen--; + if (encodedDataLen % 4 != 0) { + DOMError("embedded content is invalid, needs to be in base64", &element); + } + else { + contentLength = Util::DecodeBase64(encodedData, encodedDataLen, content); + } + } } else if (static_cast<size_t>(token.end() - data) < 5) { DOMError("binary data array is too short, need five (5) bytes for type signature and element count", &element); diff --git a/thirdparty/assimp/code/FBXUtil.cpp b/thirdparty/assimp/code/FBXUtil.cpp index c184c4a00b..fb483161b2 100644 --- a/thirdparty/assimp/code/FBXUtil.cpp +++ b/thirdparty/assimp/code/FBXUtil.cpp @@ -49,6 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/TinyFormatter.h> #include <string> +#include <cstring> #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER @@ -113,6 +114,49 @@ std::string AddTokenText(const std::string& prefix, const std::string& text, con text) ); } +static const uint8_t base64DecodeTable[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, + 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 +}; + +uint8_t DecodeBase64(char ch) +{ + return base64DecodeTable[size_t(ch)]; +} + +size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) +{ + if (inLength < 4) { + out = 0; + return 0; + } + + const size_t outLength = (inLength * 3) / 4; + out = new uint8_t[outLength]; + memset(out, 0, outLength); + + size_t i = 0; + size_t j = 0; + for (i = 0; i < inLength - 4; i += 4) + { + uint8_t b0 = Util::DecodeBase64(in[i]); + uint8_t b1 = Util::DecodeBase64(in[i + 1]); + uint8_t b2 = Util::DecodeBase64(in[i + 2]); + uint8_t b3 = Util::DecodeBase64(in[i + 3]); + + out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); + out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); + out[j++] = (uint8_t)((b2 << 6) | b3); + } + return outLength; +} + } // !Util } // !FBX } // !Assimp diff --git a/thirdparty/assimp/code/FBXUtil.h b/thirdparty/assimp/code/FBXUtil.h index 1a37d346b4..6890e015ba 100644 --- a/thirdparty/assimp/code/FBXUtil.h +++ b/thirdparty/assimp/code/FBXUtil.h @@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXCompileConfig.h" #include "FBXTokenizer.h" +#include <stdint.h> namespace Assimp { namespace FBX { @@ -98,6 +99,20 @@ std::string AddLineAndColumn(const std::string& prefix, const std::string& text, * @return A string of the following format: {prefix} ({token-type}, line {line}, col {column}) {text}*/ std::string AddTokenText(const std::string& prefix, const std::string& text, const Token* tok); +/** Decode a single Base64-encoded character. +* +* @param ch Character to decode (from base64 to binary). +* @return decoded byte value*/ +uint8_t DecodeBase64(char ch); + +/** Decode a Base64-encoded string +* +* @param in Characters to decode. +* @param inLength Number of characters to decode. +* @param out Reference to pointer where we will store the decoded data. +* @return size of the decoded data (number of bytes)*/ +size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); + } } } diff --git a/thirdparty/assimp/code/Version.cpp b/thirdparty/assimp/code/Version.cpp index cc94340ac8..0381037ff1 100644 --- a/thirdparty/assimp/code/Version.cpp +++ b/thirdparty/assimp/code/Version.cpp @@ -134,7 +134,7 @@ ASSIMP_API aiScene::aiScene() , mCameras(nullptr) , mMetaData(nullptr) , mPrivate(new Assimp::ScenePrivateData()) { - // empty + // empty } // ------------------------------------------------------------------------------------------------ diff --git a/thirdparty/assimp/include/assimp/material.h b/thirdparty/assimp/include/assimp/material.h index b882bbc72c..4b5a1293dd 100644 --- a/thirdparty/assimp/include/assimp/material.h +++ b/thirdparty/assimp/include/assimp/material.h @@ -900,6 +900,7 @@ extern "C" { #define AI_MATKEY_ENABLE_WIREFRAME "$mat.wireframe",0,0 #define AI_MATKEY_BLEND_FUNC "$mat.blend",0,0 #define AI_MATKEY_OPACITY "$mat.opacity",0,0 +#define AI_MATKEY_TRANSPARENCYFACTOR "$mat.transparencyfactor",0,0 #define AI_MATKEY_BUMPSCALING "$mat.bumpscaling",0,0 #define AI_MATKEY_SHININESS "$mat.shininess",0,0 #define AI_MATKEY_REFLECTIVITY "$mat.reflectivity",0,0 diff --git a/thirdparty/libpng/LICENSE b/thirdparty/libpng/LICENSE index 62ab8e48dc..e0c5b531cf 100644 --- a/thirdparty/libpng/LICENSE +++ b/thirdparty/libpng/LICENSE @@ -4,8 +4,8 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE PNG Reference Library License version 2 --------------------------------------- - * Copyright (c) 1995-2018 The PNG Reference Library Authors. - * Copyright (c) 2018 Cosmin Truta. + * Copyright (c) 1995-2019 The PNG Reference Library Authors. + * Copyright (c) 2018-2019 Cosmin Truta. * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * Copyright (c) 1996-1997 Andreas Dilger. * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -13,7 +13,7 @@ PNG Reference Library License version 2 The software is supplied "as is", without warranty of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose, title, and -non-infringement. In no even shall the Copyright owners, or +non-infringement. In no event shall the Copyright owners, or anyone distributing the software, be liable for any damages or other liability, whether in contract, tort or otherwise, arising from, out of, or in connection with the software, or the use or @@ -39,7 +39,7 @@ subject to the following restrictions: PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) ----------------------------------------------------------------------- -libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are derived from libpng-1.0.6, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals diff --git a/thirdparty/libpng/arm/palette_neon_intrinsics.c b/thirdparty/libpng/arm/palette_neon_intrinsics.c index fa02d6a8b3..b4d1fd2abf 100644 --- a/thirdparty/libpng/arm/palette_neon_intrinsics.c +++ b/thirdparty/libpng/arm/palette_neon_intrinsics.c @@ -1,7 +1,7 @@ /* palette_neon_intrinsics.c - NEON optimised palette expansion functions * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 2017-2018 Arm Holdings. All rights reserved. * Written by Richard Townsend <Richard.Townsend@arm.com>, February 2017. * @@ -20,9 +20,9 @@ # include <arm_neon.h> #endif -/* Build an RGBA palette from the RGB and separate alpha palettes. */ +/* Build an RGBA8 palette from the separate RGB and alpha palettes. */ void -png_riffle_palette_rgba(png_structrp png_ptr, png_row_infop row_info) +png_riffle_palette_neon(png_structrp png_ptr) { png_const_colorp palette = png_ptr->palette; png_bytep riffled_palette = png_ptr->riffled_palette; @@ -30,6 +30,8 @@ png_riffle_palette_rgba(png_structrp png_ptr, png_row_infop row_info) int num_trans = png_ptr->num_trans; int i; + png_debug(1, "in png_riffle_palette_neon"); + /* Initially black, opaque. */ uint8x16x4_t w = {{ vdupq_n_u8(0x00), @@ -38,16 +40,10 @@ png_riffle_palette_rgba(png_structrp png_ptr, png_row_infop row_info) vdupq_n_u8(0xff), }}; - if (row_info->bit_depth != 8) - { - png_error(png_ptr, "bit_depth must be 8 for png_riffle_palette_rgba"); - return; - } - - /* First, riffle the RGB colours into a RGBA palette, the A value is - * set to opaque for now. + /* First, riffle the RGB colours into an RGBA8 palette. + * The alpha component is set to opaque for now. */ - for (i = 0; i < (1 << row_info->bit_depth); i += 16) + for (i = 0; i < 256; i += 16) { uint8x16x3_t v = vld3q_u8((png_const_bytep)(palette + i)); w.val[0] = v.val[0]; @@ -61,9 +57,9 @@ png_riffle_palette_rgba(png_structrp png_ptr, png_row_infop row_info) riffled_palette[(i << 2) + 3] = trans_alpha[i]; } -/* Expands a palettized row into RGBA. */ +/* Expands a palettized row into RGBA8. */ int -png_do_expand_palette_neon_rgba(png_structrp png_ptr, png_row_infop row_info, +png_do_expand_palette_rgba8_neon(png_structrp png_ptr, png_row_infop row_info, png_const_bytep row, png_bytepp ssp, png_bytepp ddp) { png_uint_32 row_width = row_info->width; @@ -72,6 +68,8 @@ png_do_expand_palette_neon_rgba(png_structrp png_ptr, png_row_infop row_info, const png_int_32 pixels_per_chunk = 4; int i; + png_debug(1, "in png_do_expand_palette_rgba8_neon"); + if (row_width < pixels_per_chunk) return 0; @@ -103,9 +101,9 @@ png_do_expand_palette_neon_rgba(png_structrp png_ptr, png_row_infop row_info, return i; } -/* Expands a palettized row into RGB format. */ +/* Expands a palettized row into RGB8. */ int -png_do_expand_palette_neon_rgb(png_structrp png_ptr, png_row_infop row_info, +png_do_expand_palette_rgb8_neon(png_structrp png_ptr, png_row_infop row_info, png_const_bytep row, png_bytepp ssp, png_bytepp ddp) { png_uint_32 row_width = row_info->width; @@ -113,6 +111,8 @@ png_do_expand_palette_neon_rgb(png_structrp png_ptr, png_row_infop row_info, const png_uint_32 pixels_per_chunk = 8; int i; + png_debug(1, "in png_do_expand_palette_rgb8_neon"); + if (row_width <= pixels_per_chunk) return 0; diff --git a/thirdparty/libpng/png.c b/thirdparty/libpng/png.c index 3dce191d17..757c755f97 100644 --- a/thirdparty/libpng/png.c +++ b/thirdparty/libpng/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_36 Your_png_h_is_not_version_1_6_36; +typedef png_libpng_version_1_6_37 Your_png_h_is_not_version_1_6_37; #ifdef __GNUC__ /* The version tests may need to be added to, but the problem warning has @@ -815,8 +815,8 @@ png_get_copyright(png_const_structrp png_ptr) return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.36" PNG_STRING_NEWLINE \ - "Copyright (c) 2018 Cosmin Truta" PNG_STRING_NEWLINE \ + "libpng version 1.6.37" PNG_STRING_NEWLINE \ + "Copyright (c) 2018-2019 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ @@ -4588,8 +4588,7 @@ png_image_free(png_imagep image) if (image != NULL && image->opaque != NULL && image->opaque->error_buf == NULL) { - /* Ignore errors here: */ - (void)png_safe_execute(image, png_image_free_function, image); + png_image_free_function(image); image->opaque = NULL; } } diff --git a/thirdparty/libpng/png.h b/thirdparty/libpng/png.h index 8e272a0553..b12174ba35 100644 --- a/thirdparty/libpng/png.h +++ b/thirdparty/libpng/png.h @@ -1,9 +1,9 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.36 - December 1, 2018 + * libpng version 1.6.37 - April 14, 2019 * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -14,8 +14,9 @@ * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: - * Glenn Randers-Pehrson. - * libpng version 1.6.36, December 1, 2018: Cosmin Truta + * Glenn Randers-Pehrson + * libpng versions 1.6.36, December 2018, through 1.6.37, April 2019: + * Cosmin Truta * See also "Contributing Authors", below. */ @@ -26,8 +27,8 @@ * PNG Reference Library License version 2 * --------------------------------------- * - * * Copyright (c) 1995-2018 The PNG Reference Library Authors. - * * Copyright (c) 2018 Cosmin Truta. + * * Copyright (c) 1995-2019 The PNG Reference Library Authors. + * * Copyright (c) 2018-2019 Cosmin Truta. * * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * * Copyright (c) 1996-1997 Andreas Dilger. * * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -35,7 +36,7 @@ * The software is supplied "as is", without warranty of any kind, * express or implied, including, without limitation, the warranties * of merchantability, fitness for a particular purpose, title, and - * non-infringement. In no even shall the Copyright owners, or + * non-infringement. In no event shall the Copyright owners, or * anyone distributing the software, be liable for any damages or * other liability, whether in contract, tort or otherwise, arising * from, out of, or in connection with the software, or the use or @@ -61,7 +62,7 @@ * PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) * ----------------------------------------------------------------------- * - * libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are + * libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are * derived from libpng-1.0.6, and are distributed according to the same * disclaimer and license as libpng-1.0.6 with the following individuals @@ -238,7 +239,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.36 16 10636 16.so.16.36[.0] + * 1.6.37 16 10637 16.so.16.37[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -277,8 +278,8 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.36" -#define PNG_HEADER_VERSION_STRING " libpng version 1.6.36 - December 1, 2018\n" +#define PNG_LIBPNG_VER_STRING "1.6.37" +#define PNG_HEADER_VERSION_STRING " libpng version 1.6.37 - April 14, 2019\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -286,12 +287,11 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 36 +#define PNG_LIBPNG_VER_RELEASE 37 -/* This should match the numeric part of the final component of - * PNG_LIBPNG_VER_STRING, omitting any leading zero: +/* This should be zero for a public release, or non-zero for a + * development version. [Deprecated] */ - #define PNG_LIBPNG_VER_BUILD 0 /* Release Status */ @@ -318,7 +318,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10636 /* 1.6.36 */ +#define PNG_LIBPNG_VER 10637 /* 1.6.37 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -330,6 +330,10 @@ # include "pnglibconf.h" #endif +#define PNG_APNG_SUPPORTED +#define PNG_READ_APNG_SUPPORTED +#define PNG_WRITE_APNG_SUPPORTED + #ifndef PNG_VERSION_INFO_ONLY /* Machine specific configuration. */ # include "pngconf.h" @@ -425,10 +429,21 @@ extern "C" { * See pngconf.h for base types that vary by machine/system */ +#ifdef PNG_APNG_SUPPORTED +/* dispose_op flags from inside fcTL */ +#define PNG_DISPOSE_OP_NONE 0x00U +#define PNG_DISPOSE_OP_BACKGROUND 0x01U +#define PNG_DISPOSE_OP_PREVIOUS 0x02U + +/* blend_op flags from inside fcTL */ +#define PNG_BLEND_OP_SOURCE 0x00U +#define PNG_BLEND_OP_OVER 0x01U +#endif /* PNG_APNG_SUPPORTED */ + /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_36; +typedef char* png_libpng_version_1_6_37; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -746,6 +761,10 @@ typedef png_unknown_chunk * * png_unknown_chunkpp; #define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */ #define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */ +#ifdef PNG_APNG_SUPPORTED +#define PNG_INFO_acTL 0x20000U +#define PNG_INFO_fcTL 0x40000U +#endif /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using @@ -783,6 +802,10 @@ typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); +#ifdef PNG_APNG_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp, + png_uint_32)); +#endif /* The following callback receives png_uint_32 row_number, int pass for the * png_bytep data of the row. When transforming an interlaced image the @@ -3226,6 +3249,74 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, /******************************************************************************* * END OF HARDWARE AND SOFTWARE OPTIONS ******************************************************************************/ +#ifdef PNG_APNG_SUPPORTED +PNG_EXPORT(250, png_uint_32, png_get_acTL, (png_structp png_ptr, + png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); + +PNG_EXPORT(251, png_uint_32, png_set_acTL, (png_structp png_ptr, + png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); + +PNG_EXPORT(252, png_uint_32, png_get_num_frames, (png_structp png_ptr, + png_infop info_ptr)); + +PNG_EXPORT(253, png_uint_32, png_get_num_plays, (png_structp png_ptr, + png_infop info_ptr)); + +PNG_EXPORT(254, png_uint_32, png_get_next_frame_fcTL, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, + png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, + png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op, + png_byte *blend_op)); + +PNG_EXPORT(255, png_uint_32, png_set_next_frame_fcTL, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, + png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, + png_byte blend_op)); + +PNG_EXPORT(256, png_uint_32, png_get_next_frame_width, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(257, png_uint_32, png_get_next_frame_height, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(258, png_uint_32, png_get_next_frame_x_offset, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(259, png_uint_32, png_get_next_frame_y_offset, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(260, png_uint_16, png_get_next_frame_delay_num, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(261, png_uint_16, png_get_next_frame_delay_den, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(262, png_byte, png_get_next_frame_dispose_op, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(263, png_byte, png_get_next_frame_blend_op, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(264, png_byte, png_get_first_frame_is_hidden, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(265, png_uint_32, png_set_first_frame_is_hidden, + (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); + +#ifdef PNG_READ_APNG_SUPPORTED +PNG_EXPORT(266, void, png_read_frame_head, (png_structp png_ptr, + png_infop info_ptr)); +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXPORT(267, void, png_set_progressive_frame_fn, (png_structp png_ptr, + png_progressive_frame_ptr frame_info_fn, + png_progressive_frame_ptr frame_end_fn)); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PNG_READ_APNG_SUPPORTED */ + +#ifdef PNG_WRITE_APNG_SUPPORTED +PNG_EXPORT(268, void, png_write_frame_head, (png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers, + png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, + png_byte blend_op)); + +PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, + png_infop info_ptr)); +#endif /* PNG_WRITE_APNG_SUPPORTED */ +#endif /* PNG_APNG_SUPPORTED */ /* Maintainer: Put new public prototypes here ^, in libpng.3, in project * defs, and in scripts/symbols.def. @@ -3235,7 +3326,11 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, * one to use is one more than this.) */ #ifdef PNG_EXPORT_LAST_ORDINAL +#ifdef PNG_APNG_SUPPORTED + PNG_EXPORT_LAST_ORDINAL(269); +#else PNG_EXPORT_LAST_ORDINAL(249); +#endif /* PNG_APNG_SUPPORTED */ #endif #ifdef __cplusplus diff --git a/thirdparty/libpng/pngconf.h b/thirdparty/libpng/pngconf.h index 5e641b2509..927a769dbe 100644 --- a/thirdparty/libpng/pngconf.h +++ b/thirdparty/libpng/pngconf.h @@ -1,9 +1,9 @@ -/* pngconf.h - machine configurable file for libpng +/* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.36 + * libpng version 1.6.37 * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. diff --git a/thirdparty/libpng/pngget.c b/thirdparty/libpng/pngget.c index 5abf1efd9f..9ed101aedc 100644 --- a/thirdparty/libpng/pngget.c +++ b/thirdparty/libpng/pngget.c @@ -1246,4 +1246,166 @@ png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) # endif #endif +#ifdef PNG_APNG_SUPPORTED +png_uint_32 PNGAPI +png_get_acTL(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *num_frames, png_uint_32 *num_plays) +{ + png_debug1(1, "in %s retrieval function", "acTL"); + + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_acTL) && + num_frames != NULL && num_plays != NULL) + { + *num_frames = info_ptr->num_frames; + *num_plays = info_ptr->num_plays; + return (1); + } + + return (0); +} + +png_uint_32 PNGAPI +png_get_num_frames(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_num_frames()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->num_frames); + return (0); +} + +png_uint_32 PNGAPI +png_get_num_plays(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_num_plays()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->num_plays); + return (0); +} + +png_uint_32 PNGAPI +png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, + png_uint_32 *x_offset, png_uint_32 *y_offset, + png_uint_16 *delay_num, png_uint_16 *delay_den, + png_byte *dispose_op, png_byte *blend_op) +{ + png_debug1(1, "in %s retrieval function", "fcTL"); + + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_fcTL) && + width != NULL && height != NULL && + x_offset != NULL && y_offset != NULL && + delay_num != NULL && delay_den != NULL && + dispose_op != NULL && blend_op != NULL) + { + *width = info_ptr->next_frame_width; + *height = info_ptr->next_frame_height; + *x_offset = info_ptr->next_frame_x_offset; + *y_offset = info_ptr->next_frame_y_offset; + *delay_num = info_ptr->next_frame_delay_num; + *delay_den = info_ptr->next_frame_delay_den; + *dispose_op = info_ptr->next_frame_dispose_op; + *blend_op = info_ptr->next_frame_blend_op; + return (1); + } + + return (0); +} + +png_uint_32 PNGAPI +png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_width()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_width); + return (0); +} + +png_uint_32 PNGAPI +png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_height()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_height); + return (0); +} + +png_uint_32 PNGAPI +png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_x_offset()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_x_offset); + return (0); +} + +png_uint_32 PNGAPI +png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_y_offset()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_y_offset); + return (0); +} + +png_uint_16 PNGAPI +png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_delay_num()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_delay_num); + return (0); +} + +png_uint_16 PNGAPI +png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_delay_den()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_delay_den); + return (0); +} + +png_byte PNGAPI +png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_dispose_op()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_dispose_op); + return (0); +} + +png_byte PNGAPI +png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_get_next_frame_blend_op()"); + + if (png_ptr != NULL && info_ptr != NULL) + return (info_ptr->next_frame_blend_op); + return (0); +} + +png_byte PNGAPI +png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_first_frame_is_hidden()"); + + if (png_ptr != NULL) + return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN); + + PNG_UNUSED(info_ptr) + + return 0; +} +#endif /* PNG_APNG_SUPPORTED */ #endif /* READ || WRITE */ diff --git a/thirdparty/libpng/pnginfo.h b/thirdparty/libpng/pnginfo.h index 1f98dedc42..ac7b269132 100644 --- a/thirdparty/libpng/pnginfo.h +++ b/thirdparty/libpng/pnginfo.h @@ -263,5 +263,18 @@ defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytepp row_pointers; /* the image bits */ #endif +#ifdef PNG_APNG_SUPPORTED + png_uint_32 num_frames; /* including default image */ + png_uint_32 num_plays; + png_uint_32 next_frame_width; + png_uint_32 next_frame_height; + png_uint_32 next_frame_x_offset; + png_uint_32 next_frame_y_offset; + png_uint_16 next_frame_delay_num; + png_uint_16 next_frame_delay_den; + png_byte next_frame_dispose_op; + png_byte next_frame_blend_op; +#endif + }; #endif /* PNGINFO_H */ diff --git a/thirdparty/libpng/pnglibconf.h b/thirdparty/libpng/pnglibconf.h index 00340c678b..e1e27e957e 100644 --- a/thirdparty/libpng/pnglibconf.h +++ b/thirdparty/libpng/pnglibconf.h @@ -1,8 +1,8 @@ /* pnglibconf.h - library build configuration */ -/* libpng version 1.6.36 */ +/* libpng version 1.6.37 */ -/* Copyright (c) 2018 Cosmin Truta */ +/* Copyright (c) 2018-2019 Cosmin Truta */ /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ diff --git a/thirdparty/libpng/pngpread.c b/thirdparty/libpng/pngpread.c index e283627b77..2eaeca08f7 100644 --- a/thirdparty/libpng/pngpread.c +++ b/thirdparty/libpng/pngpread.c @@ -195,6 +195,106 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) chunk_name = png_ptr->chunk_name; +#ifdef PNG_READ_APNG_SUPPORTED + if (png_ptr->num_frames_read > 0 && + png_ptr->num_frames_read < info_ptr->num_frames) + { + if (chunk_name == png_IDAT) + { + /* Discard trailing IDATs for the first frame */ + if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1) + png_error(png_ptr, "out of place IDAT"); + + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + return; + } + else if (chunk_name == png_fdAT) + { + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_ensure_sequence_number(png_ptr, 4); + + if (!(png_ptr->mode & PNG_HAVE_fcTL)) + { + /* Discard trailing fdATs for frames other than the first */ + if (png_ptr->num_frames_read < 2) + png_error(png_ptr, "out of place fdAT"); + + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + return; + } + + else + { + /* frame data follows */ + png_ptr->idat_size = png_ptr->push_length - 4; + png_ptr->mode |= PNG_HAVE_IDAT; + png_ptr->process_mode = PNG_READ_IDAT_MODE; + + return; + } + } + + else if (chunk_name == png_fcTL) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_read_reset(png_ptr); + png_ptr->mode &= ~PNG_HAVE_fcTL; + + png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); + + if (!(png_ptr->mode & PNG_HAVE_fcTL)) + png_error(png_ptr, "missing required fcTL chunk"); + + png_read_reinit(png_ptr, info_ptr); + png_progressive_read_reset(png_ptr); + + if (png_ptr->frame_info_fn != NULL) + (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read); + + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + + return; + } + + else + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_warning(png_ptr, "Skipped (ignored) a chunk " + "between APNG chunks"); + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + return; + } + + return; + } +#endif /* PNG_READ_APNG_SUPPORTED */ + if (chunk_name == png_IDAT) { if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) @@ -261,6 +361,9 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { +#ifdef PNG_READ_APNG_SUPPORTED + png_have_info(png_ptr, info_ptr); +#endif png_ptr->idat_size = png_ptr->push_length; png_ptr->process_mode = PNG_READ_IDAT_MODE; png_push_have_info(png_ptr, info_ptr); @@ -406,6 +509,30 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif +#ifdef PNG_READ_APNG_SUPPORTED + else if (chunk_name == png_acTL) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length); + } + + else if (chunk_name == png_fcTL) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif /* PNG_READ_APNG_SUPPORTED */ else { @@ -539,7 +666,11 @@ png_push_read_IDAT(png_structrp png_ptr) png_byte chunk_tag[4]; /* TODO: this code can be commoned up with the same code in push_read */ +#ifdef PNG_READ_APNG_SUPPORTED + PNG_PUSH_SAVE_BUFFER_IF_LT(12) +#else PNG_PUSH_SAVE_BUFFER_IF_LT(8) +#endif png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); png_reset_crc(png_ptr); @@ -547,17 +678,64 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; +#ifdef PNG_READ_APNG_SUPPORTED + if (png_ptr->chunk_name != png_fdAT && png_ptr->num_frames_read > 0) + { + if (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + if (png_ptr->frame_end_fn != NULL) + (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); + png_ptr->num_frames_read++; + return; + } + else + { + if (png_ptr->chunk_name == png_IEND) + png_error(png_ptr, "Not enough image data"); + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_warning(png_ptr, "Skipping (ignoring) a chunk between " + "APNG chunks"); + png_crc_finish(png_ptr, png_ptr->push_length); + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + return; + } + } + else +#endif +#ifdef PNG_READ_APNG_SUPPORTED + if (png_ptr->chunk_name != png_IDAT && png_ptr->num_frames_read == 0) +#else if (png_ptr->chunk_name != png_IDAT) +#endif { png_ptr->process_mode = PNG_READ_CHUNK_MODE; if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) png_error(png_ptr, "Not enough compressed data"); +#ifdef PNG_READ_APNG_SUPPORTED + if (png_ptr->frame_end_fn != NULL) + (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); + png_ptr->num_frames_read++; +#endif + return; } png_ptr->idat_size = png_ptr->push_length; + +#ifdef PNG_READ_APNG_SUPPORTED + if (png_ptr->num_frames_read > 0) + { + png_ensure_sequence_number(png_ptr, 4); + png_ptr->idat_size -= 4; + } +#endif } if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0) @@ -631,6 +809,15 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer, if (!(buffer_length > 0) || buffer == NULL) png_error(png_ptr, "No IDAT data (internal error)"); +#ifdef PNG_READ_APNG_SUPPORTED + /* If the app is not APNG-aware, decode only the first frame */ + if (!(png_ptr->apng_flags & PNG_APNG_APP) && png_ptr->num_frames_read > 0) + { + png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; + return; + } +#endif + /* This routine must process all the data it has been given * before returning, calling the row callback as required to * handle the uncompressed results. @@ -1085,6 +1272,18 @@ png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr, png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); } +#ifdef PNG_READ_APNG_SUPPORTED +void PNGAPI +png_set_progressive_frame_fn(png_structp png_ptr, + png_progressive_frame_ptr frame_info_fn, + png_progressive_frame_ptr frame_end_fn) +{ + png_ptr->frame_info_fn = frame_info_fn; + png_ptr->frame_end_fn = frame_end_fn; + png_ptr->apng_flags |= PNG_APNG_APP; +} +#endif + png_voidp PNGAPI png_get_progressive_ptr(png_const_structrp png_ptr) { diff --git a/thirdparty/libpng/pngpriv.h b/thirdparty/libpng/pngpriv.h index 973c3eac1f..57e1bf989b 100644 --- a/thirdparty/libpng/pngpriv.h +++ b/thirdparty/libpng/pngpriv.h @@ -1,7 +1,7 @@ /* pngpriv.h - private declarations for use inside libpng * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -637,6 +637,10 @@ #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */ /* 0x4000U (unused) */ #define PNG_IS_READ_STRUCT 0x8000U /* Else is a write struct */ +#ifdef PNG_APNG_SUPPORTED +#define PNG_HAVE_acTL 0x10000U +#define PNG_HAVE_fcTL 0x20000U +#endif /* Flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001U @@ -873,6 +877,16 @@ #define png_tRNS PNG_U32(116, 82, 78, 83) #define png_zTXt PNG_U32(122, 84, 88, 116) +#ifdef PNG_APNG_SUPPORTED +#define png_acTL PNG_U32( 97, 99, 84, 76) +#define png_fcTL PNG_U32(102, 99, 84, 76) +#define png_fdAT PNG_U32(102, 100, 65, 84) + +/* For png_struct.apng_flags: */ +#define PNG_FIRST_FRAME_HIDDEN 0x0001U +#define PNG_APNG_APP 0x0002U +#endif + /* The following will work on (signed char*) strings, whereas the get_uint_32 * macro will fail on top-bit-set values because of the sign extension. */ @@ -1644,6 +1658,47 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr, */ #endif +#ifdef PNG_APNG_SUPPORTED +PNG_INTERNAL_FUNCTION(void,png_ensure_fcTL_is_valid,(png_structp png_ptr, + png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, + png_byte dispose_op, png_byte blend_op), PNG_EMPTY); + +#ifdef PNG_READ_APNG_SUPPORTED +PNG_INTERNAL_FUNCTION(void,png_handle_acTL,(png_structp png_ptr, png_infop info_ptr, + png_uint_32 length),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_handle_fcTL,(png_structp png_ptr, png_infop info_ptr, + png_uint_32 length),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_handle_fdAT,(png_structp png_ptr, png_infop info_ptr, + png_uint_32 length),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_have_info,(png_structp png_ptr, png_infop info_ptr),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_ensure_sequence_number,(png_structp png_ptr, + png_uint_32 length),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_reset,(png_structp png_ptr),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_reinit,(png_structp png_ptr, + png_infop info_ptr),PNG_EMPTY); +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_INTERNAL_FUNCTION(void,png_progressive_read_reset,(png_structp png_ptr),PNG_EMPTY); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PNG_READ_APNG_SUPPORTED */ + +#ifdef PNG_WRITE_APNG_SUPPORTED +PNG_INTERNAL_FUNCTION(void,png_write_acTL,(png_structp png_ptr, + png_uint_32 num_frames, png_uint_32 num_plays),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_write_fcTL,(png_structp png_ptr, + png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, + png_byte dispose_op, png_byte blend_op),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_write_fdAT,(png_structp png_ptr, + png_const_bytep data, png_size_t length),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_write_reset,(png_structp png_ptr),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_write_reinit,(png_structp png_ptr, + png_infop info_ptr, png_uint_32 width, png_uint_32 height),PNG_EMPTY); +#endif /* PNG_WRITE_APNG_SUPPORTED */ +#endif /* PNG_APNG_SUPPORTED */ + /* Added at libpng version 1.4.0 */ #ifdef PNG_COLORSPACE_SUPPORTED /* These internal functions are for maintaining the colorspace structure within @@ -2119,11 +2174,11 @@ PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr, #if PNG_ARM_NEON_IMPLEMENTATION == 1 PNG_INTERNAL_FUNCTION(void, - png_riffle_palette_rgba, - (png_structrp, png_row_infop), + png_riffle_palette_neon, + (png_structrp), PNG_EMPTY); PNG_INTERNAL_FUNCTION(int, - png_do_expand_palette_neon_rgba, + png_do_expand_palette_rgba8_neon, (png_structrp, png_row_infop, png_const_bytep, @@ -2131,7 +2186,7 @@ PNG_INTERNAL_FUNCTION(int, const png_bytepp), PNG_EMPTY); PNG_INTERNAL_FUNCTION(int, - png_do_expand_palette_neon_rgb, + png_do_expand_palette_rgb8_neon, (png_structrp, png_row_infop, png_const_bytep, diff --git a/thirdparty/libpng/pngread.c b/thirdparty/libpng/pngread.c index f8e762196e..fa44d5a8e4 100644 --- a/thirdparty/libpng/pngread.c +++ b/thirdparty/libpng/pngread.c @@ -1,7 +1,7 @@ /* pngread.c - read a PNG file * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -161,6 +161,9 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { +#ifdef PNG_READ_APNG_SUPPORTED + png_have_info(png_ptr, info_ptr); +#endif png_ptr->idat_size = length; break; } @@ -255,6 +258,17 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, length); #endif +#ifdef PNG_READ_APNG_SUPPORTED + else if (chunk_name == png_acTL) + png_handle_acTL(png_ptr, info_ptr, length); + + else if (chunk_name == png_fcTL) + png_handle_fcTL(png_ptr, info_ptr, length); + + else if (chunk_name == png_fdAT) + png_handle_fdAT(png_ptr, info_ptr, length); +#endif + else png_handle_unknown(png_ptr, info_ptr, length, PNG_HANDLE_CHUNK_AS_DEFAULT); @@ -262,6 +276,72 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) } #endif /* SEQUENTIAL_READ */ +#ifdef PNG_READ_APNG_SUPPORTED +void PNGAPI +png_read_frame_head(png_structp png_ptr, png_infop info_ptr) +{ + png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */ + + png_debug(0, "Reading frame head"); + + if (!(png_ptr->mode & PNG_HAVE_acTL)) + png_error(png_ptr, "attempt to png_read_frame_head() but " + "no acTL present"); + + /* do nothing for the main IDAT */ + if (png_ptr->num_frames_read == 0) + return; + + png_read_reset(png_ptr); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; + png_ptr->mode &= ~PNG_HAVE_fcTL; + + have_chunk_after_DAT = 0; + for (;;) + { + png_uint_32 length = png_read_chunk_header(png_ptr); + + if (png_ptr->chunk_name == png_IDAT) + { + /* discard trailing IDATs for the first frame */ + if (have_chunk_after_DAT || png_ptr->num_frames_read > 1) + png_error(png_ptr, "png_read_frame_head(): out of place IDAT"); + png_crc_finish(png_ptr, length); + } + + else if (png_ptr->chunk_name == png_fcTL) + { + png_handle_fcTL(png_ptr, info_ptr, length); + have_chunk_after_DAT = 1; + } + + else if (png_ptr->chunk_name == png_fdAT) + { + png_ensure_sequence_number(png_ptr, length); + + /* discard trailing fdATs for frames other than the first */ + if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1) + png_crc_finish(png_ptr, length - 4); + else if(png_ptr->mode & PNG_HAVE_fcTL) + { + png_ptr->idat_size = length - 4; + png_ptr->mode |= PNG_HAVE_IDAT; + + break; + } + else + png_error(png_ptr, "png_read_frame_head(): out of place fdAT"); + } + else + { + png_warning(png_ptr, "Skipped (ignored) a chunk " + "between APNG chunks"); + png_crc_finish(png_ptr, length); + } + } +} +#endif /* PNG_READ_APNG_SUPPORTED */ + /* Optional call to update the users info_ptr structure */ void PNGAPI png_read_update_info(png_structrp png_ptr, png_inforp info_ptr) @@ -994,6 +1074,12 @@ png_read_destroy(png_structrp png_ptr) png_ptr->chunk_list = NULL; #endif +#if defined(PNG_READ_EXPAND_SUPPORTED) && \ + defined(PNG_ARM_NEON_IMPLEMENTATION) + png_free(png_ptr, png_ptr->riffled_palette); + png_ptr->riffled_palette = NULL; +#endif + /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error * callbacks are still set at this point. They are required to complete the * destruction of the png_struct itself. diff --git a/thirdparty/libpng/pngrtran.c b/thirdparty/libpng/pngrtran.c index ccc58ce6f1..9a8fad9f4a 100644 --- a/thirdparty/libpng/pngrtran.c +++ b/thirdparty/libpng/pngrtran.c @@ -1,7 +1,7 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -1182,20 +1182,20 @@ png_init_palette_transformations(png_structrp png_ptr) png_ptr->palette[png_ptr->background.index].blue; #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) - { - if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0) - { - /* Invert the alpha channel (in tRNS) unless the pixels are - * going to be expanded, in which case leave it for later - */ - int i, istop = png_ptr->num_trans; - - for (i=0; i<istop; i++) - png_ptr->trans_alpha[i] = (png_byte)(255 - - png_ptr->trans_alpha[i]); - } - } + if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) + { + if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0) + { + /* Invert the alpha channel (in tRNS) unless the pixels are + * going to be expanded, in which case leave it for later + */ + int i, istop = png_ptr->num_trans; + + for (i = 0; i < istop; i++) + png_ptr->trans_alpha[i] = + (png_byte)(255 - png_ptr->trans_alpha[i]); + } + } #endif /* READ_INVERT_ALPHA */ } } /* background expand and (therefore) no alpha association. */ @@ -4320,9 +4320,11 @@ png_do_expand_palette(png_structrp png_ptr, png_row_infop row_info, * but sometimes row_info->bit_depth has been changed to 8. * In these cases, the palette hasn't been riffled. */ - i = png_do_expand_palette_neon_rgba(png_ptr, row_info, row, + i = png_do_expand_palette_rgba8_neon(png_ptr, row_info, row, &sp, &dp); } +#else + PNG_UNUSED(png_ptr) #endif for (; i < row_width; i++) @@ -4349,8 +4351,10 @@ png_do_expand_palette(png_structrp png_ptr, png_row_infop row_info, dp = row + (size_t)(row_width * 3) - 1; i = 0; #ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE - i = png_do_expand_palette_neon_rgb(png_ptr, row_info, row, + i = png_do_expand_palette_rgb8_neon(png_ptr, row_info, row, &sp, &dp); +#else + PNG_UNUSED(png_ptr) #endif for (; i < row_width; i++) @@ -4770,19 +4774,17 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) #ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE if ((png_ptr->num_trans > 0) && (png_ptr->bit_depth == 8)) { - /* Allocate space for the decompressed full palette. */ if (png_ptr->riffled_palette == NULL) { - png_ptr->riffled_palette = png_malloc(png_ptr, 256*4); - if (png_ptr->riffled_palette == NULL) - png_error(png_ptr, "NULL row buffer"); - /* Build the RGBA palette. */ - png_riffle_palette_rgba(png_ptr, row_info); + /* Initialize the accelerated palette expansion. */ + png_ptr->riffled_palette = + (png_bytep)png_malloc(png_ptr, 256 * 4); + png_riffle_palette_neon(png_ptr); } } #endif png_do_expand_palette(png_ptr, row_info, png_ptr->row_buf + 1, - png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); + png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); } else diff --git a/thirdparty/libpng/pngrutil.c b/thirdparty/libpng/pngrutil.c index d5fa08c397..ae66a48a83 100644 --- a/thirdparty/libpng/pngrutil.c +++ b/thirdparty/libpng/pngrutil.c @@ -865,6 +865,11 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) filter_type = buf[11]; interlace_type = buf[12]; +#ifdef PNG_READ_APNG_SUPPORTED + png_ptr->first_frame_width = width; + png_ptr->first_frame_height = height; +#endif + /* Set internal variables */ png_ptr->width = width; png_ptr->height = height; @@ -2857,6 +2862,179 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif +#ifdef PNG_READ_APNG_SUPPORTED +void /* PRIVATE */ +png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte data[8]; + png_uint_32 num_frames; + png_uint_32 num_plays; + png_uint_32 didSet; + + png_debug(1, "in png_handle_acTL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + { + png_error(png_ptr, "Missing IHDR before acTL"); + } + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid acTL after IDAT skipped"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_acTL) + { + png_warning(png_ptr, "Duplicate acTL skipped"); + png_crc_finish(png_ptr, length); + return; + } + else if (length != 8) + { + png_warning(png_ptr, "acTL with invalid length skipped"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, data, 8); + png_crc_finish(png_ptr, 0); + + num_frames = png_get_uint_31(png_ptr, data); + num_plays = png_get_uint_31(png_ptr, data + 4); + + /* the set function will do error checking on num_frames */ + didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays); + if(didSet) + png_ptr->mode |= PNG_HAVE_acTL; +} + +void /* PRIVATE */ +png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte data[22]; + png_uint_32 width; + png_uint_32 height; + png_uint_32 x_offset; + png_uint_32 y_offset; + png_uint_16 delay_num; + png_uint_16 delay_den; + png_byte dispose_op; + png_byte blend_op; + + png_debug(1, "in png_handle_fcTL"); + + png_ensure_sequence_number(png_ptr, length); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + { + png_error(png_ptr, "Missing IHDR before fcTL"); + } + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + /* for any frames other then the first this message may be misleading, + * but correct. PNG_HAVE_IDAT is unset before the frame head is read + * i can't think of a better message */ + png_warning(png_ptr, "Invalid fcTL after IDAT skipped"); + png_crc_finish(png_ptr, length-4); + return; + } + else if (png_ptr->mode & PNG_HAVE_fcTL) + { + png_warning(png_ptr, "Duplicate fcTL within one frame skipped"); + png_crc_finish(png_ptr, length-4); + return; + } + else if (length != 26) + { + png_warning(png_ptr, "fcTL with invalid length skipped"); + png_crc_finish(png_ptr, length-4); + return; + } + + png_crc_read(png_ptr, data, 22); + png_crc_finish(png_ptr, 0); + + width = png_get_uint_31(png_ptr, data); + height = png_get_uint_31(png_ptr, data + 4); + x_offset = png_get_uint_31(png_ptr, data + 8); + y_offset = png_get_uint_31(png_ptr, data + 12); + delay_num = png_get_uint_16(data + 16); + delay_den = png_get_uint_16(data + 18); + dispose_op = data[20]; + blend_op = data[21]; + + if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0)) + { + png_warning(png_ptr, "fcTL for the first frame must have zero offset"); + return; + } + + if (info_ptr != NULL) + { + if (png_ptr->num_frames_read == 0 && + (width != info_ptr->width || height != info_ptr->height)) + { + png_warning(png_ptr, "size in first frame's fcTL must match " + "the size in IHDR"); + return; + } + + /* The set function will do more error checking */ + png_set_next_frame_fcTL(png_ptr, info_ptr, width, height, + x_offset, y_offset, delay_num, delay_den, + dispose_op, blend_op); + + png_read_reinit(png_ptr, info_ptr); + + png_ptr->mode |= PNG_HAVE_fcTL; + } +} + +void /* PRIVATE */ +png_have_info(png_structp png_ptr, png_infop info_ptr) +{ + if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL)) + { + png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; + info_ptr->num_frames++; + } +} + +void /* PRIVATE */ +png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_ensure_sequence_number(png_ptr, length); + + /* This function is only called from png_read_end(), png_read_info(), + * and png_push_read_chunk() which means that: + * - the user doesn't want to read this frame + * - or this is an out-of-place fdAT + * in either case it is safe to ignore the chunk with a warning */ + png_warning(png_ptr, "ignoring fdAT chunk"); + png_crc_finish(png_ptr, length - 4); + PNG_UNUSED(info_ptr) +} + +void /* PRIVATE */ +png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length) +{ + png_byte data[4]; + png_uint_32 sequence_number; + + if (length < 4) + png_error(png_ptr, "invalid fcTL or fdAT chunk found"); + + png_crc_read(png_ptr, data, 4); + sequence_number = png_get_uint_31(png_ptr, data); + + if (sequence_number != png_ptr->next_seq_num) + png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence " + "number found"); + + png_ptr->next_seq_num++; +} +#endif /* PNG_READ_APNG_SUPPORTED */ + #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED /* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */ static int @@ -4165,7 +4343,38 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, { uInt avail_in; png_bytep buffer; +#ifdef PNG_READ_APNG_SUPPORTED + png_uint_32 bytes_to_skip = 0; + + while (png_ptr->idat_size == 0 || bytes_to_skip != 0) + { + png_crc_finish(png_ptr, bytes_to_skip); + bytes_to_skip = 0; + + png_ptr->idat_size = png_read_chunk_header(png_ptr); + if (png_ptr->num_frames_read == 0) + { + if (png_ptr->chunk_name != png_IDAT) + png_error(png_ptr, "Not enough image data"); + } + else + { + if (png_ptr->chunk_name == png_IEND) + png_error(png_ptr, "Not enough image data"); + if (png_ptr->chunk_name != png_fdAT) + { + png_warning(png_ptr, "Skipped (ignored) a chunk " + "between APNG chunks"); + bytes_to_skip = png_ptr->idat_size; + continue; + } + + png_ensure_sequence_number(png_ptr, png_ptr->idat_size); + png_ptr->idat_size -= 4; + } + } +#else while (png_ptr->idat_size == 0) { png_crc_finish(png_ptr, 0); @@ -4177,7 +4386,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, if (png_ptr->chunk_name != png_IDAT) png_error(png_ptr, "Not enough image data"); } - +#endif /* PNG_READ_APNG_SUPPORTED */ avail_in = png_ptr->IDAT_read_size; if (avail_in > png_ptr->idat_size) @@ -4240,6 +4449,9 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; +#ifdef PNG_READ_APNG_SUPPORTED + png_ptr->num_frames_read++; +#endif if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0) png_chunk_benign_error(png_ptr, "Extra compressed data"); @@ -4678,4 +4890,80 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_ptr->flags |= PNG_FLAG_ROW_INIT; } + +#ifdef PNG_READ_APNG_SUPPORTED +/* This function is to be called after the main IDAT set has been read and + * before a new IDAT is read. It resets some parts of png_ptr + * to make them usable by the read functions again */ +void /* PRIVATE */ +png_read_reset(png_structp png_ptr) +{ + png_ptr->mode &= ~PNG_HAVE_IDAT; + png_ptr->mode &= ~PNG_AFTER_IDAT; + png_ptr->row_number = 0; + png_ptr->pass = 0; +} + +void /* PRIVATE */ +png_read_reinit(png_structp png_ptr, png_infop info_ptr) +{ + png_ptr->width = info_ptr->next_frame_width; + png_ptr->height = info_ptr->next_frame_height; + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); + png_ptr->info_rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, + png_ptr->width); + if (png_ptr->prev_row) + memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); +} + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* same as png_read_reset() but for the progressive reader */ +void /* PRIVATE */ +png_progressive_read_reset(png_structp png_ptr) +{ +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; + + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + else + png_ptr->num_rows = png_ptr->height; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + } + else +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + { + png_ptr->num_rows = png_ptr->height; + png_ptr->iwidth = png_ptr->width; + } + png_ptr->flags &= ~PNG_FLAG_ZSTREAM_ENDED; + if (inflateReset(&(png_ptr->zstream)) != Z_OK) + png_error(png_ptr, "inflateReset failed"); + png_ptr->zstream.avail_in = 0; + png_ptr->zstream.next_in = 0; + png_ptr->zstream.next_out = png_ptr->row_buf; + png_ptr->zstream.avail_out = (uInt)PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; +} +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ +#endif /* PNG_READ_APNG_SUPPORTED */ #endif /* READ */ diff --git a/thirdparty/libpng/pngset.c b/thirdparty/libpng/pngset.c index ec75dbe369..a281db58ae 100644 --- a/thirdparty/libpng/pngset.c +++ b/thirdparty/libpng/pngset.c @@ -288,6 +288,11 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); + +#ifdef PNG_APNG_SUPPORTED + /* for non-animated png. this may be overwritten from an acTL chunk later */ + info_ptr->num_frames = 1; +#endif } #ifdef PNG_oFFs_SUPPORTED @@ -1158,6 +1163,147 @@ png_set_sPLT(png_const_structrp png_ptr, } #endif /* sPLT */ +#ifdef PNG_APNG_SUPPORTED +png_uint_32 PNGAPI +png_set_acTL(png_structp png_ptr, png_infop info_ptr, + png_uint_32 num_frames, png_uint_32 num_plays) +{ + png_debug1(1, "in %s storage function", "acTL"); + + if (png_ptr == NULL || info_ptr == NULL) + { + png_warning(png_ptr, + "Call to png_set_acTL() with NULL png_ptr " + "or info_ptr ignored"); + return (0); + } + if (num_frames == 0) + { + png_warning(png_ptr, + "Ignoring attempt to set acTL with num_frames zero"); + return (0); + } + if (num_frames > PNG_UINT_31_MAX) + { + png_warning(png_ptr, + "Ignoring attempt to set acTL with num_frames > 2^31-1"); + return (0); + } + if (num_plays > PNG_UINT_31_MAX) + { + png_warning(png_ptr, + "Ignoring attempt to set acTL with num_plays " + "> 2^31-1"); + return (0); + } + + info_ptr->num_frames = num_frames; + info_ptr->num_plays = num_plays; + + info_ptr->valid |= PNG_INFO_acTL; + + return (1); +} + +/* delay_num and delay_den can hold any 16-bit values including zero */ +png_uint_32 PNGAPI +png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, + png_byte dispose_op, png_byte blend_op) +{ + png_debug1(1, "in %s storage function", "fcTL"); + + if (png_ptr == NULL || info_ptr == NULL) + { + png_warning(png_ptr, + "Call to png_set_fcTL() with NULL png_ptr or info_ptr " + "ignored"); + return (0); + } + + png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, + delay_num, delay_den, dispose_op, blend_op); + + if (blend_op == PNG_BLEND_OP_OVER) + { + if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) && + !(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) + { + png_warning(png_ptr, "PNG_BLEND_OP_OVER is meaningless " + "and wasteful for opaque images, ignored"); + blend_op = PNG_BLEND_OP_SOURCE; + } + } + + info_ptr->next_frame_width = width; + info_ptr->next_frame_height = height; + info_ptr->next_frame_x_offset = x_offset; + info_ptr->next_frame_y_offset = y_offset; + info_ptr->next_frame_delay_num = delay_num; + info_ptr->next_frame_delay_den = delay_den; + info_ptr->next_frame_dispose_op = dispose_op; + info_ptr->next_frame_blend_op = blend_op; + + info_ptr->valid |= PNG_INFO_fcTL; + + return (1); +} + +void /* PRIVATE */ +png_ensure_fcTL_is_valid(png_structp png_ptr, + png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, + png_byte dispose_op, png_byte blend_op) +{ + if (width == 0 || width > PNG_UINT_31_MAX) + png_error(png_ptr, "invalid width in fcTL (> 2^31-1)"); + if (height == 0 || height > PNG_UINT_31_MAX) + png_error(png_ptr, "invalid height in fcTL (> 2^31-1)"); + if (x_offset > PNG_UINT_31_MAX) + png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)"); + if (y_offset > PNG_UINT_31_MAX) + png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)"); + if (width + x_offset > png_ptr->first_frame_width || + height + y_offset > png_ptr->first_frame_height) + png_error(png_ptr, "dimensions of a frame are greater than" + "the ones in IHDR"); + + if (dispose_op != PNG_DISPOSE_OP_NONE && + dispose_op != PNG_DISPOSE_OP_BACKGROUND && + dispose_op != PNG_DISPOSE_OP_PREVIOUS) + png_error(png_ptr, "invalid dispose_op in fcTL"); + + if (blend_op != PNG_BLEND_OP_SOURCE && + blend_op != PNG_BLEND_OP_OVER) + png_error(png_ptr, "invalid blend_op in fcTL"); + + PNG_UNUSED(delay_num) + PNG_UNUSED(delay_den) +} + +png_uint_32 PNGAPI +png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr, + png_byte is_hidden) +{ + png_debug(1, "in png_first_frame_is_hidden()"); + + if (png_ptr == NULL) + return 0; + + if (is_hidden) + png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; + else + png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN; + + PNG_UNUSED(info_ptr) + + return 1; +} +#endif /* PNG_APNG_SUPPORTED */ + #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED static png_byte check_location(png_const_structrp png_ptr, int location) diff --git a/thirdparty/libpng/pngstruct.h b/thirdparty/libpng/pngstruct.h index 94a6d041ff..2a2236f92e 100644 --- a/thirdparty/libpng/pngstruct.h +++ b/thirdparty/libpng/pngstruct.h @@ -1,7 +1,7 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -228,10 +228,6 @@ struct png_struct_def * big_row_buf; while writing it is separately * allocated. */ -#ifdef PNG_READ_EXPAND_SUPPORTED - /* Buffer to accelerate palette transformations. */ - png_bytep riffled_palette; -#endif #ifdef PNG_WRITE_FILTER_SUPPORTED png_bytep try_row; /* buffer to save trial row when filtering */ png_bytep tst_row; /* buffer to save best trial row when filtering */ @@ -396,6 +392,12 @@ struct png_struct_def /* deleted in 1.5.5: rgb_to_gray_blue_coeff; */ #endif +/* New member added in libpng-1.6.36 */ +#if defined(PNG_READ_EXPAND_SUPPORTED) && \ + defined(PNG_ARM_NEON_IMPLEMENTATION) + png_bytep riffled_palette; /* buffer for accelerated palette expansion */ +#endif + /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) /* Changed from png_byte to png_uint_32 at version 1.2.0 */ @@ -407,6 +409,27 @@ struct png_struct_def png_byte filter_type; #endif +#ifdef PNG_APNG_SUPPORTED + png_uint_32 apng_flags; + png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */ + png_uint_32 first_frame_width; + png_uint_32 first_frame_height; + +#ifdef PNG_READ_APNG_SUPPORTED + png_uint_32 num_frames_read; /* incremented after all image data of */ + /* a frame is read */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ + png_progressive_frame_ptr frame_end_fn; /* frame data read callback */ +#endif +#endif + +#ifdef PNG_WRITE_APNG_SUPPORTED + png_uint_32 num_frames_to_write; + png_uint_32 num_frames_written; +#endif +#endif /* PNG_APNG_SUPPORTED */ + /* New members added in libpng-1.2.0 */ /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ diff --git a/thirdparty/libpng/pngwrite.c b/thirdparty/libpng/pngwrite.c index 160c877d38..5e68032378 100644 --- a/thirdparty/libpng/pngwrite.c +++ b/thirdparty/libpng/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2019 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -128,6 +128,10 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) * the application continues writing the PNG. So check the 'invalid' * flag here too. */ +#ifdef PNG_WRITE_APNG_SUPPORTED + if (info_ptr->valid & PNG_INFO_acTL) + png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays); +#endif #ifdef PNG_GAMMA_SUPPORTED # ifdef PNG_WRITE_gAMA_SUPPORTED if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && @@ -370,6 +374,11 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); #endif +#ifdef PNG_WRITE_APNG_SUPPORTED + if (png_ptr->num_frames_written != png_ptr->num_frames_to_write) + png_error(png_ptr, "Not enough frames written"); +#endif + /* See if user wants us to write information chunks */ if (info_ptr != NULL) { @@ -948,10 +957,6 @@ png_write_destroy(png_structrp png_ptr) png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list); png_free(png_ptr, png_ptr->row_buf); png_ptr->row_buf = NULL; -#ifdef PNG_READ_EXPANDED_SUPPORTED - png_free(png_ptr, png_ptr->riffled_palette); - png_ptr->riffled_palette = NULL; -#endif #ifdef PNG_WRITE_FILTER_SUPPORTED png_free(png_ptr, png_ptr->prev_row); png_free(png_ptr, png_ptr->try_row); @@ -1465,6 +1470,43 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, } #endif +#ifdef PNG_WRITE_APNG_SUPPORTED +void PNGAPI +png_write_frame_head(png_structp png_ptr, png_infop info_ptr, + png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, + png_byte blend_op) +{ + png_debug(1, "in png_write_frame_head"); + + /* there is a chance this has been set after png_write_info was called, + * so it would be set but not written. is there a way to be sure? */ + if (!(info_ptr->valid & PNG_INFO_acTL)) + png_error(png_ptr, "png_write_frame_head(): acTL not set"); + + png_write_reset(png_ptr); + + png_write_reinit(png_ptr, info_ptr, width, height); + + if ( !(png_ptr->num_frames_written == 0 && + (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) ) + png_write_fcTL(png_ptr, width, height, x_offset, y_offset, + delay_num, delay_den, dispose_op, blend_op); + + PNG_UNUSED(row_pointers) +} + +void PNGAPI +png_write_frame_tail(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_write_frame_tail"); + + png_ptr->num_frames_written++; + + PNG_UNUSED(info_ptr) +} +#endif /* PNG_WRITE_APNG_SUPPORTED */ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED /* Initialize the write structure - general purpose utility. */ diff --git a/thirdparty/libpng/pngwutil.c b/thirdparty/libpng/pngwutil.c index 16345e4c0b..b4809cda6b 100644 --- a/thirdparty/libpng/pngwutil.c +++ b/thirdparty/libpng/pngwutil.c @@ -821,6 +821,11 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, /* Write the chunk */ png_write_complete_chunk(png_ptr, png_IHDR, buf, 13); +#ifdef PNG_WRITE_APNG_SUPPORTED + png_ptr->first_frame_width = width; + png_ptr->first_frame_height = height; +#endif + if ((png_ptr->do_filter) == PNG_NO_FILTERS) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || @@ -1002,8 +1007,17 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, optimize_cmf(data, png_image_size(png_ptr)); #endif - if (size > 0) - png_write_complete_chunk(png_ptr, png_IDAT, data, size); + if (size > 0) +#ifdef PNG_WRITE_APNG_SUPPORTED + { + if (png_ptr->num_frames_written == 0) +#endif + png_write_complete_chunk(png_ptr, png_IDAT, data, size); +#ifdef PNG_WRITE_APNG_SUPPORTED + else + png_write_fdAT(png_ptr, data, size); + } +#endif /* PNG_WRITE_APNG_SUPPORTED */ png_ptr->mode |= PNG_HAVE_IDAT; png_ptr->zstream.next_out = data; @@ -1050,7 +1064,17 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, #endif if (size > 0) +#ifdef PNG_WRITE_APNG_SUPPORTED + { + if (png_ptr->num_frames_written == 0) +#endif png_write_complete_chunk(png_ptr, png_IDAT, data, size); +#ifdef PNG_WRITE_APNG_SUPPORTED + else + png_write_fdAT(png_ptr, data, size); + } +#endif /* PNG_WRITE_APNG_SUPPORTED */ + png_ptr->zstream.avail_out = 0; png_ptr->zstream.next_out = NULL; png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT; @@ -1885,6 +1909,82 @@ png_write_tIME(png_structrp png_ptr, png_const_timep mod_time) } #endif +#ifdef PNG_WRITE_APNG_SUPPORTED +void /* PRIVATE */ +png_write_acTL(png_structp png_ptr, + png_uint_32 num_frames, png_uint_32 num_plays) +{ + png_byte buf[8]; + + png_debug(1, "in png_write_acTL"); + + png_ptr->num_frames_to_write = num_frames; + + if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) + num_frames--; + + png_save_uint_32(buf, num_frames); + png_save_uint_32(buf + 4, num_plays); + + png_write_complete_chunk(png_ptr, png_acTL, buf, (png_size_t)8); +} + +void /* PRIVATE */ +png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height, + png_uint_32 x_offset, png_uint_32 y_offset, + png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, + png_byte blend_op) +{ + png_byte buf[26]; + + png_debug(1, "in png_write_fcTL"); + + if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0)) + png_error(png_ptr, "x and/or y offset for the first frame aren't 0"); + if (png_ptr->num_frames_written == 0 && + (width != png_ptr->first_frame_width || + height != png_ptr->first_frame_height)) + png_error(png_ptr, "width and/or height in the first frame's fcTL " + "don't match the ones in IHDR"); + + /* more error checking */ + png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, + delay_num, delay_den, dispose_op, blend_op); + + png_save_uint_32(buf, png_ptr->next_seq_num); + png_save_uint_32(buf + 4, width); + png_save_uint_32(buf + 8, height); + png_save_uint_32(buf + 12, x_offset); + png_save_uint_32(buf + 16, y_offset); + png_save_uint_16(buf + 20, delay_num); + png_save_uint_16(buf + 22, delay_den); + buf[24] = dispose_op; + buf[25] = blend_op; + + png_write_complete_chunk(png_ptr, png_fcTL, buf, (png_size_t)26); + + png_ptr->next_seq_num++; +} + +void /* PRIVATE */ +png_write_fdAT(png_structp png_ptr, + png_const_bytep data, png_size_t length) +{ + png_byte buf[4]; + + png_write_chunk_header(png_ptr, png_fdAT, (png_uint_32)(4 + length)); + + png_save_uint_32(buf, png_ptr->next_seq_num); + png_write_chunk_data(png_ptr, buf, 4); + + png_write_chunk_data(png_ptr, data, length); + + png_write_chunk_end(png_ptr); + + png_ptr->next_seq_num++; +} +#endif /* PNG_WRITE_APNG_SUPPORTED */ + /* Initializes the row writing capability of libpng */ void /* PRIVATE */ png_write_start_row(png_structrp png_ptr) @@ -2778,4 +2878,39 @@ png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, } #endif /* WRITE_FLUSH */ } + +#ifdef PNG_WRITE_APNG_SUPPORTED +void /* PRIVATE */ +png_write_reset(png_structp png_ptr) +{ + png_ptr->row_number = 0; + png_ptr->pass = 0; + png_ptr->mode &= ~PNG_HAVE_IDAT; +} + +void /* PRIVATE */ +png_write_reinit(png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height) +{ + if (png_ptr->num_frames_written == 0 && + (width != png_ptr->first_frame_width || + height != png_ptr->first_frame_height)) + png_error(png_ptr, "width and/or height in the first frame's fcTL " + "don't match the ones in IHDR"); + if (width > png_ptr->first_frame_width || + height > png_ptr->first_frame_height) + png_error(png_ptr, "width and/or height for a frame greater than" + "the ones in IHDR"); + + png_set_IHDR(png_ptr, info_ptr, width, height, + info_ptr->bit_depth, info_ptr->color_type, + info_ptr->interlace_type, info_ptr->compression_type, + info_ptr->filter_type); + + png_ptr->width = width; + png_ptr->height = height; + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); + png_ptr->usr_width = png_ptr->width; +} +#endif /* PNG_WRITE_APNG_SUPPORTED */ #endif /* WRITE */ |