diff options
366 files changed, 12132 insertions, 6484 deletions
diff --git a/.github/actions/godot-build/action.yml b/.github/actions/godot-build/action.yml index 7af3516f71..75f3d9ab37 100644 --- a/.github/actions/godot-build/action.yml +++ b/.github/actions/godot-build/action.yml @@ -35,5 +35,5 @@ runs: run: | echo "Building with flags:" ${{ env.SCONSFLAGS }} if ! ${{ inputs.tools }}; then rm -rf editor; fi # Ensure we don't include editor code. - scons p=${{ inputs.platform }} target=${{ inputs.target }} tools=${{ inputs.tools }} tests=${{ inputs.tests }} --jobs=2 ${{ env.SCONSFLAGS }} + scons p=${{ inputs.platform }} target=${{ inputs.target }} tools=${{ inputs.tools }} tests=${{ inputs.tests }} ${{ env.SCONSFLAGS }} ls -l bin/ diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 0c6a140e28..b88c84e34e 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -212,7 +212,7 @@ jobs: if: ${{ matrix.godot-cpp-test }} run: | cd godot-cpp/test - scons target=${{ matrix.target }} -j2 + scons target=${{ matrix.target }} cd ../.. - name: Prepare artifact diff --git a/SConstruct b/SConstruct index 50cb43b218..0eba93e4ff 100644 --- a/SConstruct +++ b/SConstruct @@ -399,6 +399,24 @@ if selected_platform in platform_list: env = env_base.Clone() + # Default num_jobs to local cpu count if not user specified. + # SCons has a peculiarity where user-specified options won't be overridden + # by SetOption, so we can rely on this to know if we should use our default. + initial_num_jobs = env.GetOption("num_jobs") + altered_num_jobs = initial_num_jobs + 1 + env.SetOption("num_jobs", altered_num_jobs) + if env.GetOption("num_jobs") == altered_num_jobs: + cpu_count = os.cpu_count() + if cpu_count is None: + print("Couldn't auto-detect CPU count to configure build parallelism. Specify it with the -j argument.") + else: + safer_cpu_count = cpu_count if cpu_count <= 4 else cpu_count - 1 + print( + "Auto-detected %d CPU cores available for build parallelism. Using %d cores by default. You can override it with the -j argument." + % (cpu_count, safer_cpu_count) + ) + env.SetOption("num_jobs", safer_cpu_count) + if env["compiledb"]: # Generating the compilation DB (`compile_commands.json`) requires SCons 4.0.0 or later. from SCons import __version__ as scons_raw_version diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 24d8b0af6e..1753efad60 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -570,9 +570,7 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_ENUM); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_ENUM_SUGGESTION); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_EXP_EASING); - BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LENGTH); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LINK); - BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_KEY_ACCEL); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_FLAGS); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LAYERS_2D_RENDER); @@ -620,15 +618,14 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_NONE); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_STORAGE); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_EDITOR); - BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_NETWORK); - BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_EDITOR_HELPER); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_CHECKABLE); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_CHECKED); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_INTERNATIONALIZED); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_GROUP); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_CATEGORY); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_SUBGROUP); + BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_CLASS_IS_BITFIELD); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_NO_INSTANCE_STATE); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_RESTART_IF_CHANGED); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_SCRIPT_VARIABLE); @@ -656,11 +653,8 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_NORMAL); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_EDITOR); - BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_NOSCRIPT); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_CONST); - BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_REVERSE); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_VIRTUAL); - BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_FROM_SCRIPT); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_VARARG); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_STATIC); BIND_CORE_ENUM_CONSTANT(METHOD_FLAG_OBJECT_CORE); diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index d5c49b01e9..ecdb1e26dc 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -46,9 +46,12 @@ static String get_type_name(const PropertyInfo &p_info) { return p_info.hint_string + "*"; } } - if (p_info.type == Variant::INT && (p_info.usage & (PROPERTY_USAGE_CLASS_IS_ENUM | PROPERTY_USAGE_CLASS_IS_BITFIELD))) { + if (p_info.type == Variant::INT && (p_info.usage & (PROPERTY_USAGE_CLASS_IS_ENUM))) { return String("enum::") + String(p_info.class_name); } + if (p_info.type == Variant::INT && (p_info.usage & (PROPERTY_USAGE_CLASS_IS_BITFIELD))) { + return String("bitfield::") + String(p_info.class_name); + } if (p_info.class_name != StringName()) { return p_info.class_name; } diff --git a/core/extension/gdnative_interface.h b/core/extension/gdnative_interface.h index ccd6fb0f7e..f106b805e7 100644 --- a/core/extension/gdnative_interface.h +++ b/core/extension/gdnative_interface.h @@ -252,13 +252,10 @@ typedef void *GDNativeExtensionClassLibraryPtr; typedef enum { GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1, GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2, - GDNATIVE_EXTENSION_METHOD_FLAG_NOSCRIPT = 4, - GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 8, - GDNATIVE_EXTENSION_METHOD_FLAG_REVERSE = 16, /* used for events */ - GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 32, - GDNATIVE_EXTENSION_METHOD_FLAG_FROM_SCRIPT = 64, - GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 128, - GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 256, + GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 4, + GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 8, + GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 16, + GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 32, GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL, } GDNativeExtensionClassMethodFlags; @@ -540,7 +537,7 @@ typedef struct { void (*classdb_register_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs); void (*classdb_register_extension_class_method)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info); - void (*classdb_register_extension_class_integer_constant)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value); + void (*classdb_register_extension_class_integer_constant)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield); void (*classdb_register_extension_class_property)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativePropertyInfo *p_info, const char *p_setter, const char *p_getter); void (*classdb_register_extension_class_property_group)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_group_name, const char *p_prefix); void (*classdb_register_extension_class_property_subgroup)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_subgroup_name, const char *p_prefix); diff --git a/core/extension/native_extension.cpp b/core/extension/native_extension.cpp index 262e28b442..b69859b441 100644 --- a/core/extension/native_extension.cpp +++ b/core/extension/native_extension.cpp @@ -182,7 +182,7 @@ void NativeExtension::_register_extension_class_method(const GDNativeExtensionCl ClassDB::bind_method_custom(class_name, method); } -void NativeExtension::_register_extension_class_integer_constant(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value) { +void NativeExtension::_register_extension_class_integer_constant(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield) { NativeExtension *self = static_cast<NativeExtension *>(p_library); StringName class_name = p_class_name; @@ -190,7 +190,7 @@ void NativeExtension::_register_extension_class_integer_constant(const GDNativeE //Extension *extension = &self->extension_classes[class_name]; - ClassDB::bind_integer_constant(class_name, p_enum_name, p_constant_name, p_constant_value); + ClassDB::bind_integer_constant(class_name, p_enum_name, p_constant_name, p_constant_value, p_is_bitfield); } void NativeExtension::_register_extension_class_property(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativePropertyInfo *p_info, const char *p_setter, const char *p_getter) { diff --git a/core/extension/native_extension.h b/core/extension/native_extension.h index 8f106f753d..ca50f78621 100644 --- a/core/extension/native_extension.h +++ b/core/extension/native_extension.h @@ -49,7 +49,7 @@ class NativeExtension : public Resource { static void _register_extension_class(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs); static void _register_extension_class_method(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info); - static void _register_extension_class_integer_constant(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value); + static void _register_extension_class_integer_constant(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield); static void _register_extension_class_property(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativePropertyInfo *p_info, const char *p_setter, const char *p_getter); static void _register_extension_class_property_group(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_group_name, const char *p_prefix); static void _register_extension_class_property_subgroup(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_subgroup_name, const char *p_prefix); diff --git a/core/object/object.h b/core/object/object.h index 87d042dd7e..705d6451dc 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -51,9 +51,7 @@ enum PropertyHint { PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" PROPERTY_HINT_ENUM_SUGGESTION, ///< hint_text= "val1,val2,val3,etc" PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "full" to also include in/out. (ie: "attenuation,inout") - PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) PROPERTY_HINT_LINK, - PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) PROPERTY_HINT_LAYERS_2D_RENDER, PROPERTY_HINT_LAYERS_2D_PHYSICS, @@ -99,41 +97,39 @@ enum PropertyHint { enum PropertyUsageFlags { PROPERTY_USAGE_NONE = 0, - PROPERTY_USAGE_STORAGE = 1, - PROPERTY_USAGE_EDITOR = 2, - PROPERTY_USAGE_NETWORK = 4, - PROPERTY_USAGE_EDITOR_HELPER = 8, - PROPERTY_USAGE_CHECKABLE = 16, //used for editing global variables - PROPERTY_USAGE_CHECKED = 32, //used for editing global variables - PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings - PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor - PROPERTY_USAGE_CATEGORY = 256, - PROPERTY_USAGE_SUBGROUP = 512, - PROPERTY_USAGE_CLASS_IS_BITFIELD = 1024, - PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, - PROPERTY_USAGE_RESTART_IF_CHANGED = 4096, - PROPERTY_USAGE_SCRIPT_VARIABLE = 8192, - PROPERTY_USAGE_STORE_IF_NULL = 16384, - PROPERTY_USAGE_ANIMATE_AS_TRIGGER = 32768, - PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED = 65536, - PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE = 1 << 17, - PROPERTY_USAGE_CLASS_IS_ENUM = 1 << 18, - PROPERTY_USAGE_NIL_IS_VARIANT = 1 << 19, - PROPERTY_USAGE_INTERNAL = 1 << 20, - PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE = 1 << 21, // If the object is duplicated also this property will be duplicated - PROPERTY_USAGE_HIGH_END_GFX = 1 << 22, - PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 23, - PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT = 1 << 24, - PROPERTY_USAGE_KEYING_INCREMENTS = 1 << 25, // Used in inspector to increment property when keyed in animation player - PROPERTY_USAGE_DEFERRED_SET_RESOURCE = 1 << 26, // when loading, the resource for this property can be set at the end of loading - PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT = 1 << 27, // For Object properties, instantiate them when creating in editor. - PROPERTY_USAGE_EDITOR_BASIC_SETTING = 1 << 28, //for project or editor settings, show when basic settings are selected - PROPERTY_USAGE_READ_ONLY = 1 << 29, // Mark a property as read-only in the inspector. - PROPERTY_USAGE_ARRAY = 1 << 30, // Used in the inspector to group properties as elements of an array. - - PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK, - PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED, - PROPERTY_USAGE_NO_EDITOR = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_NETWORK, + PROPERTY_USAGE_STORAGE = 1 << 1, + PROPERTY_USAGE_EDITOR = 1 << 2, + PROPERTY_USAGE_CHECKABLE = 1 << 3, // Used for editing global variables. + PROPERTY_USAGE_CHECKED = 1 << 4, // Used for editing global variables. + PROPERTY_USAGE_INTERNATIONALIZED = 1 << 5, // Hint for internationalized strings. + PROPERTY_USAGE_GROUP = 1 << 6, // Used for grouping props in the editor. + PROPERTY_USAGE_CATEGORY = 1 << 7, + PROPERTY_USAGE_SUBGROUP = 1 << 8, + PROPERTY_USAGE_CLASS_IS_BITFIELD = 1 << 9, + PROPERTY_USAGE_NO_INSTANCE_STATE = 1 << 10, + PROPERTY_USAGE_RESTART_IF_CHANGED = 1 << 11, + PROPERTY_USAGE_SCRIPT_VARIABLE = 1 << 12, + PROPERTY_USAGE_STORE_IF_NULL = 1 << 13, + PROPERTY_USAGE_ANIMATE_AS_TRIGGER = 1 << 14, + PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED = 1 << 15, + PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE = 1 << 16, + PROPERTY_USAGE_CLASS_IS_ENUM = 1 << 17, + PROPERTY_USAGE_NIL_IS_VARIANT = 1 << 18, + PROPERTY_USAGE_INTERNAL = 1 << 19, + PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE = 1 << 20, // If the object is duplicated also this property will be duplicated. + PROPERTY_USAGE_HIGH_END_GFX = 1 << 21, + PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 22, + PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT = 1 << 23, + PROPERTY_USAGE_KEYING_INCREMENTS = 1 << 24, // Used in inspector to increment property when keyed in animation player. + PROPERTY_USAGE_DEFERRED_SET_RESOURCE = 1 << 25, // when loading, the resource for this property can be set at the end of loading. + PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT = 1 << 26, // For Object properties, instantiate them when creating in editor. + PROPERTY_USAGE_EDITOR_BASIC_SETTING = 1 << 27, //for project or editor settings, show when basic settings are selected. + PROPERTY_USAGE_READ_ONLY = 1 << 28, // Mark a property as read-only in the inspector. + PROPERTY_USAGE_ARRAY = 1 << 29, // Used in the inspector to group properties as elements of an array. + + PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR, + PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_INTERNATIONALIZED, + PROPERTY_USAGE_NO_EDITOR = PROPERTY_USAGE_STORAGE, }; #define ADD_SIGNAL(m_signal) ::ClassDB::add_signal(get_class_static(), m_signal) @@ -218,14 +214,11 @@ Array convert_property_list(const List<PropertyInfo> *p_list); enum MethodFlags { METHOD_FLAG_NORMAL = 1, METHOD_FLAG_EDITOR = 2, - METHOD_FLAG_NOSCRIPT = 4, - METHOD_FLAG_CONST = 8, - METHOD_FLAG_REVERSE = 16, // used for events - METHOD_FLAG_VIRTUAL = 32, - METHOD_FLAG_FROM_SCRIPT = 64, - METHOD_FLAG_VARARG = 128, - METHOD_FLAG_STATIC = 256, - METHOD_FLAG_OBJECT_CORE = 512, + METHOD_FLAG_CONST = 4, + METHOD_FLAG_VIRTUAL = 8, + METHOD_FLAG_VARARG = 16, + METHOD_FLAG_STATIC = 32, + METHOD_FLAG_OBJECT_CORE = 64, METHOD_FLAGS_DEFAULT = METHOD_FLAG_NORMAL, }; diff --git a/core/variant/type_info.h b/core/variant/type_info.h index 794274dd77..1bd3a74289 100644 --- a/core/variant/type_info.h +++ b/core/variant/type_info.h @@ -289,6 +289,7 @@ public: _FORCE_INLINE_ void clear_flag(T p_flag) { return value &= ~p_flag; } _FORCE_INLINE_ BitField(uint32_t p_value) { value = p_value; } _FORCE_INLINE_ operator uint32_t() const { return value; } + _FORCE_INLINE_ operator Variant() const { return value; } }; #define TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_impl) \ diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 1943221309..7acec9e63b 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -2515,72 +2515,66 @@ <constant name="PROPERTY_HINT_EXP_EASING" value="4" enum="PropertyHint"> Hints that a float property should be edited via an exponential easing function. The hint string can include [code]"attenuation"[/code] to flip the curve horizontally and/or [code]"inout"[/code] to also include in/out easing. </constant> - <constant name="PROPERTY_HINT_LENGTH" value="5" enum="PropertyHint"> - Deprecated hint, unused. - </constant> - <constant name="PROPERTY_HINT_LINK" value="6" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LINK" value="5" enum="PropertyHint"> Hints that a vector property should allow linking values (e.g. to edit both [code]x[/code] and [code]y[/code] together). </constant> - <constant name="PROPERTY_HINT_KEY_ACCEL" value="7" enum="PropertyHint"> - Deprecated hint, unused. - </constant> - <constant name="PROPERTY_HINT_FLAGS" value="8" enum="PropertyHint"> + <constant name="PROPERTY_HINT_FLAGS" value="6" enum="PropertyHint"> Hints that an integer property is a bitmask with named bit flags. For example, to allow toggling bits 0, 1, 2 and 4, the hint could be something like [code]"Bit0,Bit1,Bit2,,Bit4"[/code]. </constant> - <constant name="PROPERTY_HINT_LAYERS_2D_RENDER" value="9" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_2D_RENDER" value="7" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 2D render layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_2D_PHYSICS" value="10" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_2D_PHYSICS" value="8" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 2D physics layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_2D_NAVIGATION" value="11" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_2D_NAVIGATION" value="9" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 2D navigation layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_3D_RENDER" value="12" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_3D_RENDER" value="10" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 3D render layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_3D_PHYSICS" value="13" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_3D_PHYSICS" value="11" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 3D physics layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_3D_NAVIGATION" value="14" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_3D_NAVIGATION" value="12" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 3D navigation layers. </constant> - <constant name="PROPERTY_HINT_FILE" value="15" enum="PropertyHint"> + <constant name="PROPERTY_HINT_FILE" value="13" enum="PropertyHint"> Hints that a string property is a path to a file. Editing it will show a file dialog for picking the path. The hint string can be a set of filters with wildcards like [code]"*.png,*.jpg"[/code]. </constant> - <constant name="PROPERTY_HINT_DIR" value="16" enum="PropertyHint"> + <constant name="PROPERTY_HINT_DIR" value="14" enum="PropertyHint"> Hints that a string property is a path to a directory. Editing it will show a file dialog for picking the path. </constant> - <constant name="PROPERTY_HINT_GLOBAL_FILE" value="17" enum="PropertyHint"> + <constant name="PROPERTY_HINT_GLOBAL_FILE" value="15" enum="PropertyHint"> Hints that a string property is an absolute path to a file outside the project folder. Editing it will show a file dialog for picking the path. The hint string can be a set of filters with wildcards like [code]"*.png,*.jpg"[/code]. </constant> - <constant name="PROPERTY_HINT_GLOBAL_DIR" value="18" enum="PropertyHint"> + <constant name="PROPERTY_HINT_GLOBAL_DIR" value="16" enum="PropertyHint"> Hints that a string property is an absolute path to a directory outside the project folder. Editing it will show a file dialog for picking the path. </constant> - <constant name="PROPERTY_HINT_RESOURCE_TYPE" value="19" enum="PropertyHint"> + <constant name="PROPERTY_HINT_RESOURCE_TYPE" value="17" enum="PropertyHint"> Hints that a property is an instance of a [Resource]-derived type, optionally specified via the hint string (e.g. [code]"Texture2D"[/code]). Editing it will show a popup menu of valid resource types to instantiate. </constant> - <constant name="PROPERTY_HINT_MULTILINE_TEXT" value="20" enum="PropertyHint"> + <constant name="PROPERTY_HINT_MULTILINE_TEXT" value="18" enum="PropertyHint"> Hints that a string property is text with line breaks. Editing it will show a text input field where line breaks can be typed. </constant> - <constant name="PROPERTY_HINT_EXPRESSION" value="21" enum="PropertyHint"> + <constant name="PROPERTY_HINT_EXPRESSION" value="19" enum="PropertyHint"> Hints that a string property is an [Expression]. </constant> - <constant name="PROPERTY_HINT_PLACEHOLDER_TEXT" value="22" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PLACEHOLDER_TEXT" value="20" enum="PropertyHint"> Hints that a string property should have a placeholder text visible on its input field, whenever the property is empty. The hint string is the placeholder text to use. </constant> - <constant name="PROPERTY_HINT_COLOR_NO_ALPHA" value="23" enum="PropertyHint"> + <constant name="PROPERTY_HINT_COLOR_NO_ALPHA" value="21" enum="PropertyHint"> Hints that a color property should be edited without changing its alpha component, i.e. only R, G and B channels are edited. </constant> - <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSY" value="24" enum="PropertyHint"> + <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSY" value="22" enum="PropertyHint"> Hints that an image is compressed using lossy compression. </constant> - <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS" value="25" enum="PropertyHint"> + <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS" value="23" enum="PropertyHint"> Hints that an image is compressed using lossless compression. </constant> - <constant name="PROPERTY_HINT_OBJECT_ID" value="26" enum="PropertyHint"> + <constant name="PROPERTY_HINT_OBJECT_ID" value="24" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_TYPE_STRING" value="27" enum="PropertyHint"> + <constant name="PROPERTY_HINT_TYPE_STRING" value="25" enum="PropertyHint"> Hint that a property represents a particular type. If a property is [constant TYPE_STRING], allows to set a type from the create dialog. If you need to create an [Array] to contain elements of a specific type, the [code]hint_string[/code] must encode nested types using [code]":"[/code] and [code]"/"[/code] for specifying [Resource] types. For instance: [codeblock] hint_string = "%s:" % [TYPE_INT] # Array of inteters. @@ -2590,128 +2584,124 @@ [/codeblock] [b]Note:[/b] The final colon is required to specify for properly detecting built-in types. </constant> - <constant name="PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE" value="28" enum="PropertyHint"> + <constant name="PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE" value="26" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_METHOD_OF_VARIANT_TYPE" value="29" enum="PropertyHint"> + <constant name="PROPERTY_HINT_METHOD_OF_VARIANT_TYPE" value="27" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_METHOD_OF_BASE_TYPE" value="30" enum="PropertyHint"> + <constant name="PROPERTY_HINT_METHOD_OF_BASE_TYPE" value="28" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_METHOD_OF_INSTANCE" value="31" enum="PropertyHint"> + <constant name="PROPERTY_HINT_METHOD_OF_INSTANCE" value="29" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_METHOD_OF_SCRIPT" value="32" enum="PropertyHint"> + <constant name="PROPERTY_HINT_METHOD_OF_SCRIPT" value="30" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE" value="33" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE" value="31" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_PROPERTY_OF_BASE_TYPE" value="34" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PROPERTY_OF_BASE_TYPE" value="32" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_PROPERTY_OF_INSTANCE" value="35" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PROPERTY_OF_INSTANCE" value="33" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_PROPERTY_OF_SCRIPT" value="36" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PROPERTY_OF_SCRIPT" value="34" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_OBJECT_TOO_BIG" value="37" enum="PropertyHint"> + <constant name="PROPERTY_HINT_OBJECT_TOO_BIG" value="35" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_NODE_PATH_VALID_TYPES" value="38" enum="PropertyHint"> + <constant name="PROPERTY_HINT_NODE_PATH_VALID_TYPES" value="36" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_SAVE_FILE" value="39" enum="PropertyHint"> + <constant name="PROPERTY_HINT_SAVE_FILE" value="37" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_GLOBAL_SAVE_FILE" value="40" enum="PropertyHint"> + <constant name="PROPERTY_HINT_GLOBAL_SAVE_FILE" value="38" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_INT_IS_OBJECTID" value="41" enum="PropertyHint"> + <constant name="PROPERTY_HINT_INT_IS_OBJECTID" value="39" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_INT_IS_POINTER" value="43" enum="PropertyHint"> + <constant name="PROPERTY_HINT_INT_IS_POINTER" value="41" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_ARRAY_TYPE" value="42" enum="PropertyHint"> + <constant name="PROPERTY_HINT_ARRAY_TYPE" value="40" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_LOCALE_ID" value="44" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LOCALE_ID" value="42" enum="PropertyHint"> Hints that a string property is a locale code. Editing it will show a locale dialog for picking language and country. </constant> - <constant name="PROPERTY_HINT_LOCALIZABLE_STRING" value="45" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LOCALIZABLE_STRING" value="43" enum="PropertyHint"> Hints that a dictionary property is string translation map. Dictionary keys are locale codes and, values are translated strings. </constant> - <constant name="PROPERTY_HINT_NODE_TYPE" value="46" enum="PropertyHint"> + <constant name="PROPERTY_HINT_NODE_TYPE" value="44" enum="PropertyHint"> </constant> - <constant name="PROPERTY_HINT_MAX" value="47" enum="PropertyHint"> + <constant name="PROPERTY_HINT_MAX" value="45" enum="PropertyHint"> </constant> <constant name="PROPERTY_USAGE_NONE" value="0" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_STORAGE" value="1" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_STORAGE" value="2" enum="PropertyUsageFlags"> The property is serialized and saved in the scene file (default). </constant> - <constant name="PROPERTY_USAGE_EDITOR" value="2" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_EDITOR" value="4" enum="PropertyUsageFlags"> The property is shown in the editor inspector (default). </constant> - <constant name="PROPERTY_USAGE_NETWORK" value="4" enum="PropertyUsageFlags"> - Deprecated usage flag, unused. - </constant> - <constant name="PROPERTY_USAGE_EDITOR_HELPER" value="8" enum="PropertyUsageFlags"> - Deprecated usage flag, unused. - </constant> - <constant name="PROPERTY_USAGE_CHECKABLE" value="16" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_CHECKABLE" value="8" enum="PropertyUsageFlags"> The property can be checked in the editor inspector. </constant> - <constant name="PROPERTY_USAGE_CHECKED" value="32" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_CHECKED" value="16" enum="PropertyUsageFlags"> The property is checked in the editor inspector. </constant> - <constant name="PROPERTY_USAGE_INTERNATIONALIZED" value="64" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_INTERNATIONALIZED" value="32" enum="PropertyUsageFlags"> The property is a translatable string. </constant> - <constant name="PROPERTY_USAGE_GROUP" value="128" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_GROUP" value="64" enum="PropertyUsageFlags"> Used to group properties together in the editor. See [EditorInspector]. </constant> - <constant name="PROPERTY_USAGE_CATEGORY" value="256" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_CATEGORY" value="128" enum="PropertyUsageFlags"> Used to categorize properties together in the editor. </constant> - <constant name="PROPERTY_USAGE_SUBGROUP" value="512" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_SUBGROUP" value="256" enum="PropertyUsageFlags"> Used to group properties together in the editor in a subgroup (under a group). See [EditorInspector]. </constant> - <constant name="PROPERTY_USAGE_NO_INSTANCE_STATE" value="2048" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_CLASS_IS_BITFIELD" value="512" enum="PropertyUsageFlags"> + </constant> + <constant name="PROPERTY_USAGE_NO_INSTANCE_STATE" value="1024" enum="PropertyUsageFlags"> The property does not save its state in [PackedScene]. </constant> - <constant name="PROPERTY_USAGE_RESTART_IF_CHANGED" value="4096" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_RESTART_IF_CHANGED" value="2048" enum="PropertyUsageFlags"> Editing the property prompts the user for restarting the editor. </constant> - <constant name="PROPERTY_USAGE_SCRIPT_VARIABLE" value="8192" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_SCRIPT_VARIABLE" value="4096" enum="PropertyUsageFlags"> The property is a script variable which should be serialized and saved in the scene file. </constant> - <constant name="PROPERTY_USAGE_STORE_IF_NULL" value="16384" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_STORE_IF_NULL" value="8192" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_ANIMATE_AS_TRIGGER" value="32768" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_ANIMATE_AS_TRIGGER" value="16384" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED" value="65536" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED" value="32768" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE" value="131072" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE" value="65536" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_CLASS_IS_ENUM" value="262144" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_CLASS_IS_ENUM" value="131072" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_NIL_IS_VARIANT" value="524288" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_NIL_IS_VARIANT" value="262144" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_INTERNAL" value="1048576" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_INTERNAL" value="524288" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE" value="2097152" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE" value="1048576" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_HIGH_END_GFX" value="4194304" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_HIGH_END_GFX" value="2097152" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT" value="8388608" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT" value="4194304" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT" value="16777216" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT" value="8388608" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_KEYING_INCREMENTS" value="33554432" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_KEYING_INCREMENTS" value="16777216" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_DEFERRED_SET_RESOURCE" value="67108864" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_DEFERRED_SET_RESOURCE" value="33554432" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT" value="134217728" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT" value="67108864" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_EDITOR_BASIC_SETTING" value="268435456" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_EDITOR_BASIC_SETTING" value="134217728" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_ARRAY" value="1073741824" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_ARRAY" value="536870912" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_DEFAULT" value="7" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_DEFAULT" value="6" enum="PropertyUsageFlags"> Default usage (storage, editor and network). </constant> - <constant name="PROPERTY_USAGE_DEFAULT_INTL" value="71" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_DEFAULT_INTL" value="38" enum="PropertyUsageFlags"> Default usage for translatable strings (storage, editor, network and internationalized). </constant> - <constant name="PROPERTY_USAGE_NO_EDITOR" value="5" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_NO_EDITOR" value="2" enum="PropertyUsageFlags"> Default usage but without showing the property in the editor (storage, network). </constant> <constant name="METHOD_FLAG_NORMAL" value="1" enum="MethodFlags"> @@ -2720,26 +2710,17 @@ <constant name="METHOD_FLAG_EDITOR" value="2" enum="MethodFlags"> Flag for an editor method. </constant> - <constant name="METHOD_FLAG_NOSCRIPT" value="4" enum="MethodFlags"> - Deprecated method flag, unused. - </constant> - <constant name="METHOD_FLAG_CONST" value="8" enum="MethodFlags"> + <constant name="METHOD_FLAG_CONST" value="4" enum="MethodFlags"> Flag for a constant method. </constant> - <constant name="METHOD_FLAG_REVERSE" value="16" enum="MethodFlags"> - Deprecated method flag, unused. - </constant> - <constant name="METHOD_FLAG_VIRTUAL" value="32" enum="MethodFlags"> + <constant name="METHOD_FLAG_VIRTUAL" value="8" enum="MethodFlags"> Flag for a virtual method. </constant> - <constant name="METHOD_FLAG_FROM_SCRIPT" value="64" enum="MethodFlags"> - Deprecated method flag, unused. - </constant> - <constant name="METHOD_FLAG_VARARG" value="128" enum="MethodFlags"> + <constant name="METHOD_FLAG_VARARG" value="16" enum="MethodFlags"> </constant> - <constant name="METHOD_FLAG_STATIC" value="256" enum="MethodFlags"> + <constant name="METHOD_FLAG_STATIC" value="32" enum="MethodFlags"> </constant> - <constant name="METHOD_FLAG_OBJECT_CORE" value="512" enum="MethodFlags"> + <constant name="METHOD_FLAG_OBJECT_CORE" value="64" enum="MethodFlags"> Used internally. Allows to not dump core virtuals such as [code]_notification[/code] to the JSON API. </constant> <constant name="METHOD_FLAGS_DEFAULT" value="1" enum="MethodFlags"> diff --git a/doc/classes/AcceptDialog.xml b/doc/classes/AcceptDialog.xml index c1e28ffba3..0009c82548 100644 --- a/doc/classes/AcceptDialog.xml +++ b/doc/classes/AcceptDialog.xml @@ -62,6 +62,7 @@ Sets autowrapping for the text in the dialog. </member> <member name="dialog_close_on_escape" type="bool" setter="set_close_on_escape" getter="get_close_on_escape" default="true"> + If [code]true[/code], the dialog will be hidden when the escape key ([constant @GlobalScope.KEY_ESCAPE]) is pressed. </member> <member name="dialog_hide_on_ok" type="bool" setter="set_hide_on_ok" getter="get_hide_on_ok" default="true"> If [code]true[/code], the dialog is hidden when the OK button is pressed. You can set it to [code]false[/code] if you want to do e.g. input validation when receiving the [signal confirmed] signal, and handle hiding the dialog in your own logic. @@ -71,6 +72,9 @@ The text displayed by the dialog. </member> <member name="exclusive" type="bool" setter="set_exclusive" getter="is_exclusive" overrides="Window" default="true" /> + <member name="ok_button_text" type="String" setter="set_ok_button_text" getter="get_ok_button_text" default=""OK""> + The text displayed by the OK button (see [method get_ok_button]). + </member> <member name="title" type="String" setter="set_title" getter="get_title" overrides="Window" default=""Alert!"" /> <member name="transient" type="bool" setter="set_transient" getter="is_transient" overrides="Window" default="true" /> <member name="visible" type="bool" setter="set_visible" getter="is_visible" overrides="Window" default="false" /> diff --git a/doc/classes/AnimationNode.xml b/doc/classes/AnimationNode.xml index 9026aa6a34..189e30b5f2 100644 --- a/doc/classes/AnimationNode.xml +++ b/doc/classes/AnimationNode.xml @@ -88,7 +88,7 @@ <argument index="3" name="seek_root" type="bool" /> <argument index="4" name="blend" type="float" /> <argument index="5" name="filter" type="int" enum="AnimationNode.FilterAction" default="0" /> - <argument index="6" name="optimize" type="bool" default="true" /> + <argument index="6" name="sync" type="bool" default="true" /> <description> Blend an input. This is only useful for nodes created for an [AnimationNodeBlendTree]. The [code]time[/code] parameter is a relative delta, unless [code]seek[/code] is [code]true[/code], in which case it is absolute. A filter mode may be optionally passed (see [enum FilterAction] for options). </description> @@ -102,7 +102,7 @@ <argument index="4" name="seek_root" type="bool" /> <argument index="5" name="blend" type="float" /> <argument index="6" name="filter" type="int" enum="AnimationNode.FilterAction" default="0" /> - <argument index="7" name="optimize" type="bool" default="true" /> + <argument index="7" name="sync" type="bool" default="true" /> <description> Blend another animation node (in case this node contains children animation nodes). This function is only useful if you inherit from [AnimationRootNode] instead, else editors will not display your node for addition. </description> diff --git a/doc/classes/AnimationNodeAdd2.xml b/doc/classes/AnimationNodeAdd2.xml index ca117e3ecd..e6ac1dd963 100644 --- a/doc/classes/AnimationNodeAdd2.xml +++ b/doc/classes/AnimationNodeAdd2.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeAdd2" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeAdd2" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Blends two animations additively inside of an [AnimationNodeBlendTree]. </brief_description> @@ -9,9 +9,4 @@ <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> </tutorials> - <members> - <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> - If [code]true[/code], sets the [code]optimization[/code] to [code]false[/code] when calling [method AnimationNode.blend_input], forcing the blended animations to update every frame. - </member> - </members> </class> diff --git a/doc/classes/AnimationNodeAdd3.xml b/doc/classes/AnimationNodeAdd3.xml index 91e030a6ae..f290032e11 100644 --- a/doc/classes/AnimationNodeAdd3.xml +++ b/doc/classes/AnimationNodeAdd3.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeAdd3" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeAdd3" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Blends two of three animations additively inside of an [AnimationNodeBlendTree]. </brief_description> @@ -14,9 +14,4 @@ <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> <link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link> </tutorials> - <members> - <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> - If [code]true[/code], sets the [code]optimization[/code] to [code]false[/code] when calling [method AnimationNode.blend_input], forcing the blended animations to update every frame. - </member> - </members> </class> diff --git a/doc/classes/AnimationNodeBlend2.xml b/doc/classes/AnimationNodeBlend2.xml index f17163e155..5001e3ba24 100644 --- a/doc/classes/AnimationNodeBlend2.xml +++ b/doc/classes/AnimationNodeBlend2.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeBlend2" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeBlend2" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Blends two animations linearly inside of an [AnimationNodeBlendTree]. </brief_description> @@ -11,9 +11,4 @@ <link title="3D Platformer Demo">https://godotengine.org/asset-library/asset/125</link> <link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link> </tutorials> - <members> - <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> - If [code]true[/code], sets the [code]optimization[/code] to [code]false[/code] when calling [method AnimationNode.blend_input], forcing the blended animations to update every frame. - </member> - </members> </class> diff --git a/doc/classes/AnimationNodeBlend3.xml b/doc/classes/AnimationNodeBlend3.xml index 6bc7a20823..93947c2462 100644 --- a/doc/classes/AnimationNodeBlend3.xml +++ b/doc/classes/AnimationNodeBlend3.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeBlend3" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeBlend3" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Blends two of three animations linearly inside of an [AnimationNodeBlendTree]. </brief_description> @@ -13,9 +13,4 @@ <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> </tutorials> - <members> - <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> - If [code]true[/code], sets the [code]optimization[/code] to [code]false[/code] when calling [method AnimationNode.blend_input], forcing the blended animations to update every frame. - </member> - </members> </class> diff --git a/doc/classes/AnimationNodeBlendSpace1D.xml b/doc/classes/AnimationNodeBlendSpace1D.xml index 6ded3a7ff9..7bb136308d 100644 --- a/doc/classes/AnimationNodeBlendSpace1D.xml +++ b/doc/classes/AnimationNodeBlendSpace1D.xml @@ -76,6 +76,10 @@ <member name="snap" type="float" setter="set_snap" getter="get_snap" default="0.1"> Position increment to snap to when moving a point on the axis. </member> + <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> + If [code]false[/code], the blended animations' frame are stopped when the blend value is [code]0[/code]. + If [code]true[/code], forcing the blended animations to advance frame. + </member> <member name="value_label" type="String" setter="set_value_label" getter="get_value_label" default=""value""> Label of the virtual axis of the blend space. </member> diff --git a/doc/classes/AnimationNodeBlendSpace2D.xml b/doc/classes/AnimationNodeBlendSpace2D.xml index 9e0e408ac5..eb2249d2d2 100644 --- a/doc/classes/AnimationNodeBlendSpace2D.xml +++ b/doc/classes/AnimationNodeBlendSpace2D.xml @@ -113,6 +113,10 @@ <member name="snap" type="Vector2" setter="set_snap" getter="get_snap" default="Vector2(0.1, 0.1)"> Position increment to snap to when moving a point. </member> + <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> + If [code]false[/code], the blended animations' frame are stopped when the blend value is [code]0[/code]. + If [code]true[/code], forcing the blended animations to advance frame. + </member> <member name="x_label" type="String" setter="set_x_label" getter="get_x_label" default=""x""> Name of the blend space's X axis. </member> diff --git a/doc/classes/AnimationNodeOneShot.xml b/doc/classes/AnimationNodeOneShot.xml index de2414cd43..14abc34992 100644 --- a/doc/classes/AnimationNodeOneShot.xml +++ b/doc/classes/AnimationNodeOneShot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeOneShot" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeOneShot" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Plays an animation once in [AnimationNodeBlendTree]. </brief_description> @@ -26,8 +26,6 @@ </member> <member name="mix_mode" type="int" setter="set_mix_mode" getter="get_mix_mode" enum="AnimationNodeOneShot.MixMode" default="0"> </member> - <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> - </member> </members> <constants> <constant name="MIX_MODE_BLEND" value="0" enum="MixMode"> diff --git a/doc/classes/AnimationNodeSync.xml b/doc/classes/AnimationNodeSync.xml new file mode 100644 index 0000000000..21cac11d50 --- /dev/null +++ b/doc/classes/AnimationNodeSync.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="AnimationNodeSync" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <members> + <member name="sync" type="bool" setter="set_use_sync" getter="is_using_sync" default="false"> + If [code]false[/code], the blended animations' frame are stopped when the blend value is [code]0[/code]. + If [code]true[/code], forcing the blended animations to advance frame. + </member> + </members> +</class> diff --git a/doc/classes/AnimationNodeTransition.xml b/doc/classes/AnimationNodeTransition.xml index 70c874d251..7e757d4640 100644 --- a/doc/classes/AnimationNodeTransition.xml +++ b/doc/classes/AnimationNodeTransition.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="AnimationNodeTransition" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="AnimationNodeTransition" inherits="AnimationNodeSync" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A generic animation transition node for [AnimationTree]. </brief_description> @@ -40,6 +40,9 @@ </method> </methods> <members> + <member name="from_start" type="bool" setter="set_from_start" getter="is_from_start" default="true"> + If [code]true[/code], the destination animation is played back from the beginning when switched. + </member> <member name="input_count" type="int" setter="set_enabled_inputs" getter="get_enabled_inputs" default="0"> The number of available input ports for this node. </member> diff --git a/doc/classes/Camera3D.xml b/doc/classes/Camera3D.xml index 56e5ce1522..468fddcfc1 100644 --- a/doc/classes/Camera3D.xml +++ b/doc/classes/Camera3D.xml @@ -155,6 +155,7 @@ </member> <member name="current" type="bool" setter="set_current" getter="is_current" default="false"> If [code]true[/code], the ancestor [Viewport] is currently using this camera. + If multiple cameras are in the scene, one will always be made current. For example, if two [Camera3D] nodes are present in the scene and only one is current, setting one camera's [member current] to [code]false[/code] will cause the other camera to be made current. </member> <member name="doppler_tracking" type="int" setter="set_doppler_tracking" getter="get_doppler_tracking" enum="Camera3D.DopplerTracking" default="0"> If not [constant DOPPLER_TRACKING_DISABLED], this camera will simulate the [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/url] for objects changed in particular [code]_process[/code] methods. See [enum DopplerTracking] for possible values. diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index acf08414d0..2d68ae6902 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -169,9 +169,10 @@ <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="max_lines" type="int" default="-1" /> <argument index="7" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="8" name="flags" type="int" default="99" /> - <argument index="9" name="direction" type="int" enum="TextServer.Direction" default="0" /> - <argument index="10" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> + <argument index="8" name="brk_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> + <argument index="9" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> + <argument index="10" name="direction" type="int" enum="TextServer.Direction" default="0" /> + <argument index="11" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> Breaks [code]text[/code] to the lines and draws it using the specified [code]font[/code] at the [code]position[/code] (top-left corner). The text will have its color multiplied by [code]modulate[/code]. If [code]clip_w[/code] is greater than or equal to 0, the text will be clipped if it exceeds the specified width. </description> @@ -187,9 +188,10 @@ <argument index="6" name="max_lines" type="int" default="-1" /> <argument index="7" name="size" type="int" default="1" /> <argument index="8" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="9" name="flags" type="int" default="99" /> - <argument index="10" name="direction" type="int" enum="TextServer.Direction" default="0" /> - <argument index="11" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> + <argument index="9" name="brk_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> + <argument index="10" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> + <argument index="11" name="direction" type="int" enum="TextServer.Direction" default="0" /> + <argument index="12" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> Breaks [code]text[/code] to the lines and draws text outline using the specified [code]font[/code] at the [code]position[/code] (top-left corner). The text will have its color multiplied by [code]modulate[/code]. If [code]clip_w[/code] is greater than or equal to 0, the text will be clipped if it exceeds the specified width. </description> @@ -279,7 +281,7 @@ <argument index="4" name="width" type="float" default="-1" /> <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="7" name="flags" type="int" default="3" /> + <argument index="7" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <argument index="8" name="direction" type="int" enum="TextServer.Direction" default="0" /> <argument index="9" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> @@ -316,7 +318,7 @@ <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="size" type="int" default="1" /> <argument index="7" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="8" name="flags" type="int" default="3" /> + <argument index="8" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <argument index="9" name="direction" type="int" enum="TextServer.Direction" default="0" /> <argument index="10" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> diff --git a/doc/classes/ConfirmationDialog.xml b/doc/classes/ConfirmationDialog.xml index 2316e32b5d..d4c503857d 100644 --- a/doc/classes/ConfirmationDialog.xml +++ b/doc/classes/ConfirmationDialog.xml @@ -27,6 +27,9 @@ </method> </methods> <members> + <member name="cancel_button_text" type="String" setter="set_cancel_button_text" getter="get_cancel_button_text" default=""Cancel""> + The text displayed by the cancel button (see [method get_cancel_button]). + </member> <member name="min_size" type="Vector2i" setter="set_min_size" getter="get_min_size" overrides="Window" default="Vector2i(200, 70)" /> <member name="size" type="Vector2i" setter="set_size" getter="get_size" overrides="Window" default="Vector2i(200, 100)" /> <member name="title" type="String" setter="set_title" getter="get_title" overrides="Window" default=""Please Confirm..."" /> diff --git a/doc/classes/EditorFileDialog.xml b/doc/classes/EditorFileDialog.xml index b1fd7b4e76..6fd5abe369 100644 --- a/doc/classes/EditorFileDialog.xml +++ b/doc/classes/EditorFileDialog.xml @@ -11,9 +11,11 @@ <method name="add_filter"> <return type="void" /> <argument index="0" name="filter" type="String" /> + <argument index="1" name="description" type="String" default="""" /> <description> - Adds a comma-delimited file extension filter option to the [EditorFileDialog] with an optional semi-colon-delimited label. - For example, [code]"*.tscn, *.scn; Scenes"[/code] results in filter text "Scenes (*.tscn, *.scn)". + Adds a comma-delimited file name [code]filter[/code] option to the [EditorFileDialog] with an optional [code]description[/code], which restricts what files can be picked. + A [code]filter[/code] should be of the form [code]"filename.extension"[/code], where filename and extension can be [code]*[/code] to match any string. Filters starting with [code].[/code] (i.e. empty filenames) are not allowed. + For example, a [code]filter[/code] of [code]"*.tscn, *.scn"[/code] and a [code]description[/code] of [code]"Scenes"[/code] results in filter text "Scenes (*.tscn, *.scn)". </description> </method> <method name="clear_filters"> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index 1514b82ff8..2930c2ec22 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -296,6 +296,28 @@ <return type="bool" /> <description> Returns [code]true[/code] if this is a main screen editor plugin (it goes in the workspace selector together with [b]2D[/b], [b]3D[/b], [b]Script[/b] and [b]AssetLib[/b]). + When the plugin's workspace is selected, other main screen plugins will be hidden, but your plugin will not appear automatically. It needs to be added as a child of [method EditorInterface.get_base_control] and made visible inside [method _make_visible]. + Use [method _get_plugin_name] and [method _get_plugin_icon] to customize the plugin button's appearance. + [codeblock] + var plugin_control + + func _enter_tree(): + plugin_control = preload("my_plugin_control.tscn").instantiate() + get_editor_interface().get_editor_main_control().add_child(plugin_control) + plugin_control.hide() + + func _has_main_screen(): + return true + + func _make_visible(visible): + plugin_control.visible = visible + + func _get_plugin_name(): + return "My Super Cool Plugin 3000" + + func _get_plugin_icon(): + return get_editor_interface().get_base_control().get_theme_icon("Node", "EditorIcons") + [/codeblock] </description> </method> <method name="_make_visible" qualifiers="virtual"> diff --git a/doc/classes/EditorScenePostImportPlugin.xml b/doc/classes/EditorScenePostImportPlugin.xml index 93fd5e46ba..44d644411d 100644 --- a/doc/classes/EditorScenePostImportPlugin.xml +++ b/doc/classes/EditorScenePostImportPlugin.xml @@ -88,7 +88,7 @@ <argument index="2" name="default_value" type="Variant" /> <argument index="3" name="hint" type="int" enum="PropertyHint" default="0" /> <argument index="4" name="hint_string" type="String" default="""" /> - <argument index="5" name="usage_flags" type="int" default="7" /> + <argument index="5" name="usage_flags" type="int" default="6" /> <description> Add a specific import option. This function can only be called from [method _get_import_options] and [method _get_internal_import_options]. </description> diff --git a/doc/classes/FileDialog.xml b/doc/classes/FileDialog.xml index 903f36d0ce..f45031cea8 100644 --- a/doc/classes/FileDialog.xml +++ b/doc/classes/FileDialog.xml @@ -12,10 +12,11 @@ <method name="add_filter"> <return type="void" /> <argument index="0" name="filter" type="String" /> + <argument index="1" name="description" type="String" default="""" /> <description> - Adds [code]filter[/code] to the list of filters, which restricts what files can be picked. - A [code]filter[/code] should be of the form [code]"filename.extension ; Description"[/code], where filename and extension can be [code]*[/code] to match any string. Filters starting with [code].[/code] (i.e. empty filenames) are not allowed. - Example filters: [code]"*.png ; PNG Images"[/code], [code]"project.godot ; Godot Project"[/code]. + Adds a comma-delimited file name [code]filter[/code] option to the [FileDialog] with an optional [code]description[/code], which restricts what files can be picked. + A [code]filter[/code] should be of the form [code]"filename.extension"[/code], where filename and extension can be [code]*[/code] to match any string. Filters starting with [code].[/code] (i.e. empty filenames) are not allowed. + For example, a [code]filter[/code] of [code]"*.png, *.jpg"[/code] and a [code]description[/code] of [code]"Images"[/code] results in filter text "Images (*.png, *.jpg)". </description> </method> <method name="clear_filters"> diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml index b19386b398..e95f444d55 100644 --- a/doc/classes/Font.xml +++ b/doc/classes/Font.xml @@ -44,9 +44,10 @@ <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="max_lines" type="int" default="-1" /> <argument index="7" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="8" name="flags" type="int" default="99" /> - <argument index="9" name="direction" type="int" enum="TextServer.Direction" default="0" /> - <argument index="10" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> + <argument index="8" name="brk_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> + <argument index="9" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> + <argument index="10" name="direction" type="int" enum="TextServer.Direction" default="0" /> + <argument index="11" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> Breaks [code]text[/code] to the lines using rules specified by [code]flags[/code] and draws it into a canvas item using the font, at a given position, with [code]modulate[/code] color, optionally clipping the width and aligning horizontally. [code]position[/code] specifies the baseline of the first line, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis. See also [method CanvasItem.draw_multiline_string]. @@ -63,9 +64,10 @@ <argument index="6" name="max_lines" type="int" default="-1" /> <argument index="7" name="size" type="int" default="1" /> <argument index="8" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="9" name="flags" type="int" default="99" /> - <argument index="10" name="direction" type="int" enum="TextServer.Direction" default="0" /> - <argument index="11" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> + <argument index="9" name="brk_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> + <argument index="10" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> + <argument index="11" name="direction" type="int" enum="TextServer.Direction" default="0" /> + <argument index="12" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> Breaks [code]text[/code] to the lines using rules specified by [code]flags[/code] and draws text outline into a canvas item using the font, at a given position, with [code]modulate[/code] color and [code]size[/code] outline size, optionally clipping the width and aligning horizontally. [code]position[/code] specifies the baseline of the first line, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis. See also [method CanvasItem.draw_multiline_string_outline]. @@ -80,7 +82,7 @@ <argument index="4" name="width" type="float" default="-1" /> <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="7" name="flags" type="int" default="3" /> + <argument index="7" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <argument index="8" name="direction" type="int" enum="TextServer.Direction" default="0" /> <argument index="9" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> @@ -98,7 +100,7 @@ <argument index="5" name="font_size" type="int" default="16" /> <argument index="6" name="size" type="int" default="1" /> <argument index="7" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> - <argument index="8" name="flags" type="int" default="3" /> + <argument index="8" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <argument index="9" name="direction" type="int" enum="TextServer.Direction" default="0" /> <argument index="10" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> @@ -160,7 +162,7 @@ </description> </method> <method name="get_font_style" qualifiers="const"> - <return type="int" /> + <return type="int" enum="TextServer.FontStyle" /> <description> Returns font style flags, see [enum TextServer.FontStyle]. </description> @@ -186,9 +188,10 @@ <argument index="2" name="width" type="float" default="-1" /> <argument index="3" name="font_size" type="int" default="16" /> <argument index="4" name="max_lines" type="int" default="-1" /> - <argument index="5" name="flags" type="int" default="96" /> - <argument index="6" name="direction" type="int" enum="TextServer.Direction" default="0" /> - <argument index="7" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> + <argument index="5" name="brk_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> + <argument index="6" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> + <argument index="7" name="direction" type="int" enum="TextServer.Direction" default="0" /> + <argument index="8" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> Returns the size of a bounding box of a string broken into the lines, taking kerning and advance into account. See also [method draw_multiline_string]. @@ -219,7 +222,7 @@ <argument index="1" name="alignment" type="int" enum="HorizontalAlignment" default="0" /> <argument index="2" name="width" type="float" default="-1" /> <argument index="3" name="font_size" type="int" default="16" /> - <argument index="4" name="flags" type="int" default="3" /> + <argument index="4" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <argument index="5" name="direction" type="int" enum="TextServer.Direction" default="0" /> <argument index="6" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> diff --git a/doc/classes/FontFile.xml b/doc/classes/FontFile.xml index 98abc87b84..aaf871d55a 100644 --- a/doc/classes/FontFile.xml +++ b/doc/classes/FontFile.xml @@ -558,7 +558,7 @@ <member name="font_name" type="String" setter="set_font_name" getter="get_font_name" default=""""> Font family name. </member> - <member name="font_style" type="int" setter="set_font_style" getter="get_font_style" default="0"> + <member name="font_style" type="int" setter="set_font_style" getter="get_font_style" enum="TextServer.FontStyle" default="0"> Font style flags, see [enum TextServer.FontStyle]. </member> <member name="force_autohinter" type="bool" setter="set_force_autohinter" getter="is_force_autohinter" default="false"> diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml index f138b9087b..3d2e9449e2 100644 --- a/doc/classes/HTTPRequest.xml +++ b/doc/classes/HTTPRequest.xml @@ -251,6 +251,7 @@ Maximum number of allowed redirects. </member> <member name="timeout" type="float" setter="set_timeout" getter="get_timeout" default="0.0"> + If set to a value greater than [code]0.0[/code] before the request starts, the HTTP request will time out after [code]timeout[/code] seconds have passed and the request is not [i]completed[/i] yet. For small HTTP requests such as REST API usage, set [member timeout] to a value between [code]10.0[/code] and [code]30.0[/code] to prevent the application from getting stuck if the request fails to get a response in a timely manner. For file downloads, leave this to [code]0.0[/code] to prevent the download from failing if it takes too much time. </member> <member name="use_threads" type="bool" setter="set_use_threads" getter="is_using_threads" default="false"> If [code]true[/code], multithreading is used to improve performance. diff --git a/doc/classes/Plane.xml b/doc/classes/Plane.xml index a42ceba777..6fefcef0a1 100644 --- a/doc/classes/Plane.xml +++ b/doc/classes/Plane.xml @@ -77,7 +77,7 @@ <return type="float" /> <argument index="0" name="point" type="Vector3" /> <description> - Returns the shortest distance from the plane to the position [code]point[/code]. + Returns the shortest distance from the plane to the position [code]point[/code]. If the point is above the plane, the distance will be positive. If below, the distance will be negative. </description> </method> <method name="has_point" qualifiers="const"> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 7c378f33fe..898d34b385 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -203,6 +203,9 @@ Path to an image used as the boot splash. If left empty, the default Godot Engine splash will be displayed instead. [b]Note:[/b] Only effective if [member application/boot_splash/show_image] is [code]true[/code]. </member> + <member name="application/boot_splash/minimum_display_time" type="int" setter="" getter="" default="0"> + Minimum boot splash display time (in milliseconds). It is not recommended to set too high values for this setting. + </member> <member name="application/boot_splash/show_image" type="bool" setter="" getter="" default="true"> If [code]true[/code], displays the image specified in [member application/boot_splash/image] when the engine starts. If [code]false[/code], only displays the plain color specified in [member application/boot_splash/bg_color]. </member> @@ -1895,41 +1898,41 @@ <member name="rendering/shadows/directional_shadow/size.mobile" type="int" setter="" getter="" default="2048"> Lower-end override for [member rendering/shadows/directional_shadow/size] on mobile devices, due to performance concerns or driver support. </member> - <member name="rendering/shadows/directional_shadow/soft_shadow_quality" type="int" setter="" getter="" default="2"> + <member name="rendering/shadows/directional_shadow/soft_shadow_filter_quality" type="int" setter="" getter="" default="2"> Quality setting for shadows cast by [DirectionalLight3D]s. Higher quality settings use more samples when reading from shadow maps and are thus slower. Low quality settings may result in shadows looking grainy. [b]Note:[/b] The Soft Very Low setting will automatically multiply [i]constant[/i] shadow blur by 0.75x to reduce the amount of noise visible. This automatic blur change only affects the constant blur factor defined in [member Light3D.shadow_blur], not the variable blur performed by [DirectionalLight3D]s' [member Light3D.light_angular_distance]. [b]Note:[/b] The Soft High and Soft Ultra settings will automatically multiply [i]constant[/i] shadow blur by 1.5× and 2× respectively to make better use of the increased sample count. This increased blur also improves stability of dynamic object shadows. </member> - <member name="rendering/shadows/directional_shadow/soft_shadow_quality.mobile" type="int" setter="" getter="" default="0"> - Lower-end override for [member rendering/shadows/directional_shadow/soft_shadow_quality] on mobile devices, due to performance concerns or driver support. + <member name="rendering/shadows/directional_shadow/soft_shadow_filter_quality.mobile" type="int" setter="" getter="" default="0"> + Lower-end override for [member rendering/shadows/directional_shadow/soft_shadow_filter_quality] on mobile devices, due to performance concerns or driver support. </member> - <member name="rendering/shadows/shadow_atlas/16_bits" type="bool" setter="" getter="" default="true"> + <member name="rendering/shadows/positional_shadow/atlas_16_bits" type="bool" setter="" getter="" default="true"> </member> - <member name="rendering/shadows/shadow_atlas/quadrant_0_subdiv" type="int" setter="" getter="" default="2"> + <member name="rendering/shadows/positional_shadow/atlas_quadrant_0_subdiv" type="int" setter="" getter="" default="2"> Subdivision quadrant size for shadow mapping. See shadow mapping documentation. </member> - <member name="rendering/shadows/shadow_atlas/quadrant_1_subdiv" type="int" setter="" getter="" default="2"> + <member name="rendering/shadows/positional_shadow/atlas_quadrant_1_subdiv" type="int" setter="" getter="" default="2"> Subdivision quadrant size for shadow mapping. See shadow mapping documentation. </member> - <member name="rendering/shadows/shadow_atlas/quadrant_2_subdiv" type="int" setter="" getter="" default="3"> + <member name="rendering/shadows/positional_shadow/atlas_quadrant_2_subdiv" type="int" setter="" getter="" default="3"> Subdivision quadrant size for shadow mapping. See shadow mapping documentation. </member> - <member name="rendering/shadows/shadow_atlas/quadrant_3_subdiv" type="int" setter="" getter="" default="4"> + <member name="rendering/shadows/positional_shadow/atlas_quadrant_3_subdiv" type="int" setter="" getter="" default="4"> Subdivision quadrant size for shadow mapping. See shadow mapping documentation. </member> - <member name="rendering/shadows/shadow_atlas/size" type="int" setter="" getter="" default="4096"> + <member name="rendering/shadows/positional_shadow/atlas_size" type="int" setter="" getter="" default="4096"> Size for shadow atlas (used for OmniLights and SpotLights). See documentation. </member> - <member name="rendering/shadows/shadow_atlas/size.mobile" type="int" setter="" getter="" default="2048"> - Lower-end override for [member rendering/shadows/shadow_atlas/size] on mobile devices, due to performance concerns or driver support. + <member name="rendering/shadows/positional_shadow/atlas_size.mobile" type="int" setter="" getter="" default="2048"> + Lower-end override for [member rendering/shadows/positional_shadow/atlas_size] on mobile devices, due to performance concerns or driver support. </member> - <member name="rendering/shadows/shadows/soft_shadow_quality" type="int" setter="" getter="" default="2"> + <member name="rendering/shadows/positional_shadow/soft_shadow_filter_quality" type="int" setter="" getter="" default="2"> Quality setting for shadows cast by [OmniLight3D]s and [SpotLight3D]s. Higher quality settings use more samples when reading from shadow maps and are thus slower. Low quality settings may result in shadows looking grainy. [b]Note:[/b] The Soft Very Low setting will automatically multiply [i]constant[/i] shadow blur by 0.75x to reduce the amount of noise visible. This automatic blur change only affects the constant blur factor defined in [member Light3D.shadow_blur], not the variable blur performed by [DirectionalLight3D]s' [member Light3D.light_angular_distance]. [b]Note:[/b] The Soft High and Soft Ultra settings will automatically multiply shadow blur by 1.5× and 2× respectively to make better use of the increased sample count. This increased blur also improves stability of dynamic object shadows. </member> - <member name="rendering/shadows/shadows/soft_shadow_quality.mobile" type="int" setter="" getter="" default="0"> - Lower-end override for [member rendering/shadows/shadows/soft_shadow_quality] on mobile devices, due to performance concerns or driver support. + <member name="rendering/shadows/positional_shadow/soft_shadow_filter_quality.mobile" type="int" setter="" getter="" default="0"> + Lower-end override for [member rendering/shadows/positional_shadow/soft_shadow_filter_quality] on mobile devices, due to performance concerns or driver support. </member> <member name="rendering/textures/decals/filter" type="int" setter="" getter="" default="3"> </member> @@ -1965,6 +1968,12 @@ 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. [b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were already imported before. To make this setting apply to textures that were already imported, exit the editor, remove the [code].godot/imported/[/code] folder located inside the project folder then restart the editor (see [member application/config/use_hidden_project_data_directory]). </member> + <member name="rendering/vrs/mode" type="int" setter="" getter="" default="0"> + Set the default Variable Rate Shading (VRS) mode for the main viewport. See [member Viewport.vrs_mode] to change this at runtime, and [enum Viewport.VRSMode] for possible values. + </member> + <member name="rendering/vrs/texture" type="String" setter="" getter="" default=""""> + If [member rendering/vrs/mode] is set to texture, this is the path to default texture loaded as the VRS image. + </member> <member name="rendering/vulkan/descriptor_pools/max_descriptors_per_pool" type="int" setter="" getter="" default="64"> </member> <member name="rendering/vulkan/rendering/back_end" type="int" setter="" getter="" default="0"> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 0d121a29d2..6248394b1a 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -395,7 +395,7 @@ <description> </description> </method> - <method name="limit_get"> + <method name="limit_get" qualifiers="const"> <return type="int" /> <argument index="0" name="limit" type="int" enum="RenderingDevice.Limit" /> <description> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index d92121a950..6199c7b4e6 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -890,7 +890,7 @@ <description> </description> </method> - <method name="directional_shadow_quality_set"> + <method name="directional_soft_shadow_filter_set_quality"> <return type="void" /> <argument index="0" name="quality" type="int" enum="RenderingServer.ShadowQuality" /> <description> @@ -2519,6 +2519,12 @@ If [code]true[/code], particles use local coordinates. If [code]false[/code] they use global coordinates. Equivalent to [member GPUParticles3D.local_coords]. </description> </method> + <method name="positional_soft_shadow_filter_set_quality"> + <return type="void" /> + <argument index="0" name="quality" type="int" enum="RenderingServer.ShadowQuality" /> + <description> + </description> + </method> <method name="reflection_probe_create"> <return type="RID" /> <description> @@ -2753,12 +2759,6 @@ [b]Note:[/b] If the sampler array is used use [code]index[/code] to access the specified texture. </description> </method> - <method name="shadows_quality_set"> - <return type="void" /> - <argument index="0" name="quality" type="int" enum="RenderingServer.ShadowQuality" /> - <description> - </description> - </method> <method name="skeleton_allocate_data"> <return type="void" /> <argument index="0" name="skeleton" type="RID" /> @@ -3220,6 +3220,25 @@ Sets the viewport's parent to another viewport. </description> </method> + <method name="viewport_set_positional_shadow_atlas_quadrant_subdivision"> + <return type="void" /> + <argument index="0" name="viewport" type="RID" /> + <argument index="1" name="quadrant" type="int" /> + <argument index="2" name="subdivision" type="int" /> + <description> + Sets the shadow atlas quadrant's subdivision. + </description> + </method> + <method name="viewport_set_positional_shadow_atlas_size"> + <return type="void" /> + <argument index="0" name="viewport" type="RID" /> + <argument index="1" name="size" type="int" /> + <argument index="2" name="use_16_bits" type="bool" default="false" /> + <description> + Sets the size of the shadow atlas's images (used for omni and spot lights). The value will be rounded up to the nearest power of 2. + [b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at all (including directional shadows). + </description> + </method> <method name="viewport_set_render_direct_to_screen"> <return type="void" /> <argument index="0" name="viewport" type="RID" /> @@ -3269,24 +3288,6 @@ <description> </description> </method> - <method name="viewport_set_shadow_atlas_quadrant_subdivision"> - <return type="void" /> - <argument index="0" name="viewport" type="RID" /> - <argument index="1" name="quadrant" type="int" /> - <argument index="2" name="subdivision" type="int" /> - <description> - Sets the shadow atlas quadrant's subdivision. - </description> - </method> - <method name="viewport_set_shadow_atlas_size"> - <return type="void" /> - <argument index="0" name="viewport" type="RID" /> - <argument index="1" name="size" type="int" /> - <argument index="2" name="use_16_bits" type="bool" default="false" /> - <description> - Sets the size of the shadow atlas's images (used for omni and spot lights). The value will be rounded up to the nearest power of 2. - </description> - </method> <method name="viewport_set_size"> <return type="void" /> <argument index="0" name="viewport" type="RID" /> @@ -3356,6 +3357,22 @@ If [code]true[/code], the viewport uses augmented or virtual reality technologies. See [XRInterface]. </description> </method> + <method name="viewport_set_vrs_mode"> + <return type="void" /> + <argument index="0" name="viewport" type="RID" /> + <argument index="1" name="mode" type="int" enum="RenderingServer.ViewportVRSMode" /> + <description> + Sets the Variable Rate Shading (VRS) mode for the viewport. Note, if hardware does not support VRS this property is ignored. + </description> + </method> + <method name="viewport_set_vrs_texture"> + <return type="void" /> + <argument index="0" name="viewport" type="RID" /> + <argument index="1" name="texture" type="RID" /> + <description> + Texture to use when the VRS mode is set to [constant RenderingServer.VIEWPORT_VRS_TEXTURE]. + </description> + </method> <method name="visibility_notifier_create"> <return type="RID" /> <description> @@ -4115,6 +4132,18 @@ </constant> <constant name="VIEWPORT_DEBUG_DRAW_MOTION_VECTORS" value="25" enum="ViewportDebugDraw"> </constant> + <constant name="VIEWPORT_VRS_DISABLED" value="0" enum="ViewportVRSMode"> + VRS is disabled. + </constant> + <constant name="VIEWPORT_VRS_TEXTURE" value="1" enum="ViewportVRSMode"> + VRS uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. + </constant> + <constant name="VIEWPORT_VRS_XR" value="2" enum="ViewportVRSMode"> + VRS texture is supplied by the primary [XRInterface]. + </constant> + <constant name="VIEWPORT_VRS_MAX" value="3" enum="ViewportVRSMode"> + Represents the size of the [enum ViewportVRSMode] enum. + </constant> <constant name="SKY_MODE_AUTOMATIC" value="0" enum="SkyMode"> </constant> <constant name="SKY_MODE_QUALITY" value="1" enum="SkyMode"> diff --git a/doc/classes/ScriptCreateDialog.xml b/doc/classes/ScriptCreateDialog.xml index e21fac2d32..79ee95719d 100644 --- a/doc/classes/ScriptCreateDialog.xml +++ b/doc/classes/ScriptCreateDialog.xml @@ -40,6 +40,7 @@ </methods> <members> <member name="dialog_hide_on_ok" type="bool" setter="set_hide_on_ok" getter="get_hide_on_ok" overrides="AcceptDialog" default="false" /> + <member name="ok_button_text" type="String" setter="set_ok_button_text" getter="get_ok_button_text" overrides="AcceptDialog" default=""Create"" /> <member name="title" type="String" setter="set_title" getter="get_title" overrides="Window" default=""Attach Node Script"" /> </members> <signals> diff --git a/doc/classes/SkeletonProfile.xml b/doc/classes/SkeletonProfile.xml index 55a2ea6759..a7f5f7a0a6 100644 --- a/doc/classes/SkeletonProfile.xml +++ b/doc/classes/SkeletonProfile.xml @@ -9,6 +9,13 @@ <tutorials> </tutorials> <methods> + <method name="find_bone" qualifiers="const"> + <return type="int" /> + <argument index="0" name="bone_name" type="StringName" /> + <description> + Returns the bone index that matches [code]bone_name[/code] as its name. + </description> + </method> <method name="get_bone_name" qualifiers="const"> <return type="StringName" /> <argument index="0" name="bone_idx" type="int" /> @@ -17,6 +24,20 @@ In the retargeting process, the returned bone name is the bone name of the target skeleton. </description> </method> + <method name="get_bone_parent" qualifiers="const"> + <return type="StringName" /> + <argument index="0" name="bone_idx" type="int" /> + <description> + Returns the name of the bone which is the parent to the bone at [code]bone_idx[/code]. The result is empty if the bone has no parent. + </description> + </method> + <method name="get_bone_tail" qualifiers="const"> + <return type="StringName" /> + <argument index="0" name="bone_idx" type="int" /> + <description> + Returns the name of the bone which is the tail of the bone at [code]bone_idx[/code]. + </description> + </method> <method name="get_group" qualifiers="const"> <return type="StringName" /> <argument index="0" name="bone_idx" type="int" /> @@ -39,6 +60,20 @@ This is the offset with origin at the top left corner of the square. </description> </method> + <method name="get_reference_pose" qualifiers="const"> + <return type="Transform3D" /> + <argument index="0" name="bone_idx" type="int" /> + <description> + Returns the reference pose transform for bone [code]bone_idx[/code]. + </description> + </method> + <method name="get_tail_direction" qualifiers="const"> + <return type="int" enum="SkeletonProfile.TailDirection" /> + <argument index="0" name="bone_idx" type="int" /> + <description> + Returns the tail direction of the bone at [code]bone_idx[/code]. + </description> + </method> <method name="get_texture" qualifiers="const"> <return type="Texture2D" /> <argument index="0" name="group_idx" type="int" /> @@ -55,6 +90,22 @@ In the retargeting process, the setting bone name is the bone name of the target skeleton. </description> </method> + <method name="set_bone_parent"> + <return type="void" /> + <argument index="0" name="bone_idx" type="int" /> + <argument index="1" name="bone_parent" type="StringName" /> + <description> + Sets the bone with name [code]bone_parent[/code] as the parent of the bone at [code]bone_idx[/code]. If an empty string is passed, then the bone has no parent. + </description> + </method> + <method name="set_bone_tail"> + <return type="void" /> + <argument index="0" name="bone_idx" type="int" /> + <argument index="1" name="bone_tail" type="StringName" /> + <description> + Sets the bone with name [code]bone_tail[/code] as the tail of the bone at [code]bone_idx[/code]. + </description> + </method> <method name="set_group"> <return type="void" /> <argument index="0" name="bone_idx" type="int" /> @@ -80,6 +131,23 @@ This is the offset with origin at the top left corner of the square. </description> </method> + <method name="set_reference_pose"> + <return type="void" /> + <argument index="0" name="bone_idx" type="int" /> + <argument index="1" name="bone_name" type="Transform3D" /> + <description> + Sets the reference pose transform for bone [code]bone_idx[/code]. + </description> + </method> + <method name="set_tail_direction"> + <return type="void" /> + <argument index="0" name="bone_idx" type="int" /> + <argument index="1" name="tail_direction" type="int" enum="SkeletonProfile.TailDirection" /> + <description> + Sets the tail direction of the bone at [code]bone_idx[/code]. + [b]Note:[/b] This only specifies the method of calculation. The actual coordinates required should be stored in an external skeleton, so the calculation itself needs to be done externally. + </description> + </method> <method name="set_texture"> <return type="void" /> <argument index="0" name="group_idx" type="int" /> @@ -103,4 +171,15 @@ </description> </signal> </signals> + <constants> + <constant name="TAIL_DIRECTION_AVERAGE_CHILDREN" value="0" enum="TailDirection"> + Direction to the average coordinates of bone children. + </constant> + <constant name="TAIL_DIRECTION_SPECIFIC_CHILD" value="1" enum="TailDirection"> + Direction to the coordinates of specified bone child. + </constant> + <constant name="TAIL_DIRECTION_END" value="2" enum="TailDirection"> + Direction is not calculated. + </constant> + </constants> </class> diff --git a/doc/classes/SpriteFrames.xml b/doc/classes/SpriteFrames.xml index b0d1e1efcf..0d423630d4 100644 --- a/doc/classes/SpriteFrames.xml +++ b/doc/classes/SpriteFrames.xml @@ -130,9 +130,4 @@ </description> </method> </methods> - <members> - <member name="frames" type="Array" setter="_set_frames" getter="_get_frames"> - Compatibility property, always equals to an empty array. - </member> - </members> </class> diff --git a/doc/classes/TextLine.xml b/doc/classes/TextLine.xml index c3574980b1..601650db2e 100644 --- a/doc/classes/TextLine.xml +++ b/doc/classes/TextLine.xml @@ -148,8 +148,8 @@ <member name="direction" type="int" setter="set_direction" getter="get_direction" enum="TextServer.Direction" default="0"> Text writing direction. </member> - <member name="flags" type="int" setter="set_flags" getter="get_flags" default="3"> - Line Alignment rules. For more info see [TextServer]. + <member name="flags" type="int" setter="set_flags" getter="get_flags" enum="TextServer.JustificationFlag" default="3"> + Line alignment rules. For more info see [TextServer]. </member> <member name="orientation" type="int" setter="set_orientation" getter="get_orientation" enum="TextServer.Orientation" default="0"> Text orientation. diff --git a/doc/classes/TextParagraph.xml b/doc/classes/TextParagraph.xml index 6d615bd404..c733d8fcee 100644 --- a/doc/classes/TextParagraph.xml +++ b/doc/classes/TextParagraph.xml @@ -263,14 +263,17 @@ <member name="alignment" type="int" setter="set_alignment" getter="get_alignment" enum="HorizontalAlignment" default="0"> Paragraph horizontal alignment. </member> + <member name="break_flags" type="int" setter="set_break_flags" getter="get_break_flags" enum="TextServer.LineBreakFlag" default="3"> + Line breaking rules. For more info see [TextServer]. + </member> <member name="custom_punctuation" type="String" setter="set_custom_punctuation" getter="get_custom_punctuation" default=""""> Custom punctuation character list, used for word breaking. If set to empty string, server defaults are used. </member> <member name="direction" type="int" setter="set_direction" getter="get_direction" enum="TextServer.Direction" default="0"> Text writing direction. </member> - <member name="flags" type="int" setter="set_flags" getter="get_flags" default="99"> - Line breaking and alignment rules. For more info see [TextServer]. + <member name="justification_flags" type="int" setter="set_justification_flags" getter="get_justification_flags" enum="TextServer.JustificationFlag" default="3"> + Line alignment rules. For more info see [TextServer]. </member> <member name="max_lines_visible" type="int" setter="set_max_lines_visible" getter="get_max_lines_visible" default="-1"> Limits the lines of text shown. diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index 4c8cf3982e..e1b676427b 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -356,7 +356,7 @@ </description> </method> <method name="font_get_style" qualifiers="const"> - <return type="int" /> + <return type="int" enum="TextServer.FontStyle" /> <argument index="0" name="font_rid" type="RID" /> <description> Returns font style flags, see [enum FontStyle]. @@ -786,7 +786,7 @@ <method name="font_set_style"> <return type="void" /> <argument index="0" name="font_rid" type="RID" /> - <argument index="1" name="style" type="int" /> + <argument index="1" name="style" type="int" enum="TextServer.FontStyle" /> <description> Sets the font style flags, see [enum FontStyle]. </description> @@ -1077,7 +1077,7 @@ <return type="float" /> <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" /> - <argument index="2" name="jst_flags" type="int" default="3" /> + <argument index="2" name="jst_flags" type="int" enum="TextServer.JustificationFlag" default="3" /> <description> Adjusts text with to fit to specified width, returns new text width. </description> @@ -1184,7 +1184,7 @@ <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" /> <argument index="2" name="start" type="int" default="0" /> - <argument index="3" name="break_flags" type="int" default="96" /> + <argument index="3" name="break_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> <description> Breaks text to the lines and returns character ranges for each line. </description> @@ -1195,7 +1195,7 @@ <argument index="1" name="width" type="PackedFloat32Array" /> <argument index="2" name="start" type="int" default="0" /> <argument index="3" name="once" type="bool" default="true" /> - <argument index="4" name="break_flags" type="int" default="96" /> + <argument index="4" name="break_flags" type="int" enum="TextServer.LineBreakFlag" default="3" /> <description> Breaks text to the lines and columns. Returns character ranges for each segment. </description> @@ -1306,7 +1306,7 @@ <method name="shaped_text_get_word_breaks" qualifiers="const"> <return type="PackedInt32Array" /> <argument index="0" name="shaped" type="RID" /> - <argument index="1" name="grapheme_flags" type="int" default="264" /> + <argument index="1" name="grapheme_flags" type="int" enum="TextServer.GraphemeFlag" default="264" /> <description> Breaks text into words and returns array of character ranges. Use [code]grapheme_flags[/code] to set what characters are used for breaking (see [enum GraphemeFlag]). </description> @@ -1346,7 +1346,7 @@ <return type="void" /> <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" default="0" /> - <argument index="2" name="overrun_trim_flags" type="int" default="0" /> + <argument index="2" name="overrun_trim_flags" type="int" enum="TextServer.TextOverrunFlag" default="0" /> <description> Trims text if it exceeds the given width. </description> @@ -1522,22 +1522,22 @@ Left to right text is written vertically from top to bottom. Right to left text is written vertically from bottom to top. </constant> - <constant name="JUSTIFICATION_NONE" value="0" enum="JustificationFlag"> + <constant name="JUSTIFICATION_NONE" value="0" enum="JustificationFlag" is_bitfield="true"> Do not justify text. </constant> - <constant name="JUSTIFICATION_KASHIDA" value="1" enum="JustificationFlag"> + <constant name="JUSTIFICATION_KASHIDA" value="1" enum="JustificationFlag" is_bitfield="true"> Justify text by adding and removing kashidas. </constant> - <constant name="JUSTIFICATION_WORD_BOUND" value="2" enum="JustificationFlag"> + <constant name="JUSTIFICATION_WORD_BOUND" value="2" enum="JustificationFlag" is_bitfield="true"> Justify text by changing width of the spaces between the words. </constant> - <constant name="JUSTIFICATION_TRIM_EDGE_SPACES" value="4" enum="JustificationFlag"> + <constant name="JUSTIFICATION_TRIM_EDGE_SPACES" value="4" enum="JustificationFlag" is_bitfield="true"> Remove trailing and leading spaces from the justified text. </constant> - <constant name="JUSTIFICATION_AFTER_LAST_TAB" value="8" enum="JustificationFlag"> + <constant name="JUSTIFICATION_AFTER_LAST_TAB" value="8" enum="JustificationFlag" is_bitfield="true"> Only apply justification to the part of the text after the last tab. </constant> - <constant name="JUSTIFICATION_CONSTRAIN_ELLIPSIS" value="16" enum="JustificationFlag"> + <constant name="JUSTIFICATION_CONSTRAIN_ELLIPSIS" value="16" enum="JustificationFlag" is_bitfield="true"> Apply justification to the trimmed line with ellipsis. </constant> <constant name="AUTOWRAP_OFF" value="0" enum="AutowrapMode"> @@ -1552,20 +1552,19 @@ <constant name="AUTOWRAP_WORD_SMART" value="3" enum="AutowrapMode"> Behaves similarly to [constant AUTOWRAP_WORD], but force-breaks a word if that single word does not fit in one line. </constant> - <constant name="BREAK_NONE" value="0" enum="LineBreakFlag"> + <constant name="BREAK_NONE" value="0" enum="LineBreakFlag" is_bitfield="true"> Do not break the line. </constant> - <constant name="BREAK_MANDATORY" value="32" enum="LineBreakFlag"> + <constant name="BREAK_MANDATORY" value="1" enum="LineBreakFlag" is_bitfield="true"> Break the line at the line mandatory break characters (e.g. [code]"\n"[/code]). </constant> - <constant name="BREAK_WORD_BOUND" value="64" enum="LineBreakFlag"> + <constant name="BREAK_WORD_BOUND" value="2" enum="LineBreakFlag" is_bitfield="true"> Break the line between the words. </constant> - <constant name="BREAK_GRAPHEME_BOUND" value="128" enum="LineBreakFlag"> + <constant name="BREAK_GRAPHEME_BOUND" value="4" enum="LineBreakFlag" is_bitfield="true"> Break the line between any unconnected graphemes. </constant> - <constant name="BREAK_WORD_BOUND_ADAPTIVE" value="320" enum="LineBreakFlag"> - Break the line between the words, or any unconnected graphemes if line is too short to fit the whole word. + <constant name="BREAK_ADAPTIVE" value="8" enum="LineBreakFlag" is_bitfield="true"> </constant> <constant name="VC_CHARS_BEFORE_SHAPING" value="0" enum="VisibleCharactersBehavior"> Trims text before the shaping. e.g, increasing [member Label.visible_characters] or [member RichTextLabel.visible_characters] value is visually identical to typing the text. @@ -1597,54 +1596,54 @@ <constant name="OVERRUN_TRIM_WORD_ELLIPSIS" value="4" enum="OverrunBehavior"> Trims the text per word and adds an ellipsis to indicate that parts are hidden. </constant> - <constant name="OVERRUN_NO_TRIM" value="0" enum="TextOverrunFlag"> + <constant name="OVERRUN_NO_TRIM" value="0" enum="TextOverrunFlag" is_bitfield="true"> No trimming is performed. </constant> - <constant name="OVERRUN_TRIM" value="1" enum="TextOverrunFlag"> + <constant name="OVERRUN_TRIM" value="1" enum="TextOverrunFlag" is_bitfield="true"> Trims the text when it exceeds the given width. </constant> - <constant name="OVERRUN_TRIM_WORD_ONLY" value="2" enum="TextOverrunFlag"> + <constant name="OVERRUN_TRIM_WORD_ONLY" value="2" enum="TextOverrunFlag" is_bitfield="true"> Trims the text per word instead of per grapheme. </constant> - <constant name="OVERRUN_ADD_ELLIPSIS" value="4" enum="TextOverrunFlag"> + <constant name="OVERRUN_ADD_ELLIPSIS" value="4" enum="TextOverrunFlag" is_bitfield="true"> Determines whether an ellipsis should be added at the end of the text. </constant> - <constant name="OVERRUN_ENFORCE_ELLIPSIS" value="8" enum="TextOverrunFlag"> + <constant name="OVERRUN_ENFORCE_ELLIPSIS" value="8" enum="TextOverrunFlag" is_bitfield="true"> Determines whether the ellipsis at the end of the text is enforced and may not be hidden. </constant> - <constant name="OVERRUN_JUSTIFICATION_AWARE" value="16" enum="TextOverrunFlag"> + <constant name="OVERRUN_JUSTIFICATION_AWARE" value="16" enum="TextOverrunFlag" is_bitfield="true"> </constant> - <constant name="GRAPHEME_IS_VALID" value="1" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_VALID" value="1" enum="GraphemeFlag" is_bitfield="true"> Grapheme is supported by the font, and can be drawn. </constant> - <constant name="GRAPHEME_IS_RTL" value="2" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_RTL" value="2" enum="GraphemeFlag" is_bitfield="true"> Grapheme is part of right-to-left or bottom-to-top run. </constant> - <constant name="GRAPHEME_IS_VIRTUAL" value="4" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_VIRTUAL" value="4" enum="GraphemeFlag" is_bitfield="true"> Grapheme is not part of source text, it was added by justification process. </constant> - <constant name="GRAPHEME_IS_SPACE" value="8" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_SPACE" value="8" enum="GraphemeFlag" is_bitfield="true"> Grapheme is whitespace. </constant> - <constant name="GRAPHEME_IS_BREAK_HARD" value="16" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_BREAK_HARD" value="16" enum="GraphemeFlag" is_bitfield="true"> Grapheme is mandatory break point (e.g. [code]"\n"[/code]). </constant> - <constant name="GRAPHEME_IS_BREAK_SOFT" value="32" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_BREAK_SOFT" value="32" enum="GraphemeFlag" is_bitfield="true"> Grapheme is optional break point (e.g. space). </constant> - <constant name="GRAPHEME_IS_TAB" value="64" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_TAB" value="64" enum="GraphemeFlag" is_bitfield="true"> Grapheme is the tabulation character. </constant> - <constant name="GRAPHEME_IS_ELONGATION" value="128" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_ELONGATION" value="128" enum="GraphemeFlag" is_bitfield="true"> Grapheme is kashida. </constant> - <constant name="GRAPHEME_IS_PUNCTUATION" value="256" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_PUNCTUATION" value="256" enum="GraphemeFlag" is_bitfield="true"> Grapheme is punctuation character. </constant> - <constant name="GRAPHEME_IS_UNDERSCORE" value="512" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_UNDERSCORE" value="512" enum="GraphemeFlag" is_bitfield="true"> Grapheme is underscore character. </constant> - <constant name="GRAPHEME_IS_CONNECTED" value="1024" enum="GraphemeFlag"> + <constant name="GRAPHEME_IS_CONNECTED" value="1024" enum="GraphemeFlag" is_bitfield="true"> Grapheme is connected to the previous grapheme. Breaking line before this grapheme is not safe. </constant> <constant name="HINTING_NONE" value="0" enum="Hinting"> @@ -1737,13 +1736,15 @@ <constant name="SPACING_BOTTOM" value="3" enum="SpacingType"> Spacing at the bottom of the line. </constant> - <constant name="FONT_BOLD" value="1" enum="FontStyle"> + <constant name="SPACING_MAX" value="4" enum="SpacingType"> + </constant> + <constant name="FONT_BOLD" value="1" enum="FontStyle" is_bitfield="true"> Font is bold. </constant> - <constant name="FONT_ITALIC" value="2" enum="FontStyle"> + <constant name="FONT_ITALIC" value="2" enum="FontStyle" is_bitfield="true"> Font is italic or oblique. </constant> - <constant name="FONT_FIXED_WIDTH" value="4" enum="FontStyle"> + <constant name="FONT_FIXED_WIDTH" value="4" enum="FontStyle" is_bitfield="true"> Font have fixed-width characters. </constant> <constant name="STRUCTURED_TEXT_DEFAULT" value="0" enum="StructuredTextParser"> diff --git a/doc/classes/TextServerExtension.xml b/doc/classes/TextServerExtension.xml index 2f7b31b663..4501ec744a 100644 --- a/doc/classes/TextServerExtension.xml +++ b/doc/classes/TextServerExtension.xml @@ -346,7 +346,7 @@ </description> </method> <method name="font_get_style" qualifiers="virtual const"> - <return type="int" /> + <return type="int" enum="TextServer.FontStyle" /> <argument index="0" name="font_rid" type="RID" /> <description> Returns font style flags, see [enum TextServer.FontStyle]. @@ -782,7 +782,7 @@ <method name="font_set_style" qualifiers="virtual"> <return type="void" /> <argument index="0" name="font_rid" type="RID" /> - <argument index="1" name="style" type="int" /> + <argument index="1" name="style" type="int" enum="TextServer.FontStyle" /> <description> Sets the font style flags, see [enum TextServer.FontStyle]. </description> @@ -1074,7 +1074,7 @@ <return type="float" /> <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" /> - <argument index="2" name="jst_flags" type="int" /> + <argument index="2" name="jst_flags" type="int" enum="TextServer.JustificationFlag" /> <description> Adjusts text with to fit to specified width, returns new text width. </description> @@ -1183,7 +1183,7 @@ <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" /> <argument index="2" name="start" type="int" /> - <argument index="3" name="break_flags" type="int" /> + <argument index="3" name="break_flags" type="int" enum="TextServer.LineBreakFlag" /> <description> Breaks text to the lines and returns character ranges for each line. [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. @@ -1195,7 +1195,7 @@ <argument index="1" name="width" type="PackedFloat32Array" /> <argument index="2" name="start" type="int" /> <argument index="3" name="once" type="bool" /> - <argument index="4" name="break_flags" type="int" /> + <argument index="4" name="break_flags" type="int" enum="TextServer.LineBreakFlag" /> <description> Breaks text to the lines and columns. Returns character ranges for each segment. [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. @@ -1308,7 +1308,7 @@ <method name="shaped_text_get_word_breaks" qualifiers="virtual const"> <return type="PackedInt32Array" /> <argument index="0" name="shaped" type="RID" /> - <argument index="1" name="grapheme_flags" type="int" /> + <argument index="1" name="grapheme_flags" type="int" enum="TextServer.GraphemeFlag" /> <description> Breaks text into words and returns array of character ranges. [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. @@ -1352,7 +1352,7 @@ <return type="void" /> <argument index="0" name="shaped" type="RID" /> <argument index="1" name="width" type="float" /> - <argument index="2" name="trim_flags" type="int" /> + <argument index="2" name="trim_flags" type="int" enum="TextServer.TextOverrunFlag" /> <description> Trims text if it exceeds the given width. </description> diff --git a/doc/classes/VehicleBody3D.xml b/doc/classes/VehicleBody3D.xml index 330a405d5f..08309a8ecc 100644 --- a/doc/classes/VehicleBody3D.xml +++ b/doc/classes/VehicleBody3D.xml @@ -16,7 +16,7 @@ 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 RigidDynamicBody3D.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" default="0.0"> - Accelerates the vehicle by applying an engine force. The vehicle is only speed up if the wheels that have [member VehicleWheel3D.use_as_traction] set to [code]true[/code] and are in contact with a surface. The [member RigidDynamicBody3D.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. + Accelerates the vehicle by applying an engine force. The vehicle is only sped up if the wheels that have [member VehicleWheel3D.use_as_traction] set to [code]true[/code] and are in contact with a surface. The [member RigidDynamicBody3D.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. [b]Note:[/b] The simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears. A negative value will result in the vehicle reversing. </member> diff --git a/doc/classes/VehicleWheel3D.xml b/doc/classes/VehicleWheel3D.xml index 1c164d7c9a..ac126f824e 100644 --- a/doc/classes/VehicleWheel3D.xml +++ b/doc/classes/VehicleWheel3D.xml @@ -48,7 +48,7 @@ The damping applied to the spring when relaxing. This value should be between 0.0 (no damping) and 1.0. This value should always be slightly higher than the [member damping_compression] property. For a [member damping_compression] value of 0.3, try a relaxation value of 0.5. </member> <member name="engine_force" type="float" setter="set_engine_force" getter="get_engine_force" default="0.0"> - Accelerates the wheel by applying an engine force. The wheel is only speed up if it is in contact with a surface. The [member RigidDynamicBody3D.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. + Accelerates the wheel by applying an engine force. The wheel is only sped up if it is in contact with a surface. The [member RigidDynamicBody3D.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. [b]Note:[/b] The simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears. A negative value will result in the wheel reversing. </member> diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index 4727bc389e..53603b5356 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -57,6 +57,13 @@ Returns the mouse's position in this [Viewport] using the coordinate system of this [Viewport]. </description> </method> + <method name="get_positional_shadow_atlas_quadrant_subdiv" qualifiers="const"> + <return type="int" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" /> + <argument index="0" name="quadrant" type="int" /> + <description> + Returns the [enum PositionalShadowAtlasQuadrantSubdiv] of the specified quadrant. + </description> + </method> <method name="get_render_info"> <return type="int" /> <argument index="0" name="type" type="int" enum="Viewport.RenderInfoType" /> @@ -64,13 +71,6 @@ <description> </description> </method> - <method name="get_shadow_atlas_quadrant_subdiv" qualifiers="const"> - <return type="int" enum="Viewport.ShadowAtlasQuadrantSubdiv" /> - <argument index="0" name="quadrant" type="int" /> - <description> - Returns the [enum ShadowAtlasQuadrantSubdiv] of the specified quadrant. - </description> - </method> <method name="get_texture" qualifiers="const"> <return type="ViewportTexture" /> <description> @@ -158,10 +158,10 @@ Stops the input from propagating further down the [SceneTree]. </description> </method> - <method name="set_shadow_atlas_quadrant_subdiv"> + <method name="set_positional_shadow_atlas_quadrant_subdiv"> <return type="void" /> <argument index="0" name="quadrant" type="int" /> - <argument index="1" name="subdiv" type="int" enum="Viewport.ShadowAtlasQuadrantSubdiv" /> + <argument index="1" name="subdiv" type="int" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" /> <description> Sets the number of subdivisions to use in the specified quadrant. A higher number of subdivisions allows you to have more shadows in the scene at once, but reduces the quality of the shadows. A good practice is to have quadrants with a varying number of subdivisions and to have as few subdivisions as possible. </description> @@ -232,6 +232,24 @@ <member name="physics_object_picking" type="bool" setter="set_physics_object_picking" getter="get_physics_object_picking" default="false"> If [code]true[/code], the objects rendered by viewport become subjects of mouse picking process. </member> + <member name="positional_shadow_atlas_16_bits" type="bool" setter="set_positional_shadow_atlas_16_bits" getter="get_positional_shadow_atlas_16_bits" default="true"> + </member> + <member name="positional_shadow_atlas_quad_0" type="int" setter="set_positional_shadow_atlas_quadrant_subdiv" getter="get_positional_shadow_atlas_quadrant_subdiv" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" default="2"> + The subdivision amount of the first quadrant on the shadow atlas. + </member> + <member name="positional_shadow_atlas_quad_1" type="int" setter="set_positional_shadow_atlas_quadrant_subdiv" getter="get_positional_shadow_atlas_quadrant_subdiv" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" default="2"> + The subdivision amount of the second quadrant on the shadow atlas. + </member> + <member name="positional_shadow_atlas_quad_2" type="int" setter="set_positional_shadow_atlas_quadrant_subdiv" getter="get_positional_shadow_atlas_quadrant_subdiv" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" default="3"> + The subdivision amount of the third quadrant on the shadow atlas. + </member> + <member name="positional_shadow_atlas_quad_3" type="int" setter="set_positional_shadow_atlas_quadrant_subdiv" getter="get_positional_shadow_atlas_quadrant_subdiv" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" default="4"> + The subdivision amount of the fourth quadrant on the shadow atlas. + </member> + <member name="positional_shadow_atlas_size" type="int" setter="set_positional_shadow_atlas_size" getter="get_positional_shadow_atlas_size" default="2048"> + The shadow atlas' resolution (used for omni and spot lights). The value will be rounded up to the nearest power of 2. + [b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at all (including directional shadows). + </member> <member name="scaling_3d_mode" type="int" setter="set_scaling_3d_mode" getter="get_scaling_3d_mode" enum="Viewport.Scaling3DMode" default="0"> Sets scaling 3d mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. To control this property on the root viewport, set the [member ProjectSettings.rendering/scaling_3d/mode] project setting. @@ -248,24 +266,6 @@ </member> <member name="sdf_scale" type="int" setter="set_sdf_scale" getter="get_sdf_scale" enum="Viewport.SDFScale" default="1"> </member> - <member name="shadow_atlas_16_bits" type="bool" setter="set_shadow_atlas_16_bits" getter="get_shadow_atlas_16_bits" default="true"> - </member> - <member name="shadow_atlas_quad_0" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv" default="2"> - The subdivision amount of the first quadrant on the shadow atlas. - </member> - <member name="shadow_atlas_quad_1" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv" default="2"> - The subdivision amount of the second quadrant on the shadow atlas. - </member> - <member name="shadow_atlas_quad_2" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv" default="3"> - The subdivision amount of the third quadrant on the shadow atlas. - </member> - <member name="shadow_atlas_quad_3" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv" default="4"> - The subdivision amount of the fourth quadrant on the shadow atlas. - </member> - <member name="shadow_atlas_size" type="int" setter="set_shadow_atlas_size" getter="get_shadow_atlas_size" default="2048"> - The shadow atlas' resolution (used for omni and spot lights). The value will be rounded up to the nearest power of 2. - [b]Note:[/b] If this is set to 0, shadows won't be visible. - </member> <member name="snap_2d_transforms_to_pixel" type="bool" setter="set_snap_2d_transforms_to_pixel" getter="is_snap_2d_transforms_to_pixel_enabled" default="false"> </member> <member name="snap_2d_vertices_to_pixel" type="bool" setter="set_snap_2d_vertices_to_pixel" getter="is_snap_2d_vertices_to_pixel_enabled" default="false"> @@ -286,6 +286,12 @@ <member name="use_xr" type="bool" setter="set_use_xr" getter="is_using_xr" default="false"> If [code]true[/code], the viewport will use the primary XR interface to render XR output. When applicable this can result in a stereoscopic image and the resulting render being output to a headset. </member> + <member name="vrs_mode" type="int" setter="set_vrs_mode" getter="get_vrs_mode" enum="Viewport.VRSMode" default="0"> + The Variable Rate Shading (VRS) mode that is used for this viewport. Note, if hardware does not support VRS this property is ignored. + </member> + <member name="vrs_texture" type="Texture2D" setter="set_vrs_texture" getter="get_vrs_texture"> + Texture to use when [member vrs_mode] is set to [constant Viewport.VRS_TEXTURE]. + </member> <member name="world_2d" type="World2D" setter="set_world_2d" getter="get_world_2d"> The custom [World2D] which can be used as 2D environment source. </member> @@ -307,29 +313,29 @@ </signal> </signals> <constants> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED" value="0" enum="ShadowAtlasQuadrantSubdiv"> + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED" value="0" enum="PositionalShadowAtlasQuadrantSubdiv"> This quadrant will not be used. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_1" value="1" enum="ShadowAtlasQuadrantSubdiv"> + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_1" value="1" enum="PositionalShadowAtlasQuadrantSubdiv"> This quadrant will only be used by one shadow map. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_4" value="2" enum="ShadowAtlasQuadrantSubdiv"> + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_4" value="2" enum="PositionalShadowAtlasQuadrantSubdiv"> This quadrant will be split in 4 and used by up to 4 shadow maps. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_16" value="3" enum="ShadowAtlasQuadrantSubdiv"> + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_16" value="3" enum="PositionalShadowAtlasQuadrantSubdiv"> This quadrant will be split 16 ways and used by up to 16 shadow maps. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_64" value="4" enum="ShadowAtlasQuadrantSubdiv"> + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_64" value="4" enum="PositionalShadowAtlasQuadrantSubdiv"> This quadrant will be split 64 ways and used by up to 64 shadow maps. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_256" value="5" enum="ShadowAtlasQuadrantSubdiv"> - This quadrant will be split 256 ways and used by up to 256 shadow maps. Unless the [member shadow_atlas_size] is very high, the shadows in this quadrant will be very low resolution. + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_256" value="5" enum="PositionalShadowAtlasQuadrantSubdiv"> + This quadrant will be split 256 ways and used by up to 256 shadow maps. Unless the [member positional_shadow_atlas_size] is very high, the shadows in this quadrant will be very low resolution. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_1024" value="6" enum="ShadowAtlasQuadrantSubdiv"> - This quadrant will be split 1024 ways and used by up to 1024 shadow maps. Unless the [member shadow_atlas_size] is very high, the shadows in this quadrant will be very low resolution. + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_1024" value="6" enum="PositionalShadowAtlasQuadrantSubdiv"> + This quadrant will be split 1024 ways and used by up to 1024 shadow maps. Unless the [member positional_shadow_atlas_size] is very high, the shadows in this quadrant will be very low resolution. </constant> - <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_MAX" value="7" enum="ShadowAtlasQuadrantSubdiv"> - Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum. + <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_MAX" value="7" enum="PositionalShadowAtlasQuadrantSubdiv"> + Represents the size of the [enum PositionalShadowAtlasQuadrantSubdiv] enum. </constant> <constant name="SCALING_3D_MODE_BILINEAR" value="0" enum="Scaling3DMode"> Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be set using [member scaling_3d_scale]. Values less then [code]1.0[/code] will result in undersampling while values greater than [code]1.0[/code] will result in supersampling. A value of [code]1.0[/code] disables scaling. @@ -492,5 +498,17 @@ </constant> <constant name="SDF_SCALE_MAX" value="3" enum="SDFScale"> </constant> + <constant name="VRS_DISABLED" value="0" enum="VRSMode"> + VRS is disabled. + </constant> + <constant name="VRS_TEXTURE" value="1" enum="VRSMode"> + VRS uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. + </constant> + <constant name="VRS_XR" value="2" enum="VRSMode"> + VRS texture is supplied by the primary [XRInterface]. + </constant> + <constant name="VRS_MAX" value="3" enum="VRSMode"> + Represents the size of the [enum VRSMode] enum. + </constant> </constants> </class> diff --git a/doc/classes/XRInterfaceExtension.xml b/doc/classes/XRInterfaceExtension.xml index 71f6a44724..1642ae61f7 100644 --- a/doc/classes/XRInterfaceExtension.xml +++ b/doc/classes/XRInterfaceExtension.xml @@ -106,6 +106,11 @@ Returns the number of views this interface requires, 1 for mono, 2 for stereoscopic. </description> </method> + <method name="_get_vrs_texture" qualifiers="virtual"> + <return type="RID" /> + <description> + </description> + </method> <method name="_initialize" qualifiers="virtual"> <return type="bool" /> <description> diff --git a/doc/translations/ar.po b/doc/translations/ar.po index b21374a37f..a4488f3339 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -10132,7 +10132,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10297,7 +10303,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28607,13 +28619,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30029,9 +30042,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30605,10 +30618,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30621,6 +30637,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45558,6 +45580,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54487,7 +54516,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54527,15 +54557,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56011,11 +56042,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66053,11 +66103,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66137,8 +66187,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ca.po b/doc/translations/ca.po index 0e33b91074..bd84c415cc 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -10078,7 +10078,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10243,7 +10249,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28526,13 +28538,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29946,9 +29959,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30522,10 +30535,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30538,6 +30554,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45405,6 +45427,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54329,7 +54358,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54369,15 +54399,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55853,11 +55884,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65874,11 +65924,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65958,8 +66008,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 8d833031fe..90ebdbf9f3 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -9958,7 +9958,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10123,7 +10129,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28403,13 +28415,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29823,9 +29836,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30399,10 +30412,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30415,6 +30431,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45282,6 +45304,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54206,7 +54235,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54246,15 +54276,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55730,11 +55761,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65751,7 +65801,7 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " +"sped 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 " @@ -65835,7 +65885,7 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " +"Accelerates the wheel by applying an engine force. The wheel is only sped " "up if it is 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.\n" diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 85a9d50b28..48a79d9ec3 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -10475,7 +10475,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10640,7 +10646,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28996,13 +29008,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30419,9 +30432,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30995,10 +31008,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31010,6 +31026,15 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -45974,6 +45999,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54913,7 +54945,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54953,15 +54986,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56438,11 +56472,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66526,11 +66579,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66610,8 +66663,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/de.po b/doc/translations/de.po index ae8d8f2165..ba4e24c02b 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -12026,7 +12026,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -12192,7 +12198,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -30778,13 +30790,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -32210,9 +32223,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -32786,10 +32799,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -32801,6 +32817,14 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"Liefert [code]true[/code] wenn die Länge der Zeichenkette [code]0[/code] ist." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -47902,6 +47926,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "Entfernt das Element der Arrays dessen Position übergeben wurde." + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -56953,7 +56985,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56993,15 +57026,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58489,11 +58523,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -68828,11 +68881,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -68912,8 +68965,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/el.po b/doc/translations/el.po index d3cbf69925..c7236b41df 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -9976,7 +9976,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10141,7 +10147,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28452,13 +28464,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29874,9 +29887,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30450,10 +30463,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30466,6 +30482,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45384,6 +45406,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54313,7 +54342,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54353,15 +54383,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55837,11 +55868,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65879,11 +65929,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65963,8 +66013,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/es.po b/doc/translations/es.po index e38eb521c0..50425a97d9 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -13142,8 +13142,14 @@ msgstr "" "escena." #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." -msgstr "El bus en el que se está reproduciendo este audio." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer.xml msgid "" @@ -13329,9 +13335,14 @@ msgstr "" "escena." #: doc/classes/AudioStreamPlayer3D.xml -#, fuzzy -msgid "The bus on which this audio is playing." -msgstr "El bus en el que se está reproduciendo este audio." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -37678,13 +37689,14 @@ msgstr "Número máximo de redirecciones permitidas." #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -39554,9 +39566,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" "Habilita o deshabilita la acumulación de eventos de entrada similares " "enviados por el sistema operativo. Cuando la acumulación de entrada está " @@ -40315,10 +40327,13 @@ msgstr "Tipo de evento de entrada para los eventos de movimiento del ratón." msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -40342,6 +40357,15 @@ msgid "Mouse and input coordinates" msgstr "Medio desplazamiento en la coordenada X." #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"Devuelve el número de disposiciones del teclado.\n" +"[b]Nota:[/b] Este método está implementado en Linux, macOS y Windows." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -60077,6 +60101,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "Cambia el byte en el Ãndice dado." +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "Elimina un elemento del array por indice." + #: doc/classes/PoolByteArray.xml #, fuzzy msgid "" @@ -71442,7 +71474,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -71482,15 +71515,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -73306,11 +73340,41 @@ msgstr "" #: doc/classes/Spatial.xml #, fuzzy +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" +"Parte de la rotación de la transformación local en radianes, especificada en " +"términos de ángulos YXZ-Euler en el formato (ángulo X, ángulo Y, ángulo Z).\n" +"[b]Nota:[/b] En el sentido matemático, la rotación es una matriz y no un " +"vector. Los tres ángulos de Euler, que son los tres parámetros " +"independientes de la parametrización del ángulo de Euler de la matriz de " +"rotación, se almacenan en una estructura de datos [Vector3] no porque la " +"rotación sea un vector, sino sólo porque el [Vector3] existe como una " +"estructura de datos conveniente para almacenar 3 números reales. Por lo " +"tanto, la aplicación de operaciones afines en el \"vector\" de rotación no " +"es significativa." + +#: doc/classes/Spatial.xml +#, fuzzy msgid "World space (global) [Transform] of this node." msgstr "World3D espacio (global) [Transform] de este nodo." #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -86302,11 +86366,11 @@ msgstr "" #, fuzzy msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -86430,8 +86494,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml #, fuzzy msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/fa.po b/doc/translations/fa.po index db8018d209..5f170b2b28 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -10399,7 +10399,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10564,7 +10570,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28847,13 +28859,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30267,9 +30280,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30843,10 +30856,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30859,6 +30875,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45744,6 +45766,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54672,7 +54701,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54712,15 +54742,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56196,11 +56227,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66217,11 +66267,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66301,8 +66351,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/fi.po b/doc/translations/fi.po index 9317c255a7..0ab098fd33 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -10049,7 +10049,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10214,7 +10220,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28535,13 +28547,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29957,9 +29970,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30533,10 +30546,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30549,6 +30565,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45469,6 +45491,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54398,7 +54427,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54438,15 +54468,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55923,11 +55954,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65972,11 +66022,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66056,8 +66106,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/fil.po b/doc/translations/fil.po index f7a8c0fd9b..2dabe612e9 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -9974,7 +9974,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10139,7 +10145,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28422,13 +28434,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29842,9 +29855,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30418,10 +30431,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30434,6 +30450,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45301,6 +45323,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54225,7 +54254,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54265,15 +54295,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55749,11 +55780,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65770,11 +65820,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65854,8 +65904,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 7b3d3c7435..9d5c5f4a01 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -61,7 +61,7 @@ msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-06 04:47+0000\n" +"PO-Revision-Date: 2022-07-18 08:12+0000\n" "Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" @@ -70,7 +70,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -8364,6 +8364,9 @@ msgid "" "Returns the number of inputs for the transition node with name [code]id[/" "code]. You can add inputs by right-clicking on the transition node." msgstr "" +"Retourne le nombre d'entrées pour le nÅ“ud de transition nommé [code]id[/" +"code]. Vous pouvez ajouter des entrées en faisant un clic droit sur le nÅ“ud " +"de transition." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8378,6 +8381,9 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" +"Retourne [code]true[/code] si l'entrée [code]input_idx[/code] du nÅ“ud de " +"transition nommé [code]id[/code] est définie pour avancer automatiquement " +"vers la prochaine entrée dès que la transition se termine." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8393,6 +8399,8 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" +"Le nÅ“ud de transition nommé [code]id[/code] avance à sa prochaine entrée " +"automatiquement lorsque l'entrée [code]input_idx[/code] se termine." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8490,6 +8498,10 @@ msgid "" "exiting. Can also alter or override local physics parameters (gravity, " "damping) and route audio to custom audio buses." msgstr "" +"La zone 3D qui détecte nÅ“uds [CollisionObject] qui se chevauchent, entrent " +"ou sortent. Peut également modifier ou surcharger les paramètres de physique " +"locale (gravité, amortissement) et passer l'audio à des bus audio " +"personnalisés." #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -8570,6 +8582,10 @@ msgid "" "See [member ProjectSettings.physics/3d/default_angular_damp] for more " "details about damping." msgstr "" +"La vitesse à laquelle les objets s'arrêtent de tourner dans cette zone. " +"Représente la vitesse angulaire perdue par seconde.\n" +"Voir [member ProjectSettings.physics/3d/default_angular_damp] pour plus de " +"détails sur l'amortissement." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "The name of the area's audio bus." @@ -8681,6 +8697,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Émis quand une autre Area entre dans cette zone. Nécessite [member " +"monitoring] d'être défini à [code]true[/code].\n" +"[code]area[/code] l'autre Area." #: doc/classes/Area.xml msgid "" @@ -8688,6 +8707,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Émis quand une autre Area quitte cette Area. Nécessite [member monitoring] " +"d'être défini à [code]true[/code].\n" +"[code]area[/code] l'autre Area." #: doc/classes/Area.xml msgid "" @@ -8855,6 +8877,14 @@ msgid "" "list is modified once during the physics step, not immediately after objects " "are moved. Consider using signals instead." msgstr "" +"Retourne la liste des intersections entre les [PhysiqueBody2D]. Le calque " +"[member CollisionObject2D.collision_layer] du corps entrant en intersection " +"doit être dans le masque [member CollisionObject2D.collision_mask] de ce " +"corps pour être détecté.\n" +"Pour des raisons de performance (les collisions sont toutes traitées en même " +"temps) cette liste est modifiée une fois pendant l'étape physique, pas " +"immédiatement après le déplacement des objets. Considérez plutôt " +"l'utilisation des signaux." #: doc/classes/Area2D.xml msgid "" @@ -8863,6 +8893,11 @@ msgid "" "For performance, the list of overlaps is updated once per frame and before " "the physics step. Consider using signals instead." msgstr "" +"Si [code]true[/code], la zone donnée recouvre la Area2D.\n" +"[b]Note :[/b] Le résultat de ce test n'est pas immédiat après le déplacement " +"des objets. Pour des raisons de performance, la liste des collisions est " +"mise à jour une fois par trame et avant l'étape physique. Considérez plutôt " +"l'utilisation des signaux." #: doc/classes/Area2D.xml msgid "" @@ -8913,6 +8948,10 @@ msgid "" "See [member ProjectSettings.physics/2d/default_linear_damp] for more details " "about damping." msgstr "" +"La vitesse à laquelle les objets arrêtent de se déplacer dans cette zone. " +"Représente la vitesse linéaire perdue par seconde.\n" +"Voir [member ProjectSettings.physics/2d/default_linear_damp] pour plus de " +"détails sur l'amortissement." #: doc/classes/Area2D.xml msgid "" @@ -8920,6 +8959,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Émis quand une autre Area2D entre dans cette Area2D. Nécessite [member " +"monitoring] d'être défini à [code]true[/code].\n" +"[code]area[/code] l'autre Area2D." #: doc/classes/Area2D.xml msgid "" @@ -8927,6 +8969,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Émis quand une autre Area2D quitte cette Area2D. Nécessite [member " +"monitoring] d'être défini à [code]true[/code].\n" +"[code]area[/code] l'autre Area2D." #: doc/classes/Area2D.xml msgid "" @@ -9858,7 +9903,7 @@ msgstr "" #: doc/classes/ArrayMesh.xml msgid "Will regenerate normal maps for the [ArrayMesh]." -msgstr "" +msgstr "Régénérera les cartes normales pour le [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "" @@ -9873,12 +9918,16 @@ msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Retourne la longueur des indices du tableau d'indices pour la surface " +"spécifiée (voir [method add_surface_from_arrays].)" #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Retourne la longueur des sommets du tableau des sommets dans la surface " +"spécifiée (voir [method add_surface_from_arrays].)" #: doc/classes/ArrayMesh.xml msgid "" @@ -9926,7 +9975,7 @@ msgstr "" #: doc/classes/ArrayMesh.xml msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." -msgstr "" +msgstr "Définit le mode de forme de mélange avec [enum Mesh.BlendShapeMode]" #: doc/classes/ArrayMesh.xml doc/classes/PrimitiveMesh.xml msgid "" @@ -10865,7 +10914,7 @@ msgid "" msgstr "" "Retourne l'horodatage absolu (en μs) de la dernière mise à jour des yeux AR/" "VR du [ARVRServer] envoyée au [VisualServer]. La valeur est récupérée via un " -"appel interne à [method OS.get_ticks_usec]" +"appel interne à [method OS.get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" @@ -10885,7 +10934,7 @@ msgid "" msgstr "" "Retourne l'horodatage absolu (en μs) du dernier appel de mise à jour du " "[ARVRServer]. La valeur vient est récupérée via un appel interne à [method " -"OS.get_ticks_usec]" +"OS.get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" @@ -11406,6 +11455,8 @@ msgid "" "Returns the capacity of the structure backing the points, useful in " "conjunction with [code]reserve_space[/code]." msgstr "" +"Retourne la capacité de la structure qui garde les points en cache, utile " +"avec [code]reserve_space[/code]." #: doc/classes/AStar.xml msgid "" @@ -11468,6 +11519,8 @@ msgid "" "Returns the weight scale of the point associated with the given [code]id[/" "code]." msgstr "" +"Retourne l'échelle de poids du point associé pour le [code]id[/code] " +"spécifié." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns an array of all points." @@ -11484,6 +11537,8 @@ msgid "" "Returns whether a point is disabled or not for pathfinding. By default, all " "points are enabled." msgstr "" +"Retourne si un point est désactivé ou non pour le calcul du chemin. Par " +"défaut, tous les points sont activés." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -11499,6 +11554,9 @@ msgid "" "you're adding a known large number of points at once, for a grid for " "instance. New capacity must be greater or equals to old capacity." msgstr "" +"Réserve l'espace interne pour [code]num_nodes[/code] points, utile si vous " +"voulez ajouter un grand nombre de points à la fois, pour une grille par " +"exemple. La nouvelle capacité doit être supérieure ou égale à l'ancienne." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -11859,6 +11917,9 @@ msgid "" "Limits the frequencies in a range around the [member AudioEffectFilter." "cutoff_hz] and allows frequencies outside of this range to pass." msgstr "" +"Limite l'intensité des fréquences dans la gamme autour de [member " +"AudioEffectFilter.cutoff_hz], et permet aux fréquences en dehors de cette " +"gamme de passer." #: doc/classes/AudioEffectBandPassFilter.xml msgid "Adds a band pass filter to the audio bus." @@ -11869,6 +11930,9 @@ msgid "" "Attenuates the frequencies inside of a range around the [member " "AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." msgstr "" +"Atténue les fréquences à l'intérieur de la gamme autour de [member " +"AudioEffectFilter.cutoff_hz] et coupe les fréquences en dehors de cette " +"gamme." #: doc/classes/AudioEffectCapture.xml msgid "Captures audio from an audio bus in real-time." @@ -12058,6 +12122,9 @@ msgid "" "Compressor's delay time to stop reducing the signal after the signal level " "falls below the threshold, in milliseconds. Value can range from 20 to 2000." msgstr "" +"Le retard du compresseur avant d'arrêter de réduire le signal après que le " +"niveau de signal sous le seuil, en millisecondes. La valeur peut aller de 20 " +"à 2000." #: doc/classes/AudioEffectCompressor.xml msgid "Reduce the sound level using another audio bus for threshold detection." @@ -12090,6 +12157,10 @@ msgid "" "echo. Delay effects range from a subtle echo effect to a pronounced blending " "of previous sounds with new sounds." msgstr "" +"Joue le signal d'entrée après une période de temps. Le signal retardé peut " +"être joué plusieurs fois pour créer un écho qui s'amortit dans le temps. Les " +"effets de retard vont d'un subtil écho à un mélange prononcé de sons " +"précédents avec les nouveaux sons." #: doc/classes/AudioEffectDelay.xml msgid "" @@ -12128,6 +12199,8 @@ msgid "" "Pan position for [code]tap1[/code]. Value can range from -1 (fully left) to " "1 (fully right)." msgstr "" +"La position gauche-droite pour [code]tap1[/code]. La valeur peut aller de -1 " +"(complètement à gauche) à 1 (complètement à droite)." #: doc/classes/AudioEffectDelay.xml msgid "If [code]true[/code], [code]tap2[/code] will be enabled." @@ -12146,6 +12219,8 @@ msgid "" "Pan position for [code]tap2[/code]. Value can range from -1 (fully left) to " "1 (fully right)." msgstr "" +"La position gauche-droite pour [code]tap2[/code]. La valeur peut aller de -1 " +"(complètement à gauche) à 1 (complètement à droite)." #: doc/classes/AudioEffectDistortion.xml msgid "" @@ -12488,15 +12563,22 @@ msgid "" "Attenuates frequencies in a narrow band around the [member AudioEffectFilter." "cutoff_hz] and cuts frequencies outside of this range." msgstr "" +"Atténue les fréquences dans une bande étroite autour du [member " +"AudioEffectFilter.cutoff_hz] et coupe les fréquences en dehors de cette " +"gamme." #: doc/classes/AudioEffectPanner.xml msgid "Adds a panner audio effect to an Audio bus. Pans sound left or right." msgstr "" +"Ajoute un effet audio de balance à un bus audio. Balance les sons à gauche " +"ou à droite." #: doc/classes/AudioEffectPanner.xml msgid "" "Determines how much of an audio signal is sent to the left and right buses." msgstr "" +"Détermine quelle quantité d'un signal audio est envoyé aux bus de gauche et " +"de droite." #: doc/classes/AudioEffectPanner.xml msgid "Pan position. Value can range from -1 (fully left) to 1 (fully right)." @@ -12510,6 +12592,9 @@ msgid "" "Combines the original signal with a copy that is slightly out of phase with " "the original." msgstr "" +"Ajoute un effet audio de phaseur à un bus audio.\n" +"Combine le signal original avec une copie de l'original légèrement hors " +"phase." #: doc/classes/AudioEffectPhaser.xml msgid "" @@ -13334,8 +13419,14 @@ msgstr "" "scènes." #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." -msgstr "Bus sur lequel cet audio joue." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer.xml msgid "" @@ -13548,8 +13639,14 @@ msgstr "" "ajouté à la scène." #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." -msgstr "Le bus sur lequel cet audio est joué." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -13585,7 +13682,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "Sets the absolute maximum of the soundlevel, in decibels." -msgstr "" +msgstr "Définit le maximum absolu du niveau sonore, en décibels." #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -13617,13 +13714,15 @@ msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "The base sound level unaffected by dampening, in decibels." -msgstr "" +msgstr "Le niveau sonore de base non affecté par l'amortissement, en décibels." #: doc/classes/AudioStreamPlayer3D.xml msgid "" "The factor for the attenuation effect. Higher values make the sound audible " "over a larger distance." msgstr "" +"Le facteur pour l'effet d'atténuation. Des valeurs plus élevées rendent le " +"son audible sur une distance plus grande." #: doc/classes/AudioStreamPlayer3D.xml msgid "Linear dampening of loudness according to distance." @@ -13654,6 +13753,10 @@ msgid "" "but keeps the sound playing at the correct position if the camera leaves and " "enters the [AudioStreamPlayer3D]'s [member max_distance] radius." msgstr "" +"Mélanger ce son, même lorsqu'il est hors de portée. Cela augmente " +"l'utilisation de CPU, mais garde le son à la bonne position de lecture si la " +"caméra quitte puis entre à nouveau dans le rayon [member max_distance] du " +"[AudioStreamPlayer3D]." #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -13661,6 +13764,9 @@ msgid "" "will cause the sound to restart if the camera leaves and enters the " "[AudioStreamPlayer3D]'s [member max_distance] radius." msgstr "" +"Pause ce son quand il hors de portée. Cela diminue l'utilisation du CPU, " +"mais cela fera redémarrer le son si la caméra quitte puis entre dans le " +"rayon [member max_distance] du [AudioStreamPlayer3D]." #: doc/classes/AudioStreamPlayer3D.xml msgid "Disables doppler tracking." @@ -14057,6 +14163,8 @@ msgid "" "Deprecated, in previous versions it determined the location where lightmaps " "were be saved." msgstr "" +"Obsolète, dans les versions précédentes ça déterminait l'emplacement où les " +"textures de lumière étaient enregistrées." #: doc/classes/BakedLightmap.xml msgid "The calculated light data." @@ -14094,6 +14202,15 @@ msgid "" "lightmap banding even when using the GLES2 backend or if [member " "ProjectSettings.rendering/quality/depth/hdr] is [code]false[/code]." msgstr "" +"Si [code]true[/code], enregistre les textures de lumière dans un format de " +"plage dynamique élevée (type EXR). Si [code]false[/code], enregistre les " +"textures de lumière dans une image PNG de plage dynamique faible. Ceci peut " +"être défini à [code]false[/code] pour réduire l'usage du disque, mais les " +"valeurs lumineuses supérieures à 1.0 seront limitées et vous pouvez voir un " +"effet de bandes qui apparaissent à cause de cette précision réduite.\n" +"[b]Note :[/b] Définir [member use_hdr] à [code]true[/code] réduira l'effet " +"de bandes même sous GLES2 ou quand [member ProjectSettings.rendering/quality/" +"depth/hdr] est [code]false[/code]." #: doc/classes/BakedLightmap.xml msgid "The lowest bake quality mode. Fastest to calculate." @@ -14120,6 +14237,9 @@ msgid "" "Returns if no viable save path is found. This can happen where an [member " "image_path] is not specified or when the save location is invalid." msgstr "" +"Retourne si aucun chemin d'enregistrement invalid n'est trouvé. Cela peut se " +"produire lorsqu'un [member image_path] n'est pas spécifié ou lorsque " +"l'emplacement de sauvegarde est invalide." #: doc/classes/BakedLightmap.xml doc/classes/SpatialMaterial.xml msgid "Currently unused." @@ -14342,6 +14462,8 @@ msgid "" "If [code]true[/code], the button is in toggle mode. Makes the button flip " "state between pressed and unpressed each time its area is clicked." msgstr "" +"Si [code]true[/code], le bouton est en mode basculement. Fait basculer le " +"bouton entre les états pressé et non-pressé chaque fois qu'il est cliqué." #: doc/classes/BaseButton.xml msgid "Emitted when the button starts being held down." @@ -14359,6 +14481,11 @@ msgid "" "If you need to know the button's pressed state (and [member toggle_mode] is " "active), use [signal toggled] instead." msgstr "" +"Émis quand le bouton est basculé ou pressé. Émis lors de [signal " +"button_down] si [member action_mode] est [constant ACTION_MODE_BUTTON_PRESS] " +"et lors de [signal button_up] sinon.\n" +"Si vous avez besoin de connaître l'état du bouton (et que [member " +"toggle_mode] est actif), utilisez plutôt [signal toggled]." #: doc/classes/BaseButton.xml msgid "" @@ -14366,6 +14493,9 @@ msgid "" "(only if [member toggle_mode] is active). The new state is contained in the " "[code]button_pressed[/code] argument." msgstr "" +"Émis lorsque le bouton a été juste basculé entre les états pressé et normal " +"(seulement si [member toggle_mode] est actif). Le nouvel état est passé dans " +"l'argument [code]button_pressed[/code]." #: doc/classes/BaseButton.xml msgid "" @@ -14606,6 +14736,10 @@ msgid "" "[b]Note:[/b] This results in a multiplication by the inverse of the matrix " "only if it represents a rotation-reflection." msgstr "" +"Retourne un vecteur transformé (multiplié) par la matrice de base " +"transposée.\n" +"[b]Note :[/b] Cela entraîne une multiplication par l'inverse de la matrice " +"seulement si elle représente une rotation-réflexion." #: doc/classes/Basis.xml doc/classes/Transform2D.xml msgid "" @@ -14772,6 +14906,10 @@ msgid "" "Supports distance fields. For using vector font files like TTF directly, see " "[DynamicFont]." msgstr "" +"Rend le texte en utilisant les atlas des texture contenues dans le fichier " +"[code]*.fnt[/code]. Supporte les champs de distance. Pour utiliser " +"directement des fichiers de police vectorielles, comme le TTF, voir " +"[DynamicFont]." #: doc/classes/BitmapFont.xml msgid "" @@ -14781,6 +14919,11 @@ msgid "" "alignment for the character and [code]advance[/code] is the (optional) " "advance." msgstr "" +"Ajoute un caractère à la police, où [code]character[/code] est la valeur " +"Unicode, [code]texture[/code] est l'index de la texture, [code]rect[/code] " +"est la région de la texture (en pixels !), [code]align[/code] est " +"l'alignement (optionnel) du caractère et [code]advance[/code] est " +"l'avancement (optionnel)." #: doc/classes/BitmapFont.xml msgid "" @@ -14851,6 +14994,17 @@ msgid "" "menu option, from the code, you need to iterate over the bones to set their " "individual rest poses." msgstr "" +"Utilise une hiérarchie [code]Bone2D[/code] liée à un [Skeleton2D] pour " +"contrôler et animer d'autres nÅ“uds [Node2D].\n" +"Vous pouvez utiliser les nÅ“uds [code]Bone2D[/code] et [code]Skeleton2D[/" +"code] pour animer les maillages 2D créées avec l'éditeur d'UV de Polygon " +"2D.\n" +"Chaque os a une transformation de repos [member rest] que vous pouvez " +"réinitialiser avec [method apply_rest]. Ces poses de repos sont par rapport " +"au parent de l'os.\n" +"Si dans l'éditeur vous pouvez définir la pose de repos d'un squelette entier " +"en utilisant une option de menu, à partir du code, vous devez itérer sur les " +"os pour définir leurs poses de repos individuelles." #: doc/classes/Bone2D.xml msgid "Stores the node's current transforms in [member rest]." @@ -15439,6 +15593,9 @@ msgid "" "[b]Note:[/b] A position which returns [code]false[/code] may still be " "outside the camera's field of view." msgstr "" +"Retourne [code]true[/code] si la position donnée est derrière la caméra.\n" +"[b]Note :[/b] Une position qui retourne [code]false[/code] peut quand même " +"être en dehors du champ de vision de la caméra." #: doc/classes/Camera.xml msgid "" @@ -15446,6 +15603,10 @@ msgid "" "description). If the camera node is outside the scene tree, it will attempt " "to become current once it's added." msgstr "" +"Fait que cette caméra devient l'actuelle pour le [Viewport] (voir la " +"description de la classe). Si le nÅ“ud de la caméra est en dehors de " +"l'arborescence de la scène, il tentera de devenir l'actuel dès qu'il sera " +"ajouté." #: doc/classes/Camera.xml msgid "" @@ -15460,6 +15621,9 @@ msgid "" "the [Viewport] rectangle on a plane that is the given [code]z_depth[/code] " "distance into the scene away from the camera." msgstr "" +"Retourne le point 3D dans l'espace global qui correspond à la coordonnées 2D " +"donnée dans le rectangle du [Viewport] sur un plan qui est à la distance " +"[code]z_depth[/code] donnée dans la scène par rapport à la caméra." #: doc/classes/Camera.xml msgid "" @@ -15468,6 +15632,10 @@ msgid "" "useful for casting rays in the form of (origin, normal) for object " "intersection or picking." msgstr "" +"Retourne la normale dans l'espace global, qui est le résultat de la " +"projection d'un point sur le rectangle [Viewport] par la projection inverse " +"de la caméra. Ceci est utile pour lancer des rayons sous la forme (origine, " +"normale) pour l'intersection ou la sélection d'objets." #: doc/classes/Camera.xml msgid "" @@ -15476,6 +15644,10 @@ msgid "" "useful for casting rays in the form of (origin, normal) for object " "intersection or picking." msgstr "" +"Retourne la position 3D dans l'espace global, qui est le résultat de " +"projeter un point sur le rectangle [Viewport] par la projection inverse de " +"la caméra. Ceci est utile pour lancer des rayons sous la forme (origine, " +"normale) pour l'intersection ou la sélection d'objets." #: doc/classes/Camera.xml msgid "" @@ -15620,6 +15792,8 @@ msgid "" "The axis to lock during [member fov]/[member size] adjustments. Can be " "either [constant KEEP_WIDTH] or [constant KEEP_HEIGHT]." msgstr "" +"L'axe à verrouiller pendant les réglages [member fov] ou [member size]. Peut " +"être soit [constant KEEP_WIDTH] ou [constant KEEP_HEIGHT]." #: doc/classes/Camera.xml msgid "" @@ -15633,6 +15807,9 @@ msgid "" "objects' Z distance from the camera's local space scales their perceived " "size." msgstr "" +"Le mode de projection de la caméra. Dans le mode [constant " +"PROJECTION_PERSPECTIVE], la distance des objets dans l'espace local de la " +"caméra détermine la taille apparante de ces objets." #: doc/classes/Camera.xml msgid "" @@ -15640,6 +15817,10 @@ msgid "" "orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " "[code]size[/code] sets the other axis' size length." msgstr "" +"La taille de la caméra mesurée comme la moitié de la largeur ou de la " +"hauteur. N'est applicable qu'en modes orthogonal et frustum. Comme [member " +"keep_aspect] verrouille l'axe, [code]size[/code] fixe la longueur de la " +"taille sur l'autre axe." #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -15658,6 +15839,9 @@ msgid "" "Orthogonal projection, also known as orthographic projection. Objects remain " "the same size on the screen no matter how far away they are." msgstr "" +"La projection orthogonale, également connue sous le nom de projection " +"orthographique. Les objets gardent la même taille à l'écran, indépendamment " +"de leur distance." #: doc/classes/Camera.xml msgid "" @@ -15678,6 +15862,10 @@ msgid "" "usually the best option for projects running in landscape mode, as wider " "aspect ratios will automatically benefit from a wider horizontal FOV." msgstr "" +"Préserve le rapport d'aspect vertical ; également connu sous le nom " +"d'échelle Hor+. C'est généralement la meilleure option pour les projets en " +"mode paysage, car les ratios d'aspect plus larges bénéficieront " +"automatiquement d'un champ de vision horizontal plus large." #: doc/classes/Camera.xml msgid "" @@ -15778,6 +15966,11 @@ msgid "" "or [member Node2D.global_position], as it is affected by the [code]drag[/" "code] properties." msgstr "" +"Retourne la [code]position[/code] de la caméra (le point suivi que la caméra " +"essaye de suivre), par rapport à l'origine.\n" +"[b]Note :[/b] La valeur retournée n'est pas la même que [member Node2D." +"position] ou [member Node2D.global_position], car elle est aussi affectée " +"par les propriétés [code]drag[/code]." #: doc/classes/Camera2D.xml msgid "" @@ -15786,12 +15979,18 @@ msgid "" "[b]Note:[/b] The real [code]position[/code] of the camera may be different, " "see [method get_camera_position]." msgstr "" +"Retourne l'emplacement du centre de l'écran de la [Camera2D], par rapport à " +"l'origine.\n" +"[b]Note :[/b] La véritable [code]position[/code] de la caméra peut être " +"différente, voir [method get_camera_position]." #: doc/classes/Camera2D.xml msgid "" "Returns the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" +"Retourne la marge spécifiée. Voir aussi [member drag_margin_bottom], [member " +"drag_margin_top], [member drag_margin_left], et [member drag_margin_right]." #: doc/classes/Camera2D.xml msgid "" @@ -15862,24 +16061,36 @@ msgid "" "drag margins. If [code]false[/code], the camera moves horizontally " "regardless of margins." msgstr "" +"Si [code]true[/code], la caméra ne bouge que lorsqu'elle atteint les marges " +"horizontales de glissage. Si [code]false[/code], la caméra se déplace " +"horizontalement indépendamment des marges." #: doc/classes/Camera2D.xml msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" +"La marge gauche nécessaire pour pour glisser la caméra. Une valeur de " +"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " +"l'écran." #: doc/classes/Camera2D.xml msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" +"La marge droite nécessaire pour pour glisser la caméra. Une valeur de " +"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " +"l'écran." #: doc/classes/Camera2D.xml msgid "" "Top margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" +"La marge supérieure nécessaire pour pour glisser la caméra. Une valeur de " +"[code]1[/code] ne déplacer la caméra que lorsqu'elle atteint le bord de " +"l'écran." #: doc/classes/Camera2D.xml msgid "" @@ -15887,16 +16098,23 @@ msgid "" "margins. If [code]false[/code], the camera moves vertically regardless of " "margins." msgstr "" +"Si [code]true[/code], la caméra ne bouge que lorsqu'elle atteint les marges " +"verticales de glissage. Si [code]false[/code], la caméra se déplace " +"verticalement indépendamment des marges." #: doc/classes/Camera2D.xml msgid "" "If [code]true[/code], draws the camera's drag margin rectangle in the editor." msgstr "" +"Si [code]true[/code], dessine le rectangle de la marge de glissage de la " +"caméra activée dans l'éditeur." #: doc/classes/Camera2D.xml msgid "" "If [code]true[/code], draws the camera's limits rectangle in the editor." msgstr "" +"Si [code]true[/code], dessine le rectangle des limites de la caméra activée " +"dans l'éditeur." #: doc/classes/Camera2D.xml msgid "" @@ -15966,12 +16184,19 @@ msgid "" "not updated in any way if drag margins are enabled and can be used to set " "initial offset." msgstr "" +"Le décalage horizontal de la caméra, par rapport aux marges de glissage.\n" +"[b]Note :[/b] Le décalage H est utilisé uniquement pour forcer le décalage " +"par rapport aux marges. Elle n'est pas mise à jour même si les marges de " +"glissage sont activées et peuvent être utilisées pour régler le décalage " +"initial." #: doc/classes/Camera2D.xml msgid "" "The vertical offset of the camera, relative to the drag margins.\n" "[b]Note:[/b] Used the same as [member offset_h]." msgstr "" +"Le décalage vertical de la caméra, par rapport aux marges de glissage.\n" +"[b]Note :[/b] Utilisé de la même manière que [member offset_h]." #: doc/classes/Camera2D.xml msgid "The camera's process callback. See [enum Camera2DProcessMode]." @@ -16202,6 +16427,10 @@ msgid "" "[b]Note:[/b] Many cameras supply YCbCr images which need to be converted in " "a shader." msgstr "" +"Cette texture donne accès à la texture de la caméra fournie par " +"[CameraFeed].\n" +"[b]Note :[/b] Beaucoup de caméras fournissent des images au format YCbCr qui " +"doivent être converties dans un shader." #: doc/classes/CameraTexture.xml msgid "The ID of the [CameraFeed] for which we want to display the image." @@ -16212,13 +16441,15 @@ msgstr "" msgid "" "Convenience property that gives access to the active property of the " "[CameraFeed]." -msgstr "" +msgstr "Propriété utile qui donne accès à la propriété active du [CameraFeed]." #: doc/classes/CameraTexture.xml msgid "" "Which image within the [CameraFeed] we want access to, important if the " "camera image is split in a Y and CbCr component." msgstr "" +"L'image du [CameraFeed] pour laquelle nous voulons accéder, important si " +"l'image de la caméra est divisée en composants Y et CbCr." #: doc/classes/CanvasItem.xml msgid "Base class of anything 2D." @@ -16880,6 +17111,8 @@ msgid "" "The color applied to textures on this [CanvasItem]. This is not inherited by " "children [CanvasItem]s." msgstr "" +"La couleur appliquée aux textures sur ce [CanvasItem]. Cela n'est pas hérité " +"pour les [CanvasItem] enfants." #: doc/classes/CanvasItem.xml msgid "If [code]true[/code], the object draws behind its parent." @@ -16934,7 +17167,7 @@ msgid "" msgstr "" "Émis quand la position ou la taille du [Rect2] a changé, ou lorsqu'une " "action a changé ces valeurs là (par exemple en changeant [member Sprite." -"texture])" +"texture])." #: doc/classes/CanvasItem.xml msgid "Emitted when the visibility (hidden/visible) changes." @@ -16945,6 +17178,8 @@ msgid "" "Mix blending mode. Colors are assumed to be independent of the alpha " "(opacity) value." msgstr "" +"Le mode de mélange. Les couleurs sont supposées être indépendantes de " +"l'opacité." #: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml msgid "Additive blending mode." @@ -16963,6 +17198,8 @@ msgid "" "Mix blending mode. Colors are assumed to be premultiplied by the alpha " "(opacity) value." msgstr "" +"Le mode de mélange. Les couleurs sont supposées être prémultipliées par leur " +"opacité." #: doc/classes/CanvasItem.xml msgid "" @@ -16976,12 +17213,16 @@ msgid "" "The [CanvasItem]'s global transform has changed. This notification is only " "received if enabled by [method set_notify_transform]." msgstr "" +"La transformation globale du [CanvasItem] a changé. Cette notification n'est " +"reçue que si elle est activée par [method set_notify_transform]." #: doc/classes/CanvasItem.xml msgid "" "The [CanvasItem]'s local transform has changed. This notification is only " "received if enabled by [method set_notify_local_transform]." msgstr "" +"La transformation locale [CanvasItem] a changé. Cette notification n'est " +"reçue que si elle est activée par [method set_notify_local_transform]." #: doc/classes/CanvasItem.xml msgid "The [CanvasItem] is requested to draw." @@ -17728,12 +17969,17 @@ msgid "" "Returns the value of the integer constant [code]name[/code] of [code]class[/" "code] or its ancestry. Always returns 0 when the constant could not be found." msgstr "" +"Retourne la valeur de la constante entière nommée [code]name[/code] dans " +"[code]class[/code] ou un de ses parents. Retourne toujours 0 si la constante " +"n'a pas été trouvée." #: doc/classes/ClassDB.xml msgid "" "Returns which enum the integer constant [code]name[/code] of [code]class[/" "code] or its ancestry belongs to." msgstr "" +"Retourne à quelle énumération la constante entière nommée [code]name[/code] " +"dans [code]class[/code] ou un de ses parents." #: doc/classes/ClassDB.xml msgid "" @@ -17825,6 +18071,9 @@ msgid "" "Returns whether [code]class[/code] (or its ancestry if [code]no_inheritance[/" "code] is [code]false[/code]) has a method called [code]method[/code] or not." msgstr "" +"Retourne si [code]class[/code] (ou un de ses parents si " +"[code]no_inheritance[/code] est [code]false[/code]) a une méthode nommée " +"[code]method[/code] ou non." #: doc/classes/ClassDB.xml msgid "" @@ -17850,6 +18099,8 @@ msgid "" "Returns the names of all the classes that directly or indirectly inherit " "from [code]class[/code]." msgstr "" +"Retourne le nom de toutes les classes qui héritent directement ou " +"indirectement de [code]class[/code]." #: doc/classes/ClassDB.xml msgid "Returns the parent class of [code]class[/code]." @@ -17880,6 +18131,9 @@ msgid "" "This node extends [Camera] to add collisions with [Area] and/or " "[PhysicsBody] nodes. The camera cannot move through colliding objects." msgstr "" +"Ce nÅ“ud étend [Camera] pour ajouter des collisions avec des nÅ“uds [Area] et/" +"ou [PhysicsBody]. La caméra ne peut pas passer à travers les objets avec " +"lesquels elle rentre en collision." #: doc/classes/ClippedCamera.xml msgid "" @@ -18172,6 +18426,10 @@ msgid "" "the mouse pointer entering/leaving, and if the mouse is inside it, report " "input events. Requires at least one [member collision_layer] bit to be set." msgstr "" +"Si [code]true[/code], cet objet peut être sélectionné. Ces objets peuvent " +"détecter l'entrée/la sortie du pointeur de la souris sur eux, et si la " +"souris pointe sur l'objet, signaler par des événements d'entrée. Nécessite " +"au moins un bit de [member collision_layer] d'être réglé." #: doc/classes/CollisionObject.xml msgid "" @@ -18227,6 +18485,10 @@ msgid "" "[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " "these events." msgstr "" +"Accepte les [InputEvent] non traités. Nécessite [member input_pickable] " +"d'être à [code]true[/code]. [code]shape_idx[/code] est l'index de la " +"[Shape2D] enfant. Connectez-vous au signal [code]input_event[/code] pour " +"récupérer facilement ces événements." #: doc/classes/CollisionObject2D.xml msgid "" @@ -18242,6 +18504,9 @@ msgid "" "this [CollisionObject2D] will not be reported to collided with " "[CollisionObject2D]s." msgstr "" +"Retourne [code]true[/code] si les collisions pour le propriétaire de forme " +"venant de ce [CollisionObject2D] ne seront pas signalées aux " +"[CollisionObject2D] entrants en collision." #: doc/classes/CollisionObject2D.xml msgid "Adds a [Shape2D] to the shape owner." @@ -18250,12 +18515,16 @@ msgstr "Ajoute un [Shape2D] au propriétaire de la forme." #: doc/classes/CollisionObject2D.xml msgid "Returns the [Shape2D] with the given id from the given shape owner." msgstr "" +"Retourne la [Shape2D] avec l'identifiant donné du propriétaire donné de la " +"forme." #: doc/classes/CollisionObject2D.xml msgid "" "Returns the child index of the [Shape2D] with the given id from the given " "shape owner." msgstr "" +"Retourne l'indice de enfant du [Shape2D] avec l'identifiant donné du " +"propriétaire donné de forme." #: doc/classes/CollisionObject2D.xml msgid "Returns the shape owner's [Transform2D]." @@ -18267,12 +18536,17 @@ msgid "" "originating from this [CollisionObject2D] will not be reported to collided " "with [CollisionObject2D]s." msgstr "" +"Si [code]enable[/code] est [code]true[/code], les collisions pour le " +"propriétaire de forme original de ce [CollisionObject2D] ne seront pas " +"rapportées aux [CollisionObject2D] entrant en collision." #: doc/classes/CollisionObject2D.xml msgid "" "Sets the [code]one_way_collision_margin[/code] of the shape owner identified " "by given [code]owner_id[/code] to [code]margin[/code] pixels." msgstr "" +"Définit la marge [code]one_way_collision_margin[/code] du propriétaire de la " +"forme identifié par [code]owner_id[/code] à [code]margin[/code] pixels." #: doc/classes/CollisionObject2D.xml msgid "Sets the [Transform2D] of the given shape owner." @@ -18359,12 +18633,20 @@ msgid "" "editor. It will not appear in the scene tree at run-time. Creates a [Shape] " "for gameplay. Properties modified during gameplay will have no effect." msgstr "" +"Permet d'éditer des sommets de collision sur un plan sélectionné. Peut " +"également définir une profondeur perpendiculaire à ce plan. Cette classe " +"n'est disponible que dans l'éditeur. Elle n'apparaîtra pas dans " +"l'arborescence de la scène quand le jeu est lancé. Crée une [Shape] pour les " +"mécaniques de jeu. Les propriétés modifiées une fois le jeu lancé n'auront " +"aucun effet." #: doc/classes/CollisionPolygon.xml msgid "" "Length that the resulting collision extends in either direction " "perpendicular to its polygon." msgstr "" +"La longueur que la collision résultante s'étend dans la direction " +"perpendiculaire à son polygone." #: doc/classes/CollisionPolygon.xml msgid "If [code]true[/code], no collision will be produced." @@ -18375,6 +18657,8 @@ msgid "" "The collision margin for the generated [Shape]. See [member Shape.margin] " "for more details." msgstr "" +"La marge de collision pour la [Shape] générée. Voir [member Shape.margin] " +"pour plus d'informations." #: doc/classes/CollisionPolygon.xml msgid "" @@ -18385,6 +18669,12 @@ msgid "" "temporary variable and make changes before reassigning the [code]polygon[/" "code] member." msgstr "" +"Un tableau de sommets qui définissent le polygone.\n" +"[b]Note :[/b] La valeur retournée est une copie de l'original. Les méthodes " +"qui modifie la taille ou les propriétés de la valeur de retour n'affecteront " +"pas le polygone d'origine. Pour modifier les propriétés du polygone, " +"assignez-le à une variable temporaire et faites des changements avant de le " +"réassigner au membre [code]polygon[/code]." #: doc/classes/CollisionPolygon2D.xml msgid "Defines a 2D collision polygon." @@ -18395,10 +18685,14 @@ msgid "" "Provides a 2D collision polygon to a [CollisionObject2D] parent. Polygons " "can be drawn in the editor or specified by a list of vertices." msgstr "" +"Fournit un polygone de collision 2D à un parent [CollisionObject2D]. Les " +"polygones peuvent être dessinés manuellement dans l'éditeur ou spécifiés par " +"une liste de sommets." #: doc/classes/CollisionPolygon2D.xml msgid "Collision build mode. Use one of the [enum BuildMode] constants." msgstr "" +"Le mode d'assemblage. Utilisez l'une des constantes de [enum BuildMode]." #: doc/classes/CollisionPolygon2D.xml msgid "If [code]true[/code], no collisions will be detected." @@ -18411,6 +18705,11 @@ msgid "" "[b]Note:[/b] This property has no effect if this [CollisionPolygon2D] is a " "child of an [Area2D] node." msgstr "" +"Si [code]true[/code], seuls les bords qui font face, par rapport à la " +"rotation du [CollisionPolygon2D], entreront en collision avec d'autres " +"objets.\n" +"[b]Note :[/b] Cette propriété n'a aucun effet si cette [CollisionPolygon2D] " +"est un enfant d'un nÅ“ud [Area2D]." #: doc/classes/CollisionPolygon2D.xml msgid "" @@ -18418,6 +18717,9 @@ msgid "" "the shape thicker, and work better for colliders that enter the polygon at a " "high velocity." msgstr "" +"La marge (en pixels) utilisée pour une collision à sens unique. Des valeurs " +"plus élevées rendront la forme plus épaisse, et fonctionneront mieux pour " +"les objets entrant en collision quand ils vont à une vitesse élevée." #: doc/classes/CollisionPolygon2D.xml msgid "" @@ -19622,11 +19924,18 @@ msgid "" "in the color picker and the user will be able to select them.\n" "[b]Note:[/b] The presets list is only for [i]this[/i] color picker." msgstr "" +"Ajoute la couleur donnée à une liste de pré-réglages de couleur. Les pré-" +"réglages sont affichés dans le sélectionneur de couleurs que l'utilisateur " +"pourra sélectionner.\n" +"[b]Note :[/b] La liste des pré-réglages est seulement pour [i]ce[/i] " +"sélectionneur de couleur." #: doc/classes/ColorPicker.xml msgid "" "Removes the given color from the list of color presets of this color picker." msgstr "" +"Retire la couleur donnée de la liste des pré-réglages de couleur de ce " +"sélectionneur de couleur." #: doc/classes/ColorPicker.xml msgid "Returns the list of colors in the presets of the color picker." @@ -19643,6 +19952,10 @@ msgid "" "mouse button, otherwise it will apply immediately even in mouse motion event " "(which can cause performance issues)." msgstr "" +"Si [code]true[/code], la couleur ne s'appliquera que quand l'utilisateur " +"relâche le bouton de la souris, sinon elle s'appliquera immédiatement en " +"suivant le déplacement de la souris (ce qui peut causer des problèmes de " +"performance)." #: doc/classes/ColorPicker.xml #, fuzzy @@ -19655,6 +19968,9 @@ msgid "" "sliders.\n" "[b]Note:[/b] Cannot be enabled if raw mode is on." msgstr "" +"Si [code]true[/code], permet de modifier la couleur avec des curseurs teinte/" +"saturation/valeur.\n" +"[b]Note :[/b] Ne peut être activé si le mode brut est activé." #: doc/classes/ColorPicker.xml msgid "If [code]true[/code], the \"add preset\" button is enabled." @@ -19722,10 +20038,12 @@ msgid "" "The indicator used to signalize that the color value is outside the 0-1 " "range." msgstr "" +"L'indicateur utilisé pour signaler que la valeur de couleur est en dehors de " +"l'intervalle 0-1." #: doc/classes/ColorPicker.xml msgid "The icon for the screen color picker button." -msgstr "" +msgstr "L'icône pour le bouton de sélecteur de couleurs." #: doc/classes/ColorPickerButton.xml msgid "Button that pops out a [ColorPicker]." @@ -20161,18 +20479,25 @@ msgid "" "Deletes the specified section along with all the key-value pairs inside. " "Raises an error if the section does not exist." msgstr "" +"Supprime la section spécifiée ainsi que toutes ses paires valeur-clé avec. " +"Affiche une erreur si la section n'existe pas." #: doc/classes/ConfigFile.xml msgid "" "Deletes the specified key in a section. Raises an error if either the " "section or the key do not exist." msgstr "" +"Supprime la clé spécifiée dans une section. Affiche une erreur si la section " +"ou la clé n'existe pas." #: doc/classes/ConfigFile.xml msgid "" "Returns an array of all defined key identifiers in the specified section. " "Raises an error and returns an empty array if the section does not exist." msgstr "" +"Retourne un tableau de tous les identifiants des clés définis dans la " +"section spécifiée. Affiche une erreur et retourne un tableau vide si la " +"section n'existe pas." #: doc/classes/ConfigFile.xml msgid "Returns an array of all defined section identifiers." @@ -20185,6 +20510,10 @@ msgid "" "[code]default[/code] value. If [code]default[/code] is not specified or set " "to [code]null[/code], an error is also raised." msgstr "" +"Retourne l'actuelle valeur pour la section et la clé spécifiées. Si la " +"section ou la clé n'existent pas, la méthode retourne la valeur du paramètre " +"[code]default[/code]. Si [code]default[/code] n'est pas spécifié ou défini à " +"[code]null[/code], une erreur est affichée." #: doc/classes/ConfigFile.xml msgid "Returns [code]true[/code] if the specified section exists." @@ -20202,6 +20531,10 @@ msgid "" "on.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" +"Charge le fichier de configuration spécifié en paramètre. Le contenu du " +"fichier est interprété et chargé dans l'objet [ConfigFile] sur lequel la " +"méthode a été appelée.\n" +"Retourne un des codes [enum Error] ([code]OK[/code] en cas de succès)." #: doc/classes/ConfigFile.xml msgid "" @@ -20210,6 +20543,11 @@ msgid "" "the [ConfigFile] object which the method was called on.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" +"Charge le fichier de configuration crypté spécifié en paramètre, en " +"utilisant la clé [code]key[/code] fournie pour le décrypter. Le contenu du " +"fichier est interprété et chargé dans l'objet [ConfigFile] sur lequel la " +"méthode a été appelée.\n" +"Retourne un des codes [enum Error] ([code]OK[/code] en cas de succès)." #: doc/classes/ConfigFile.xml msgid "" @@ -20279,6 +20617,10 @@ msgid "" "code] value deletes the specified key if it exists, and deletes the section " "if it ends up empty once the key has been removed." msgstr "" +"Attribue une valeur à la clé spécifiée de la section spécifiée. Si la " +"section ou la clé n'existe pas, elles sont créées. Passer une valeur " +"[code]null[/code] supprime la clé spécifiée si elle existe, et supprime la " +"section si elle est vide une fois que la clé a été supprimée." #: doc/classes/ConfirmationDialog.xml msgid "Dialog for confirmation of actions." @@ -20309,6 +20651,10 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne le bouton annuler.\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud interne requis, le retirer et le " +"libérer peut causer un plantage. Si vous voulez le cacher lui ou un de ses " +"enfants, utilisez la propriété [member CanvasItem.visible]." #: doc/classes/Container.xml msgid "Base node for containers." @@ -20320,18 +20666,26 @@ msgid "" "automatically arranges them in a certain way.\n" "A Control can inherit this to create custom container classes." msgstr "" +"Le nÅ“ud de base pour les conteneurs. Un [Container] contient d'autres " +"contrôles et les arrange automatiquement d'une certaine manière.\n" +"Un Control peut en hériter pour créer des classes de conteneur qui arrange " +"les contrôles enfants de manière personnalisée." #: doc/classes/Container.xml msgid "" "Fit a child control in a given rect. This is mainly a helper for creating " "custom container classes." msgstr "" +"Ajuste un contrôle enfant dans un rectangle donné. Il s'agit principalement " +"d'une aide pour créer des classes de conteneurs personnalisées." #: doc/classes/Container.xml msgid "" "Queue resort of the contained children. This is called automatically anyway, " "but can be called upon request." msgstr "" +"Ajoute un commande de tri pour les contrôles enfants. Ceci est appelé " +"automatiquement de tous les cas, mais peut être appelé sur demande." #: doc/classes/Container.xml msgid "Emitted when sorting the children is needed." @@ -20341,12 +20695,17 @@ msgstr "Émis quand le tri des enfants est nécessaire." msgid "" "Notification for when sorting the children, it must be obeyed immediately." msgstr "" +"La notification pour le tri des enfants, à laquelle faut l'obéir " +"immédiatement." #: doc/classes/Control.xml msgid "" "All user interface nodes inherit from Control. A control's anchors and " "margins adapt its position and size relative to its parent." msgstr "" +"Tous les nÅ“uds d'interface utilisateur héritent de Control. Les ancres et " +"les marges des contrôles adaptent leur position et leur taille par rapport à " +"son parent." #: doc/classes/Control.xml msgid "" @@ -20433,7 +20792,7 @@ msgstr "Galerie des nÅ“uds de contrôle" #: doc/classes/Control.xml msgid "All GUI Demos" -msgstr "" +msgstr "Toutes les démos d'interface" #: doc/classes/Control.xml msgid "" @@ -20443,6 +20802,13 @@ msgid "" "Similar to [member rect_clip_content], but doesn't affect visibility.\n" "If not overridden, defaults to [code]false[/code]." msgstr "" +"Méthode virtuelle à surcharger par l'utilisateur. Retourne si [méthode " +"gui_input] ne doit pas être appelé pour les contrôles enfants en dehors du " +"rectangle englobant du contrôle. L'entrée sera limitée au Rect de ce " +"[Control]. Similaire à [member rect_clip_content], mais n'affecte pas la " +"visibilité.\n" +"Si la méthode n'est pas surchargée, la valeur par défaut retournée est " +"[code]false[/code]." #: doc/classes/Control.xml msgid "" @@ -20804,6 +21170,12 @@ msgid "" "The methods [method can_drop_data] and [method drop_data] must be " "implemented on controls that want to receive drop data." msgstr "" +"Force le glissage et contourne [method get_drag_data] et [method " +"set_drag_preview] en passant [code]data[/code] et [code]preview[/code]. Le " +"glissage va commencer même si la souris n'est ni sur, ni appuyé sur ce " +"contrôle.\n" +"Les méthodes [method can_drop_data] et [method drop_data] doivent être " +"implémentées pour les contrôles qui veulent recevoir ces données de glissage." #: doc/classes/Control.xml msgid "" @@ -20896,6 +21268,8 @@ msgid "" "Returns the mouse cursor shape the control displays on mouse hover. See " "[enum CursorShape]." msgstr "" +"Retourne le curseur de la souris que le contrôle affiche quand la souris le " +"survole. Voir [enum CursorShape]." #: doc/classes/Control.xml msgid "" @@ -21039,6 +21413,10 @@ msgid "" "[Theme] has a valid [member Theme.default_font] value.\n" "See [method get_color] for details." msgstr "" +"Retourne la police par défaut de la première correspondance [Theme] trouvée " +"dans l'arborescence si ce [Theme] a une valeur valide pour [member Theme." +"default_font].\n" +"Voir [method get_color] pour plus de détails." #: doc/classes/Control.xml msgid "" @@ -21203,6 +21581,10 @@ msgid "" "[code]theme_type[/code].\n" "See [method get_color] for details." msgstr "" +"Retourne [code]true[/code] s'il y a une correspondance [Theme] dans " +"l'arborescence qui a un élément de la boîte de style avec le code spécifié " +"[code]name[/code] et [code]theme_type[/code].\n" +"Voir [method get_color] pour plus de détails." #: doc/classes/Control.xml msgid "" @@ -21231,11 +21613,17 @@ msgid "" "changed. Setting [member rect_min_size] directly calls this method " "automatically." msgstr "" +"Invalide le cache de taille de ce nÅ“ud et des nÅ“uds parents jusqu'à la " +"racine. Prévu pour être utilisé avec [method get_minimum_size] quand la " +"valeur de retour est changée. Définir [member rect_min_size] appelle cette " +"méthode automatiquement." #: doc/classes/Control.xml msgid "" "Give up the focus. No other control will be able to receive keyboard input." msgstr "" +"Relâche le focus. Aucun autre contrôle ne pourra recevoir les entrées du " +"clavier." #: doc/classes/Control.xml #, fuzzy @@ -21304,12 +21692,18 @@ msgid "" "code] argument and automatic update of margin, it allows to set the margin " "offset yourself (see [method set_margin])." msgstr "" +"Fonctionne comme [method set_anchor], mais au lieu de l'argument " +"[code]keep_margin[/code] et de la mise à jour automatique de la marge, ça " +"permet de définir la marge de décalage par vous-même (voir [method " +"set_margin])." #: doc/classes/Control.xml msgid "" "Sets both anchor preset and margin preset. See [method set_anchors_preset] " "and [method set_margins_preset]." msgstr "" +"Définit à la fois le préréglage de l'ancre et de la marge. Voir [method " +"set_anchors_preset] et [method set_margins_preset]." #: doc/classes/Control.xml msgid "" @@ -21523,6 +21917,15 @@ msgid "" "If [code]exclusive[/code] is [code]true[/code], other controls will not " "receive input and clicking outside this control will not close it." msgstr "" +"Affiche un contrôle en tant que modal. Le contrôle doit être une sous-" +"fenêtre. Les contrôles de modal capturent les signaux d'entrée jusqu'à ce " +"que la zone située à l'extérieur soit accessible. Lorsqu'un contrôle modal " +"perd le focus, ou que la touche échap est pressée, il disparait " +"automatiquement. Les contrôles de modal sont largement utilisés pour les " +"dialogues surgissants (popup) et les menus.\n" +"Si [code]exclusif[/code] est [code]true[/code], les autres contrôles ne " +"recevront pas les entrées, et cliquer à l'extérieur de ce contrôle ne le " +"fermera pas." #: doc/classes/Control.xml msgid "" @@ -21584,6 +21987,9 @@ msgid "" "The focus access mode for the control (None, Click or All). Only one Control " "can be focused at the same time, and it will receive keyboard signals." msgstr "" +"Le mode de focus du contrôle (aucun, clic ou tous). Un seul contrôle peut " +"avoir le focus à un moment donné, et il recevra des signaux des touches du " +"clavier appuyées." #: doc/classes/Control.xml msgid "" @@ -22188,6 +22594,9 @@ msgid "" "beam pointer has a shape similar to \"I\". It tells the user they can " "highlight or insert text." msgstr "" +"Affiche le curseur de la souris en forme de I lorsque l'utilisateur survole " +"le nÅ“ud. Le pointeur en I a une forme semblable à un \"I\". Il signale à " +"l'utilisateur qu'il peut insérer ou surligner du texte." #: doc/classes/Control.xml msgid "" @@ -22675,6 +23084,15 @@ msgid "" "uses a more complex method of collision detection, and a convex one forces " "itself to be convex in order to speed up collision detection." msgstr "" +"Forme polygone convexe pour la physique 2D. Un polygone convexe, quelle que " +"soit sa forme, est décomposé en interne par d'autant de polygones convexes " +"que nécessaire pour assurer que toutes les collisions sont toujours " +"effectués sur les polygones convexes (ce qui sont plus rapide à vérifier).\n" +"La principale différence entre un [ConvexPolygonShape2D] et un " +"[ConcavePolygonShape2D] est qu'un polygone concave suppose toujours qu'il " +"est concave et utilise une méthode plus complexe pour la détection des " +"collisions, alors qu'un polygone convexe suppose toujours qu'il est convexe " +"pour accélérer la détection des collisions." #: doc/classes/ConvexPolygonShape2D.xml msgid "" @@ -22682,6 +23100,10 @@ msgid "" "points] property using the convex hull algorithm. Removing all unneeded " "points. See [method Geometry.convex_hull_2d] for details." msgstr "" +"Basé sur l'ensemble des points fournis, cela crée et définit la propriété " +"[member points] en utilisant l'algorithme de découpage convexe. Ça enlève " +"aussi tous les points inutiles. Voir [method Geometry.convex_hull_2d] pour " +"plus de détails." #: doc/classes/ConvexPolygonShape2D.xml msgid "" @@ -22690,6 +23112,10 @@ msgid "" "[method set_point_cloud] to generate a convex hull shape from concave shape " "points." msgstr "" +"La liste des sommets du polygone. Peut être dans le sens horaire ou dans le " +"sens anti-horaire. Ne définissez cette propriété qu'avec des points d'une " +"forme convexe, et utilisez [method set_point_cloud] pour générer une forme " +"convexe à partir de points d'une forme concave." #: doc/classes/CPUParticles.xml msgid "CPU-based 3D particle emitter." @@ -22704,12 +23130,22 @@ msgid "" "[b]Note:[/b] Unlike [Particles], the visibility rect is generated on-the-fly " "and doesn't need to be configured by the user." msgstr "" +"Un nÅ“ud pour les particules 3D fonctionnant sur le CPU utilisé pour créer " +"une grande variété d'effets de particules.\n" +"Voir aussi [Particles], qui fournit la même fonctionnalité mais avec " +"l'accélération matérielle (via GPU), mais ne peut pas fonctionner sur des " +"appareils plus anciens.\n" +"[b]Note :[/b] Contrairement aux [Particles], le rect de visibilité est " +"généré à lors de émission et n'a pas besoin d'être configuré par " +"l'utilisateur." #: doc/classes/CPUParticles.xml msgid "" "Sets this node's properties to match a given [Particles] node with an " "assigned [ParticlesMaterial]." msgstr "" +"Génère les propriétés de ce nÅ“ud pour correspondre à un nÅ“ud [Particules] " +"avec en plus un nÅ“ud assigné [ParticlesMaterial]." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Returns the base value of the parameter specified by [enum Parameter]." @@ -22767,6 +23203,11 @@ msgid "" "therefore removing all particles that were already emitted before changing " "[member amount]." msgstr "" +"Le nombre de particules émises dans un cycle d'émission (correspondant à la " +"durée [member lifetime]).\n" +"[b]Note :[/b] Changer [member amount] réinitialisera l'émission des " +"particules, supprimant ainsi toutes les particules déjà émises avant de " +"changer [member amount]." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Initial rotation applied to each particle, in degrees." @@ -22838,6 +23279,9 @@ msgid "" "[SpatialMaterial] make sure to set [member SpatialMaterial." "vertex_color_use_as_albedo] to [code]true[/code]." msgstr "" +"La couleur initiale de chaque particule. Pour utiliser cette couleur dans un " +"[SpatialMaterial], assurez-vous de définir [membrer SpatialMaterial." +"vertex_color_use_as_albedo] à [code]true[/code]." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -22845,6 +23289,8 @@ msgid "" "Each particle's initial color will vary along this [GradientTexture] " "(multiplied with [member color])." msgstr "" +"La couleur initiale de chaque particule qui varie suivant la " +"[GradientTexture] (multipliée avec [member color])." #: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml msgid "" @@ -22978,6 +23424,10 @@ msgid "" "the value to 2 will make the particles render at 2 frames per second. Note " "this does not slow down the particle system itself." msgstr "" +"Le nombre de trames du système de particules est fixé à une valeur. Par " +"exemple, changer la valeur à 2 rendra les particules à 2 trames par seconde. " +"Notez que cela ne ralentit pas le système de particules lui-même juste " +"l'affichage final." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -23001,6 +23451,8 @@ msgid "" "Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts " "particles to X/Z plane." msgstr "" +"La quantité d'éparpillement [member spread] dans le plan Y/Z. Une valeur de " +"[code]1[/code] limite les particules au plan X/Z." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml @@ -23008,6 +23460,8 @@ msgid "" "If [code]true[/code], results in fractional delta calculation which has a " "smoother particles display effect." msgstr "" +"Si [code]true[/code], utilise un calcul d'étape fractionnelle qui permet " +"affichage plus lisse des particules." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -23034,6 +23488,8 @@ msgid "" "Initial velocity magnitude for each particle. Direction comes from [member " "spread] and the node's orientation." msgstr "" +"La magnitude de la vitesse initiale de chaque particule. L'orientation " +"dépend de [member spread] et de l'orientation du nÅ“ud." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -23055,6 +23511,8 @@ msgstr "Facteur d'aléatoire de la durée de vie d'une particule." msgid "" "Linear acceleration applied to each particle in the direction of motion." msgstr "" +"L'accélération linéaire appliquée à chaque particule dans la direction du " +"mouvement." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's linear acceleration will vary along this [Curve]." @@ -23073,6 +23531,9 @@ msgid "" "If [code]true[/code], particles use the parent node's coordinate space. If " "[code]false[/code], they use global coordinates." msgstr "" +"Si [code]true[/code], les particules utilisent l'espace de coordonnées du " +"parent du nÅ“ud. Si [code]false[/code], ils utilisent des coordonnées " +"globales." #: doc/classes/CPUParticles.xml msgid "" @@ -23088,6 +23549,9 @@ msgid "" "If [code]true[/code], only one emission cycle occurs. If set [code]true[/" "code] during a cycle, emission will stop at the cycle's end." msgstr "" +"Si [code]true[/code], un seul cycle d'émission se produit. Si définit à " +"[code]true[/code] pendant un cycle, l'émission s'arrêtera à la fin de ce " +"cycle." #: doc/classes/CPUParticles.xml msgid "" @@ -23097,6 +23561,11 @@ msgid "" "This property is only available when [member flag_disable_z] is [code]true[/" "code]." msgstr "" +"La vitesse orbitale appliquée à chaque particule. Fait tourner les " +"particules autour d'origine sur le plan XY local. Spécifié en nombre de " +"rotations complètes autour de l'origine par seconde.\n" +"Cette propriété est uniquement disponible lorsque [member flag_disable_z] " +"est [code]true[/code]." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's orbital velocity will vary along this [Curve]." @@ -23113,6 +23582,8 @@ msgstr "Facteur d'aléatoire de la vélocité orbitale." #: doc/classes/Particles2D.xml msgid "Particle system starts as if it had already run for this many seconds." msgstr "" +"Le système de particules démarre comme s'il avait déjà commencé depuis " +"plusieurs secondes." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -23159,6 +23630,8 @@ msgid "" "Particle system's running speed scaling ratio. A value of [code]0[/code] can " "be used to pause the particles." msgstr "" +"Le facteur de vitesse du système de particules. Une valeur de [code]0[/code] " +"peut être utilisée pour arrêter les particules." #: doc/classes/CPUParticles.xml msgid "" @@ -23176,6 +23649,9 @@ msgid "" "perpendicular to the particle's velocity giving the particles a swirling " "motion." msgstr "" +"L'accélération tangentielle appliquée à chaque particule. Elle est " +"perpendiculaire à la vitesse de la particule, ce qui donne aux particules un " +"mouvement de glissement." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's tangential acceleration will vary along this [Curve]." @@ -23209,30 +23685,40 @@ msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set initial velocity properties." msgstr "" +"À utiliser avec [method set_param], [method set_param_randomness], et " +"[method set_param_curve] pour définir les propriétés de vitesse initiale." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set angular velocity properties." msgstr "" +"À utiliser avec [method set_param], [method set_param_randomness], et " +"[method set_param_curve] pour définir les propriétés de vitesse angulaire." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set orbital velocity properties." msgstr "" +"À utiliser avec [method set_param], [method set_param_randomness], et " +"[method set_param_curve] pour définir les propriétés de vitesse orbitale." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set linear acceleration properties." msgstr "" +"À utiliser avec [method set_param], [method set_param_randomness], et " +"[method set_param_curve] pour définir les propriétés d'accélération linéaire." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set radial acceleration properties." msgstr "" +"À utiliser avec [method set_param], [method set_param_randomness], et " +"[method set_param_curve] pour définir les propriétés d'accélération radiale." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" @@ -23336,6 +23822,9 @@ msgid "" "emission_points]. Particle color will be modulated by [member " "emission_colors]." msgstr "" +"Les particules seront émises à une position choisie au hasard parmi les " +"points [member emission_points]. La couleur des particules sera modulée par " +"[member emission_colors]." #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" @@ -23344,6 +23833,10 @@ msgid "" "[member emission_normals]. Particle color will be modulated by [member " "emission_colors]." msgstr "" +"Les particules seront émises à une position choisie au hasard parmi [member " +"emission_points]. La vitesse et la rotation des particules seront " +"déterminées en fonction de [member emission_normals]. La couleur des " +"particules sera modulée par [member emission_colors]." #: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml msgid "Particles will be emitted in a ring or cylinder." @@ -23367,30 +23860,45 @@ msgid "" "[b]Note:[/b] Unlike [Particles2D], the visibility rect is generated on-the-" "fly and doesn't need to be configured by the user." msgstr "" +"NÅ“ud de particules 2D calculées par le CPU pour créer une variété de " +"systèmes et d'effets de particules.\n" +"Voir aussi [Particles2D], qui fournit la même fonctionnalité mais en " +"utilisant l'accélération matérielle, mais ne peut pas fonctionner sur des " +"appareils plus anciens.\n" +"[b]Note :[/b] Contrairement [Particles2D], le rectangle de visibilité est " +"généré à l'émission et n'a donc pas besoin d'être définit par l'utilisateur." #: doc/classes/CPUParticles2D.xml msgid "" "Sets this node's properties to match a given [Particles2D] node with an " "assigned [ParticlesMaterial]." msgstr "" +"Définit les propriétés de ce nÅ“ud pour correspondre à au nÅ“ud [Particles2D] " +"spécifié, en incluant un nÅ“ud [ParticlesMaterial]." #: doc/classes/CPUParticles2D.xml msgid "" "Each particle's initial color. If [member texture] is defined, it will be " "multiplied by this color." msgstr "" +"La couleur initiale de chaque particule. Si [member texture] est défini, les " +"particules sont multipliées par cette couleur." #: doc/classes/CPUParticles2D.xml msgid "" "Each particle's color will vary along this [Gradient] (multiplied with " "[member color])." msgstr "" +"Chaque couleur de particle varie selon ce [Gradient] (multiplié avec [member " +"color])." #: doc/classes/CPUParticles2D.xml msgid "" "The rectangle's extents if [member emission_shape] is set to [constant " "EMISSION_SHAPE_RECTANGLE]." msgstr "" +"Le rectangle d'émission si [member emission_shape] est [constant " +"EMISSION_SHAPE_RECTANGLE]." #: doc/classes/CPUParticles2D.xml msgid "" @@ -23407,6 +23915,10 @@ msgid "" "the value to 2 will make the particles render at 2 frames per second. Note " "this does not slow down the simulation of the particle system itself." msgstr "" +"Le nombre de trames du système de particules est fixé à une valeur. Par " +"exemple, changer la valeur à 2 rendra les particules à 2 trames par seconde. " +"Notez que cela ne ralentit pas le système de particules lui-même juste " +"l'affichage final." #: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml msgid "" @@ -23416,12 +23928,21 @@ msgid "" "Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " "a comparison of normal map coordinates expected by popular engines." msgstr "" +"La texture de normale à utiliser pour la propriété [member texture].\n" +"[b]Note :[/b] Godot s'attend à ce que la texture de normale utilise les " +"coordonnées +X, -Y, et +Z. Voir [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]cette page[/url] " +"pour une comparaison des coordonnées des textures de normales attendues par " +"les principaux moteurs de jeu." #: doc/classes/CPUParticles2D.xml msgid "" "Orbital velocity applied to each particle. Makes the particles circle around " "origin. Specified in number of full rotations around origin per second." msgstr "" +"La vitesse orbitale appliquée à chaque particule. Fait tourner les " +"particules autour de l'origine. Spécifié en nombre de rotations complètes " +"autour de l'origine par seconde." #: doc/classes/CPUParticles2D.xml doc/classes/ParticlesMaterial.xml msgid "" @@ -23590,7 +24111,7 @@ msgid "" "certificates and passed to [method StreamPeerSSL.accept_stream]." msgstr "" "Génère une [CryptoKey] RSA qui peut être utilisé pour créer des certificats " -"autosignés et transmis à [method StreamPeerSSL.accept_stream]" +"autosignés et transmis à [method StreamPeerSSL.accept_stream]." #: doc/classes/Crypto.xml msgid "" @@ -23639,6 +24160,12 @@ msgid "" "Currently, only [constant HashingContext.HASH_SHA256] and [constant " "HashingContext.HASH_SHA1] are supported." msgstr "" +"Génère un résumé [url=https://en.wikipedia.org/wiki/HMAC]HMAC[/url] de " +"[code]msg[/code] à partir de la clé [code]key[/code]. Le paramètre " +"[code]hash_type[/code] est l'algorithme de hachage utilisé pour les hachages " +"intérieurs et extérieurs.\n" +"Actuellement, seuls les algorithmes [constant HashingContext.HASH_SHA256] et " +"[constant HashingContext.HASH_SHA1] sont supportés." #: doc/classes/Crypto.xml msgid "" @@ -23668,6 +24195,12 @@ msgid "" "Crypto.generate_self_signed_certificate] and as private key in [method " "StreamPeerSSL.accept_stream] along with the appropriate certificate." msgstr "" +"La classe CryptoKey représente une clé cryptographique. Les clés peuvent " +"être chargées et sauvegardées comme toute autre [Resource].\n" +"Elles peuvent être utilisées pour générer un certicat [X509Certificate] " +"autosigné avec [method Crypto.generate_self_signed_certificate] et comme clé " +"privée dans [method StreamPeerSSL.accept_stream] avec le certificat " +"approprié." #: doc/classes/CryptoKey.xml msgid "" @@ -23684,12 +24217,19 @@ msgid "" "[b]Note:[/b] [code]path[/code] should be a \"*.pub\" file if " "[code]public_only[/code] is [code]true[/code], a \"*.key\" file otherwise." msgstr "" +"Charge la clé à [code]path[/code]. Si [code]public_only[/code] est " +"[code]true[/code], seule la clé publique sera chargée.\n" +"[b]Note :[/b] [code]path[/code] doit être un fichier \"*.pub\" si " +"[code]public_only[/code] est [code]true[/code], et un fichier \"*.key\" " +"sinon." #: doc/classes/CryptoKey.xml msgid "" "Loads a key from the given [code]string[/code]. If [code]public_only[/code] " "is [code]true[/code], only the public key will be loaded." msgstr "" +"Charge une clé depuis la [code]string[/code] donnée. Si [code]public_only[/" +"code] est [code]true[/code], seule la clé publique sera chargée." #: doc/classes/CryptoKey.xml msgid "" @@ -23698,12 +24238,21 @@ msgid "" "[b]Note:[/b] [code]path[/code] should be a \"*.pub\" file if " "[code]public_only[/code] is [code]true[/code], a \"*.key\" file otherwise." msgstr "" +"Enregistre une clé au chemin [code]path[/code] spécifié. Si " +"[code]public_only[/code] est [code]true[/code], seule la clé publique sera " +"enregistrée.\n" +"[b]Note :[/b] [code]path[/code] doit être un fichier avec l'extension \"." +"pub\" si [code]public_only[/code] est [code]true[/code], et avec l'extension " +"\".key\" sinon." #: doc/classes/CryptoKey.xml msgid "" "Returns a string containing the key in PEM format. If [code]public_only[/" "code] is [code]true[/code], only the public key will be included." msgstr "" +"Retourne une chaîne de caractères contenant la clé en format PEM. Si " +"[code]public_only[/code] est [code]true[/code], seule la clé publique sera " +"incluse." #: modules/csg/doc_classes/CSGBox.xml msgid "A CSG Box shape." @@ -24002,7 +24551,7 @@ msgstr "" #: modules/csg/doc_classes/CSGPolygon.xml msgid "The [member polygon] shape is extruded along the negative Z axis." -msgstr "" +msgstr "La forme [member polygone] est extrudée le long de l'axe Z négatif." #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -24016,6 +24565,8 @@ msgid "" "The [member polygon] shape is extruded along the [Path] specified in [member " "path_node]." msgstr "" +"La forme [member polygone] est extrudée le long du [Path] spécifié par " +"[member path_node]." #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -24110,6 +24661,9 @@ msgid "" "node and the second is the root [Mesh] of this node. Only works when this " "node is the root shape." msgstr "" +"Retourne un [Array] avec deux éléments, le premier est la [Transform] de ce " +"nÅ“ud et le second est le [Mesh] racine de ce nÅ“ud. Ne fonctionne que lorsque " +"ce nÅ“ud est la forme racine." #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -24180,6 +24734,9 @@ msgid "" "CSG child node as the operation is between this node and the previous child " "of this nodes parent." msgstr "" +"L'opération effectuée sur cette forme. Ceci est ignoré pour le premier nÅ“ud " +"enfant CSG puisque l'opération est entre ce nÅ“ud et l'enfant précédent de ce " +"nÅ“ud parent." #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -24194,6 +24751,9 @@ msgid "" "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden." msgstr "" +"Ajoute une forme de collision au moteur de physique pour cette forme CSG. " +"Cela agira toujours comme un corps statique. Notez que la forme de collision " +"est toujours active même si cette forme CSG est cachée." #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -24291,6 +24851,9 @@ msgid "" "effect making the torus seem rounded. If [code]false[/code] the torus will " "have a flat shaded look." msgstr "" +"Si [code]true[/code] les normales du tore sont définies pour donner un effet " +"lisse donnant l'impression que le tore est arrondis. Si [code]false[/code] " +"le tore aura un aspect de rendu plat." #: modules/mono/doc_classes/CSharpScript.xml #, fuzzy @@ -24307,6 +24870,9 @@ msgid "" "class and is only available in Mono-enabled Godot builds.\n" "See also [GodotSharp]." msgstr "" +"Cette classe représente un script C#. C'est l'équivalent C# de la classe " +"[GDScript] et n'est disponible que dans les versions de Godot avec Mono.\n" +"Voir aussi [GodotSharp]." #: modules/mono/doc_classes/CSharpScript.xml #: modules/gdnative/doc_classes/PluginScript.xml @@ -24785,12 +25351,24 @@ msgid "" "get_point_count][/code]), the point will be appended at the end of the point " "list." msgstr "" +"Ajoute un point à une courbe à la [code]position[/code] par rapport à la " +"position de la [Curve2D], avec des points de contrôle d'entrée [code]in[/" +"code] et de sortie [code]out[/code].\n" +"Si [code]at_position[/code] est spécifié, le point est inséré juste avant ce " +"numéro de point [code]at_position[/code], en déplaçant ce point (et tous les " +"autres points qui suivent) après le point inséré. Si [code]at_position[/" +"code] n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/" +"code] ou [code]at_position >= [method get_point_count][/code,) le point sera " +"ajouté en dernier." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" "Returns the total length of the curve, based on the cached points. Given " "enough density (see [member bake_interval]), it should be approximate enough." msgstr "" +"Retourne la longueur totale de la courbe, à partir de la distance entre les " +"points mis en cache. Si la densité est suffisante (voir [member " +"bake_interval]), cette longeur devrait être une approximation suffisante." #: doc/classes/Curve2D.xml msgid "Returns the cache of points as a [PoolVector2Array]." @@ -24802,6 +25380,9 @@ msgid "" "be used in [method interpolate_baked].\n" "[code]to_point[/code] must be in this curve's local space." msgstr "" +"Retourne le décalage le plus proche de [code]to_point[/code]. Ce décalage " +"est destiné à être utilisé dans [méthode interpolate_baked].\n" +"[code]to_point[/code] doit être dans l'espace local de la courbe." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -24809,6 +25390,9 @@ msgid "" "code].\n" "[code]to_point[/code] must be in this curve's local space." msgstr "" +"Retourne le point en cache le plus proche (dans l'espace local de la courbe) " +"de [code]to_point[/code].\n" +"[code]to_point[/code] doit être dans l'espace local de la courbe." #: doc/classes/Curve2D.xml msgid "" @@ -24817,6 +25401,10 @@ msgid "" "the index is out of bounds, the function sends an error to the console, and " "returns [code](0, 0)[/code]." msgstr "" +"Retourne la position du point de contrôle menant vers le sommet [code]idx[/" +"code]. La position retournée est relative au sommet [code]idx[/code]. Si " +"l'index est hors limites, la fonction affiche une erreur, et retourne [code]" +"(0, 0)[/code]." #: doc/classes/Curve2D.xml msgid "" @@ -24825,6 +25413,10 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console, and returns [code](0, 0)[/code]." msgstr "" +"Retourne la position du point de contrôle en partant du sommet [code]idx[/" +"code]. La position retournée est relative au sommet [code]idx[/code]. Si " +"l'index est hors limites, la fonction affiche une erreur, et retourne [code]" +"(0, 0)[/code]." #: doc/classes/Curve2D.xml msgid "" @@ -24832,6 +25424,8 @@ msgid "" "bounds, the function sends an error to the console, and returns [code](0, 0)" "[/code]." msgstr "" +"Retourne la position du sommet [code]idx[/code]. Si l'index est hors " +"limites, la fonction affiche une erreur, et retourne [code](0, 0)[/code]." #: doc/classes/Curve2D.xml msgid "" @@ -24844,6 +25438,14 @@ msgid "" "vertex, and [code]t[/code] is ignored. If the curve has no points, the " "function sends an error to the console, and returns [code](0, 0)[/code]." msgstr "" +"Retourne la position entre le sommet [code]idx[/code] et le sommet [code]idx " +"+ 1[/code], où [code]t[/code] contrôle si le point est le premier sommet " +"([code]t = 0,0[/code]), le dernier sommet ([code]t = 1.0[/code]), ou entre " +"les deux. Les valeurs de [code]t[/code] en dehors de l'intervalle ([code]0.0 " +">= t <=1[/code]) donnent des résultats inattendus, mais prévisibles.\n" +"Si [code]idx[/code] est hors limites il est tronqué au premier ou au dernier " +"sommet, et [code]t[/code] est ignoré. Si la courbe n'a pas de points, la " +"fonction affiche une erreur, et retourne [code](0, 0)[/code]." #: doc/classes/Curve2D.xml msgid "" @@ -24856,6 +25458,14 @@ msgid "" "Cubic interpolation tends to follow the curves better, but linear is faster " "(and often, precise enough)." msgstr "" +"Retourne un point dans la courbe à la position [code]offset[/code], où " +"[code]offset[/code] est mesuré en pixels le long de la courbe.\n" +"Pour cela, il trouve les deux points dans le cache où le [code]offset[/code] " +"se situe entre, puis interpole les valeurs. Cette interpolation est cubique " +"si [code]cubic[/code] est [code]true[/code], ou linéaire si est [code]false[/" +"code].\n" +"L'interpolation cubique tend à mieux suivre les courbes, mais " +"l'interpolation linéaire est plus rapide (et souvent bien assez précise)." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -24863,12 +25473,17 @@ msgid "" "interpolate] using the integer part of [code]fofs[/code] as [code]idx[/" "code], and its fractional part as [code]t[/code]." msgstr "" +"Retourne la position au sommet [code]fofs[/code]. Ça appelle [method " +"interpolate] en utilisant la partie entière de [code]fofs[/code] pour " +"[code]idx[/code], et sa partie décimale pour [code]t[/code]." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" "Deletes the point [code]idx[/code] from the curve. Sends an error to the " "console if [code]idx[/code] is out of bounds." msgstr "" +"Supprime le point [code]idx[/code] de la courbe. Affiche une erreur si " +"[code]idx[/code] est hors limites." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -24876,6 +25491,9 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console. The position is relative to the vertex." msgstr "" +"Régle la position du point de contrôle menant au sommet [code]idx[/code]. Si " +"l'index est hors limites, la fonction affiche une erreur. La position est " +"relative au sommet." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -24883,12 +25501,17 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console. The position is relative to the vertex." msgstr "" +"Régle la position du point de contrôle partant du sommet [code]idx[/code]. " +"Si l'index est hors limites, la fonction affiche une erreur. La position est " +"relative au sommet." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" "Sets the position for the vertex [code]idx[/code]. If the index is out of " "bounds, the function sends an error to the console." msgstr "" +"Définit la position pour le vertex [code]idx[/code]. Si l'index est hors " +"limites, la fonction affiche une erreur." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -24944,6 +25567,11 @@ msgid "" "It keeps a cache of precalculated points along the curve, to speed up " "further calculations." msgstr "" +"Cette classe décrit une courbe de Bézier dans l'espace 3D. Elle est " +"principalement utilisée pour donner une forme à un [Path], mais peut être " +"échantillonné manuellement à d'autres fins.\n" +"Elle conserve un cache de points précalculés le long de la courbe, pour " +"accélérer de nouveaux calculs." #: doc/classes/Curve3D.xml msgid "" @@ -24956,6 +25584,15 @@ msgid "" "get_point_count][/code]), the point will be appended at the end of the point " "list." msgstr "" +"Ajoute un point à la courbe à [code]position[/code] par rapport à la " +"position [Curve3D], avec des points de contrôle [code]in[/code] et " +"[code]out[/code].\n" +"Si [code]at_position[/code] est spécifiée, le point est inséré avant le " +"numéro de point [code]at_position[/code], deplaçant ce point (et tous les " +"suivants) après le point inséré. Si [code]at_position[/code] n'est pas " +"spécifiée, ou est une valeur invalide ([code]at_position <0[/code] ou " +"[code]at_position >= [method get_point_count][/code]), le point sera ajouté " +"à la fin de la liste des points." #: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." @@ -24970,6 +25607,8 @@ msgid "" "Returns the cache of up vectors as a [PoolVector3Array].\n" "If [member up_vector_enabled] is [code]false[/code], the cache will be empty." msgstr "" +"Retourne le cache des vecteurs du haut dans un [PoolVector3Array].\n" +"Si [member up_vector_enabled] est [code]false[/code], le cache sera vide." #: doc/classes/Curve3D.xml msgid "" @@ -24978,6 +25617,10 @@ msgid "" "interpolate_baked_up_vector].\n" "[code]to_point[/code] must be in this curve's local space." msgstr "" +"Retourne le décalage le plus proche de [code]to_point[/code]. Ce décalage " +"est destiné à être utilisé dans [method interpolate_baked] ou [method " +"interpolate_baked_up_vector].\n" +"[code]to_point[/code] doit être dans l'espace local de cette courbe." #: doc/classes/Curve3D.xml msgid "" @@ -24986,6 +25629,10 @@ msgid "" "the index is out of bounds, the function sends an error to the console, and " "returns [code](0, 0, 0)[/code]." msgstr "" +"Retourne la position du point de contrôle menant au sommet [code]idx[/code]. " +"La position retournée est relative au sommet [code]idx[/code]. Si l'index " +"est hors limites, la fonction affiche une erreur, et retourne [code](0, 0, 0)" +"[/code]." #: doc/classes/Curve3D.xml msgid "" @@ -24994,6 +25641,10 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console, and returns [code](0, 0, 0)[/code]." msgstr "" +"Retourne la position du point de contrôle partant du sommet [code]idx[/" +"code]. La position retournée est relative au sommet [code]idx[/code]. Si " +"l'index est hors limites, la fonction affiche une erreur, et retourne [code]" +"(0, 0, 0)[/code]." #: doc/classes/Curve3D.xml msgid "" @@ -25001,6 +25652,8 @@ msgid "" "bounds, the function sends an error to the console, and returns [code](0, 0, " "0)[/code]." msgstr "" +"Retourne la position du sommet [code]idx[/code]. Si l'index est hors " +"limites, la fonction affiche une erreur, et retourne [code](0, 0, 0)[/code]." #: doc/classes/Curve3D.xml msgid "" @@ -25023,6 +25676,15 @@ msgid "" "vertex, and [code]t[/code] is ignored. If the curve has no points, the " "function sends an error to the console, and returns [code](0, 0, 0)[/code]." msgstr "" +"Retourne la position entre le sommet [code]idx[/code] et le sommet [code]idx " +"+ 1[/code], où [code]t[/code] contrôle si le point est le premier sommet " +"([code]t = 0,0[/code]), le dernier sommet ([code]t = 1.0[/code]), ou entre " +"ces deux valeurs. Les valeurs de [code]t[/code] en dehors de l'intervalle " +"([code]0.0 >= t <=1[/code]) donnent des résultats inattendus, mais " +"prévisibles.\n" +"Si [code]idx[/code] est hors limites il est tronqué au premier ou au dernier " +"sommet, et [code]t[/code] est ignoré. Si la courbe n'a pas de points, la " +"fonction affiche une erreur, et retourne [code](0, 0, 0)[/code]." #: doc/classes/Curve3D.xml msgid "" @@ -25035,6 +25697,14 @@ msgid "" "Cubic interpolation tends to follow the curves better, but linear is faster " "(and often, precise enough)." msgstr "" +"Retourne un point dans la courbe à la position [code]offset[/code], où " +"[code]offset[/code] est mesuré en unités 3D le long de la courbe.\n" +"Pour cela, il trouve les deux points dans le cache où le [code]offset[/code] " +"se situe entre, puis interpole les valeurs. Cette interpolation est cubique " +"si [code]cubic[/code] est [code]true[/code], ou linéaire si est [code]false[/" +"code].\n" +"L'interpolation cubique tend à mieux suivre les courbes, mais " +"l'interpolation linéaire est plus rapide (et souvent bien assez précise)." #: doc/classes/Curve3D.xml msgid "" @@ -25047,6 +25717,14 @@ msgid "" "If the curve has no up vectors, the function sends an error to the console, " "and returns [code](0, 1, 0)[/code]." msgstr "" +"Retourne un vecteur haut dans la courbe à la position [code]offset[/code], " +"où [code]offset[/code] est mesuré en unités 3D le long de la courbe.\n" +"Pour cela, il trouve les deux vecteurs dans le cache où le [code]offset[/" +"code] se situe entre, puis interpole les valeurs. Si [code]apply_tilt[/code] " +"est [code]true[/code], une inclinaison interpolée est aussi appliquée au " +"vecteur interpolé.\n" +"Si la courbe n'a pas de vecteurs, la fonction affiche une erreur, et " +"retourne [code](0, 1, 0)[/code]." #: doc/classes/Curve3D.xml msgid "" @@ -25056,6 +25734,11 @@ msgid "" "the path would have. In the case of a curve controlling a [PathFollow], this " "tilt is an offset over the natural tilt the [PathFollow] calculates." msgstr "" +"Définit l'angle d'inclinaison en radians pour le point [code]idx[/code]. Si " +"l'index est hors limites, la fonction affiche une erreur.\n" +"L'inclinaison contrôle la rotation qu'un objet parcourant la courbe aurait. " +"Dans le cas d'une courbe contrôlant un [PathFollow], cette inclinaison est " +"un décalage sur l'inclinaison naturelle que calcule le [PathFollow]." #: doc/classes/Curve3D.xml msgid "" @@ -25065,6 +25748,11 @@ msgid "" "smaller the distance, the more points in the cache and the more memory it " "will consume, so use with care." msgstr "" +"La distance en unités entre deux points de cache adjacents. Le changement " +"force le cache à être recalculé la prochaine fois que la fonction [method " +"get_baked_points] ou [method get_baked_length] sera appelée. Plus la " +"distance est petite, plus il y aura de points dans le cache, et plus ça " +"utilisera de mémoire, à utiliser donc avec soin." #: doc/classes/Curve3D.xml msgid "" @@ -25072,6 +25760,10 @@ msgid "" "This is used when [member PathFollow.rotation_mode] is set to [constant " "PathFollow.ROTATION_ORIENTED]. Changing it forces the cache to be recomputed." msgstr "" +"Si [code]true[/code], la courbe pré-calcule des vecteurs utilisés pour " +"l'orientation. Ceci est utilisé lorsque [member PathFollow.rotation_mode] " +"est défini à [constant PathFollow.ROTATION_ORIENTED]. Le changer force le " +"cache à être recalculé." #: doc/classes/CurveTexture.xml msgid "A texture that shows a curve." @@ -25082,6 +25774,8 @@ msgid "" "Renders a given [Curve] provided to it. Simplifies the task of drawing " "curves and/or saving them as image files." msgstr "" +"Fait le rendu d'une [Curve] donnée. Simplifie la tâche de dessiner les " +"courbes et/ou de les enregistrer dans des fichiers d'image." #: doc/classes/CurveTexture.xml #, fuzzy @@ -25094,6 +25788,10 @@ msgid "" "represent high-frequency data better (such as sudden direction changes), at " "the cost of increased generation time and memory usage." msgstr "" +"La largeur de la texture (en pixels). Des valeurs plus élevées permettent de " +"mieux représenter les données à haute fréquence (comme les changements " +"soudains de direction) au coût de l'utilisation accrue du temps de " +"génération et de la mémoire." #: doc/classes/CylinderMesh.xml msgid "Class representing a cylindrical [PrimitiveMesh]." @@ -25105,12 +25803,17 @@ msgid "" "create cones by setting either the [member top_radius] or [member " "bottom_radius] properties to [code]0.0[/code]." msgstr "" +"La classe représentant un [PrimitiveMesh] cylindrique. Cette classe peut " +"être utilisée pour créer des cônes en définissant la propriété [member " +"top_radius] ou [member bottom_radius] à [code]0.0[/code]." #: doc/classes/CylinderMesh.xml msgid "" "Bottom radius of the cylinder. If set to [code]0.0[/code], the bottom faces " "will not be generated, resulting in a conic shape." msgstr "" +"Le rayon inférieur du cylindre. Si [code]0.0[/code], les faces inférieures " +"ne seront pas générées, ce qui donne une forme conique." #: doc/classes/CylinderMesh.xml msgid "Full height of the cylinder." @@ -25121,6 +25824,9 @@ msgid "" "Number of radial segments on the cylinder. Higher values result in a more " "detailed cylinder/cone at the cost of performance." msgstr "" +"Le nombre de segments radiaux sur le cylindre. Des valeurs plus élevées " +"génèrent des cylindres/cônes plus détaillés mais peuvent réduire les " +"performances." #: doc/classes/CylinderMesh.xml msgid "" @@ -25138,6 +25844,8 @@ msgid "" "Top radius of the cylinder. If set to [code]0.0[/code], the top faces will " "not be generated, resulting in a conic shape." msgstr "" +"Le rayon supérieur du cylindre. Si [code]0.0[/code], les faces supérieures " +"ne seront pas générées, ce qui donne une forme conique." #: doc/classes/CylinderShape.xml msgid "Cylinder shape for collisions." @@ -25438,6 +26146,12 @@ msgid "" "[b]Note:[/b] Don't erase elements while iterating over the dictionary. You " "can iterate over the [method keys] array instead." msgstr "" +"Efface une paire de clé/valeur du dictionnaire spécifiée par sa clé. " +"Retourne [code]true[/code] si la clé donnée était présente dans le " +"dictionnaire, [code]false[/code] sinon.\n" +"[b]Note :[/b] Ne supprimez pas les éléments pendant l'énumération du " +"dictionnaire. Vous pouvez à la place énumérer le dictionnaire avec [method " +"keys] qui retourne un tableau immuable." #: doc/classes/Dictionary.xml msgid "" @@ -25445,6 +26159,9 @@ msgid "" "key does not exist, the method returns the value of the optional default " "argument, or [code]null[/code] if it is omitted." msgstr "" +"Retourne la valeur actuelle de la clé spécifiée dans le [Dictionnaire]. Si " +"la clé n'existe pas, la méthode retourne la valeur de l'argument optionnel " +"\"default\", ou [code]null[/code] si elle n'est pas spécifiée." #: doc/classes/Dictionary.xml msgid "" @@ -25525,6 +26242,9 @@ msgid "" "duplicate keys will not be copied over, unless [code]overwrite[/code] is " "[code]true[/code]." msgstr "" +"Ajoute tous les éléments de [code]dictionary[/code] à ce [Dictionnaire]. Par " +"défaut, les clés en double ne seront pas remplaçées, sauf si " +"[code]overwrite[/code] est [code]true[/code]." #: doc/classes/Dictionary.xml msgid "Returns the number of keys in the dictionary." @@ -25547,6 +26267,12 @@ msgid "" "or moonlight. The worldspace location of the DirectionalLight transform " "(origin) is ignored. Only the basis is used to determine light direction." msgstr "" +"Une lumière directionnelle est un type de nÅ“ud [Light] qui fait un rendu " +"d'un nombre infini de rayons parallèles couvrant toute la scène. Il est " +"utilisé pour les lumières à forte intensité qui sont situées loin de la " +"scène pour modéliser la lumière du soleil ou du clair de lune. L'emplacement " +"global de la DirectionalLight (son origine) est ignoré. Seule sa rotation " +"est utilisée pour déterminer la direction de la lumière." #: doc/classes/DirectionalLight.xml msgid "" @@ -25563,6 +26289,10 @@ msgid "" "moderate performance cost. This is ignored when [member " "directional_shadow_mode] is [constant SHADOW_ORTHOGONAL]." msgstr "" +"Si [code]true[/code], le détail des ombres est sacrifié pour obtenir des " +"transitions plus lisses entre les fractions. Activer cette option a " +"également un coût modéré sur les performances. Ceci est ignoré lorsque " +"[member directional_shadow_mode] est [constant SHADOW_ORTHOGONAL]." #: doc/classes/DirectionalLight.xml msgid "" @@ -25579,6 +26309,10 @@ msgid "" "shadow detail and performance (since more objects need to be included in the " "directional shadow rendering)." msgstr "" +"La distance maximale pour les fractions des ombres. Augmenter cette valeur " +"rendra visibles les ombres directionnelles de plus loin, mais affichera " +"moins de détails des ombres et de moins bonnes performances (puisque plus " +"d'objets doivent être inclus dans le rendu d'ombre directionnel)." #: doc/classes/DirectionalLight.xml msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." @@ -25590,6 +26324,8 @@ msgid "" "Can be used to fix special cases of self shadowing when objects are " "perpendicular to the light." msgstr "" +"Peut être utilisé pour corriger des cas spéciaux pour les ombres des objets " +"qui sont perpendiculaires à la source de lumière." #: doc/classes/DirectionalLight.xml msgid "" @@ -25598,6 +26334,10 @@ msgid "" "directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " "SHADOW_PARALLEL_4_SPLITS]." msgstr "" +"La distance de la caméra à la division 1 de l'ombre. Relative à [member " +"directional_shadow_max_distance]. Seulement utilisé lorsque [member " +"directional_shadow_mode] est [constant SHADOW_PARALLEL_2_SPLITS] ou " +"[constant SHADOW_PARALLEL_4_SPLITS]." #: doc/classes/DirectionalLight.xml msgid "" @@ -25606,6 +26346,10 @@ msgid "" "directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " "SHADOW_PARALLEL_4_SPLITS]." msgstr "" +"La distance de la division 1 à la divion 2 de l'ombre. Relative à [member " +"directional_shadow_max_distance]. Seulement utilisé lorsque [member " +"directional_shadow_mode] est [constant SHADOW_PARALLEL_2_SPLITS] ou " +"[constant SHADOW_PARALLEL_4_SPLITS]." #: doc/classes/DirectionalLight.xml msgid "" @@ -25613,6 +26357,9 @@ msgid "" "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [constant SHADOW_PARALLEL_4_SPLITS]." msgstr "" +"La distance de la division 2 à la divion 3 de l'ombre. Relative à [member " +"directional_shadow_max_distance]. Seulement utilisé lorsque [member " +"directional_shadow_mode] est [constant SHADOW_PARALLEL_4_SPLITS]." #: doc/classes/DirectionalLight.xml msgid "" @@ -25642,6 +26389,8 @@ msgid "" "Keeps the shadow stable when the camera moves, at the cost of lower " "effective shadow resolution." msgstr "" +"Garde l'ombre stable lorsque la caméra se déplace, mais la résolution de " +"l'ombre se trouve réduite." #: doc/classes/DirectionalLight.xml msgid "" @@ -25649,6 +26398,10 @@ msgid "" "shadow edges. This mode typically works best in games where the camera will " "often move at high speeds, such as most racing games." msgstr "" +"Essaye d'atteindre une résolution maximale pour l'ombre. Peut faire " +"apparaitre un effet de scie sur les bords de l'ombre. Ce mode fonctionne " +"généralement mieux dans les jeux où la caméra se déplace souvent à des " +"vitesses élevées, comme la plupart des jeux de course." #: doc/classes/Directory.xml msgid "Type used to handle the filesystem." @@ -26177,6 +26930,10 @@ msgid "" "If a given character is included in more than one font, it appears only once " "in the returned string." msgstr "" +"Retourne une chaîne contenant tous les caractères disponibles dans la police " +"principale et celles de repli.\n" +"Si un caractère donné est inclus dans plus d'une police, il apparaît " +"seulement une fois dans la chaîne retournée." #: doc/classes/DynamicFont.xml msgid "Returns the fallback font at index [code]idx[/code]." @@ -26206,6 +26963,8 @@ msgid "" "Sets the spacing for [code]type[/code] (see [enum SpacingType]) to " "[code]value[/code] in pixels (not relative to the font size)." msgstr "" +"Définit l'espacement pour [code]type[/code] (voir [enum SpacingType]) à " +"[code]value[/code] en pixels (et en fonction de la taille de la police)." #: doc/classes/DynamicFont.xml msgid "Extra spacing at the bottom in pixels." @@ -26217,6 +26976,8 @@ msgid "" "This can be a negative number to make the distance between characters " "smaller." msgstr "" +"L'espacement additionnel entre chaque caratère, en pixels.\n" +"Ceci peut être un nombre négatif pour rapprocher les caractères." #: doc/classes/DynamicFont.xml msgid "" @@ -26224,6 +26985,9 @@ msgid "" "extra_spacing_char]) in pixels.\n" "This can be a negative number to make the distance between words smaller." msgstr "" +"L'espacement additionnel entre les caractères d'espace (en plus de [member " +"extra_spacing_char]), en pixels.\n" +"Cela peut être un nombre négatif pour rapprocher les mots." #: doc/classes/DynamicFont.xml msgid "Extra spacing at the top in pixels." @@ -26241,10 +27005,17 @@ msgid "" "black here, it won't be possible to change its color using a Label's font " "outline modulate theme item." msgstr "" +"La couleur du contour de la police.\n" +"[b]Note :[/b] Il est recommandé de laisser ceci à la valeur par défaut afin " +"que vous puissiez l'ajuster dans les contrôles individuels. Par exemple, si " +"le contour est déclaré ici en noir, il ne sera pas possible de modifier sa " +"couleur même en utilisant un thème pour le Label." #: doc/classes/DynamicFont.xml msgid "The font outline's thickness in pixels (not relative to the font size)." msgstr "" +"L'épaisseur du contour de la police, en pixels (et non en fonction à la " +"taille de la police)." #: doc/classes/DynamicFont.xml msgid "The font size in pixels." @@ -26265,6 +27036,9 @@ msgid "" "appearance when downscaling it if font oversampling is disabled or " "ineffective." msgstr "" +"Si [code]true[/code], les mipmaps sont utilisées. Cela améliore l'apparence " +"de la police lorsqu'elle est désactivée si le sur-échantillonnage de la " +"police est désactivé ou non utilisé." #: doc/classes/DynamicFont.xml msgid "Spacing at the top." @@ -26292,6 +27066,8 @@ msgid "" "Used with [DynamicFont] to describe the location of a vector font file for " "dynamic rendering at runtime." msgstr "" +"Utilisé avec [DynamicFont] pour décrire l'emplacement d'un fichier de police " +"vectoriel pour un rendu dynamique au lancement du projet." #: doc/classes/DynamicFontData.xml msgid "" @@ -26433,6 +27209,12 @@ msgid "" "This method should not be used for System libraries as they are already " "present on the device." msgstr "" +"Ajoute une bibliothèque dynamique (*.dylib, *.framework) au \"Linking " +"Phase\" dans le projet Xcode d'iOS et l'intègre en binaire final.\n" +"[b]Note :[/b] Pour les bibliothèques statiques (*.a), ça fonctionne de la " +"même manière que [méthode add_ios_framework].\n" +"Cette méthode ne devrait pas être utilisée pour les bibliothèques système " +"car elles sont déjà présentes sur l'appareil." #: doc/classes/EditorExportPlugin.xml msgid "" @@ -26451,6 +27233,8 @@ msgstr "" #: doc/classes/EditorExportPlugin.xml msgid "Adds a static lib from the given [code]path[/code] to the iOS project." msgstr "" +"Ajoute la bibliothèque statique à l'emplacement [code]path[/code] spécifié " +"au projet iOS." #: doc/classes/EditorExportPlugin.xml msgid "" @@ -26458,6 +27242,9 @@ msgid "" "directory of macOS app bundle.\n" "[b]Note:[/b] This is useful only for macOS exports." msgstr "" +"Ajoute le fichier ou le dossier correspondant à l'emplacement [code]path[/" +"code] au dossier [code]PlugIns[/code] de l'applications macOS.\n" +"[b]Note :[/b] Cela n'est utile que pour les exports pour macOS." #: doc/classes/EditorExportPlugin.xml msgid "" @@ -26613,6 +27400,11 @@ msgid "" "When a property is disabled, it won't appear in the inspector when selecting " "a node that extends the class specified by [code]class_name[/code]." msgstr "" +"Si [code]disable[/code] est [code]true[/code], désactive l'édition de la " +"[code]property[/code] dans la classe nommée [code]class_name[/code]. " +"Lorsqu'une propriété est désactivée, elle n'apparaît plus dans l'inspecteur " +"lors du choix d'un nÅ“ud qui étend la classe spécifiée par [code]class_name[/" +"code]." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -26726,12 +27518,17 @@ msgid "" "Notify the [EditorFileDialog] that its view of the data is no longer " "accurate. Updates the view contents on next view update." msgstr "" +"Notifie le [EditorFileDialog] que sa vue que son contenu n'est plus à jour. " +"Mettre à jour le contenu de la vue sur la prochaine mise à jour de la vue." #: doc/classes/EditorFileDialog.xml msgid "" "The location from which the user may select a file, including [code]res://[/" "code], [code]user://[/code], and the local file system." msgstr "" +"L'emplacement à partir duquel l'utilisateur peut sélectionner un fichier, y " +"compris [code]res://[/code], [code]user://[code], et le système de fichiers " +"local." #: doc/classes/EditorFileDialog.xml msgid "The currently occupied directory." @@ -26758,11 +27555,13 @@ msgid "" "The view format in which the [EditorFileDialog] displays resources to the " "user." msgstr "" +"Le format de vue dans lequel le [EditorFileDialog] affiche les ressources à " +"l'utilisateur." #: doc/classes/EditorFileDialog.xml msgid "" "The purpose of the [EditorFileDialog], which defines the allowed behaviors." -msgstr "" +msgstr "Le but du [EditorFileDialog], qui définit les comportements autorisés." #: doc/classes/EditorFileDialog.xml msgid "" @@ -26789,6 +27588,8 @@ msgid "" "The [EditorFileDialog] can select only one file. Accepting the window will " "open the file." msgstr "" +"Le [EditorFileDialog] ne peut sélectionner qu'un seul fichier. Accepter " +"cette fenêtre ouvrira le fichier sélectionné." #: doc/classes/EditorFileDialog.xml msgid "" @@ -26803,6 +27604,8 @@ msgid "" "The [EditorFileDialog] can select only one directory. Accepting the window " "will open the directory." msgstr "" +"Le [EditorFileDialog] ne peut sélectionner qu'un seul dossier. Accepter la " +"fenêtre ouvrira le dossier sélectionné." #: doc/classes/EditorFileDialog.xml msgid "" @@ -26860,6 +27663,11 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_resource_filesystem]." msgstr "" +"Cet objet contient des informations sur toutes les ressources du système de " +"fichiers, leurs types, etc.\n" +"[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " +"Accédez plutôt à l'instance unique avec [method EditorInterface." +"get_resource_filesystem]" #: doc/classes/EditorFileSystem.xml msgid "" @@ -26867,6 +27675,10 @@ msgid "" "string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/code], " "[i]not[/i] a file extension such as [code]\".gd\"[/code]." msgstr "" +"Retourne le type de ressource du fichier, spécifié par le chemin complet. " +"Ceci retourne une chaîne comme [code]\"Resource\"[/code] or " +"[code]\"GDScript\"[/code], mais [i]pas[/i] l'extension du fichier comme " +"[code]\".gd\"[/code]." #: doc/classes/EditorFileSystem.xml msgid "Gets the root directory object." @@ -26881,6 +27693,8 @@ msgstr "" #: doc/classes/EditorFileSystem.xml msgid "Returns the scan progress for 0 to 1 if the FS is being scanned." msgstr "" +"Retourne la progression de l'analyse de 0 à 1 si le système de fichiers est " +"en train d'être scanné." #: doc/classes/EditorFileSystem.xml #, fuzzy @@ -26900,10 +27714,14 @@ msgid "" "Update a file information. Call this if an external program (not Godot) " "modified the file." msgstr "" +"Met à jour les informations du fichier. Appelez cette méthode si un " +"programme externe (hors Godot) a modifié le fichier." #: doc/classes/EditorFileSystem.xml msgid "Scans the script files and updates the list of custom class names." msgstr "" +"Scanne les fichiers de script et met à jour la liste des noms de classe " +"personnalisés." #: doc/classes/EditorFileSystem.xml msgid "Emitted if the filesystem changed." @@ -26974,6 +27792,9 @@ msgid "" "[code]idx[/code]. If the file doesn't define a script class using the " "[code]class_name[/code] syntax, this will return an empty string." msgstr "" +"Retourne la classe de base de la classe de script définie dans le fichier à " +"index [code]idx[/code]. Si le fichier ne définit pas une classe de script en " +"utilisant la syntaxe [code]class_name[/code], une chaîne vide est retournée." #: doc/classes/EditorFileSystemDirectory.xml msgid "" @@ -26981,6 +27802,9 @@ msgid "" "code]. If the file doesn't define a script class using the [code]class_name[/" "code] syntax, this will return an empty string." msgstr "" +"Retourne le nom de la classe script définie dans le fichier à index " +"[code]idx[/code]. Si le fichier ne définit pas une classe de script en " +"utilisant la syntaxe [code]class_name[/code], une chaîne vide est retournée." #: doc/classes/EditorFileSystemDirectory.xml msgid "" @@ -26988,6 +27812,9 @@ msgid "" "returns a string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/" "code], [i]not[/i] a file extension such as [code]\".gd\"[/code]." msgstr "" +"Retourne le type de ressource du fichier à l'index [code]idx[/code]. Ceci " +"retourne une chaîne comme [code]\"Resource\"[/code] or [code]\"GDScript\"[/" +"code], mais [i]pas[/i] l'extension du fichier comme [code]\".gd\"[/code]." #: doc/classes/EditorFileSystemDirectory.xml msgid "Returns the name of this directory." @@ -27018,6 +27845,9 @@ msgid "" "Registers a custom resource importer in the editor. Use the class to parse " "any file and import it as a new resource type." msgstr "" +"Enregistre un importateur de ressources personnalisée dans l'éditeur. " +"Utilisez cette classe pour interpréter n'importe quel fichier pour " +"l'importer comme nouveau type de ressource." #: doc/classes/EditorImportPlugin.xml msgid "" @@ -27139,6 +27969,11 @@ msgid "" "[code]default_value[/code], [code]property_hint[/code] (optional), " "[code]hint_string[/code] (optional), [code]usage[/code] (optional)." msgstr "" +"Retourne les options et les valeurs par défaut pour le préréglage à cet " +"index. Retourne un Array de Dictionnary avec les clés suivantes : " +"[code]name[/code], [code]default_value[/code], [code]property_hint[/code] " +"(optionnel), [code]hint_string[/code] (optionnel) et [code]usage[/code] " +"(optionnel)." #: doc/classes/EditorImportPlugin.xml msgid "" @@ -27360,10 +28195,13 @@ msgid "" "by clicking the \"key\" icon next to a property when the Animation panel is " "toggled." msgstr "" +"Émis lorsqu'une propriété est utilisée comme clé dans l'inspecteur. Les " +"propriétés peuvent être utilisées comme clé en cliquant sur l'icône \"clé\" " +"à côté d'une propriété lorsque le panneau \"Animation\" est ouvert." #: doc/classes/EditorInspector.xml msgid "Emitted when a property is selected in the inspector." -msgstr "" +msgstr "Émis lorsqu'une propriété est sélectionnée dans l'inspecteur." #: doc/classes/EditorInspector.xml msgid "" @@ -27372,6 +28210,11 @@ msgid "" "code] property enabled. Since this property is always enabled in the editor " "inspector, this signal is never emitted by the editor itself." msgstr "" +"Émis lorsqu'une propriété booléenne est basculée dans l'inspecteur.\n" +"[b]Note :[/b] Ce signal n'est jamais émis si la propriété interne " +"[code]autoclear[/code] est activée. Comme cette propriété est toujours " +"activée dans l'inspecteur de l'éditeur, ce signal n'est jamais émis par " +"l'éditeur lui-même." #: doc/classes/EditorInspector.xml msgid "Emitted when a resource is selected in the inspector." @@ -27426,18 +28269,24 @@ msgstr "Les greffons de l'inspecteur" #: doc/classes/EditorInspectorPlugin.xml msgid "Adds a custom control, which is not necessarily a property editor." msgstr "" +"Ajoute un contrôle personnalisé, qui n'est pas nécessairement un éditeur de " +"propriété." #: doc/classes/EditorInspectorPlugin.xml msgid "" "Adds a property editor for an individual property. The [code]editor[/code] " "control must extend [EditorProperty]." msgstr "" +"Ajoute un éditeur de propriétés pour une seule propriété. Le contrôle " +"[code]editor[/code] doit être une sous-classe de [EditorProperty]." #: doc/classes/EditorInspectorPlugin.xml msgid "" "Adds an editor that allows modifying multiple properties. The [code]editor[/" "code] control must extend [EditorProperty]." msgstr "" +"Ajoute un éditeur qui permet de modifier plusieurs propriétés. Le contrôle " +"[code]editor[/code] doit être une sous-classe de [EditorProperty]." #: doc/classes/EditorInspectorPlugin.xml msgid "Returns [code]true[/code] if this object can be handled by this plugin." @@ -27462,6 +28311,10 @@ msgid "" "built-in editor for this property, otherwise allows to insert a custom " "editor before the built-in one." msgstr "" +"Appelé pour autoriser l'ajout d'éditeurs spécifiques à la propriété dans " +"l'inspecteur. Habituellement, ils héritent de [EditorProperty]. Retourner " +"[code]true[/code] supprimera l'éditeur intégré pour cette propriété, c'est-à -" +"dire que ça permet d'insérer un éditeur personnalisé avant l'éditeur intégré." #: doc/classes/EditorInterface.xml msgid "Godot editor's interface." @@ -27499,6 +28352,9 @@ msgid "" "Edits the given [Resource]. If the resource is a [Script] you can also edit " "it with [method edit_script] to specify the line and column position." msgstr "" +"Modifie la [Resource] donnée. Si la ressource est un [Script], vous pouvez " +"également la modifier avec [method edit_script] en spécifiant la position de " +"la ligne et de la colonne." #: doc/classes/EditorInterface.xml msgid "" @@ -27506,6 +28362,10 @@ msgid "" "can also be specified. The script will be open with the user-configured " "editor for the script's language which may be an external editor." msgstr "" +"Modifie le [Script]. La ligne et la colonne à laquelle ce script s'ouvre " +"peut également être spécifiées. Le script sera ouvert avec l'éditeur " +"configuré par l'utilisateur pour ce type de langage, où un éditeur externe " +"peut être spécifié." #: doc/classes/EditorInterface.xml msgid "" @@ -27515,10 +28375,15 @@ msgid "" "[b]Warning:[/b] Removing and freeing this node will render the editor " "useless and may cause a crash." msgstr "" +"Retourne le conteneur principal de la fenêtre de l'éditeur de Godot. Par " +"exemple, vous pouvez l'utiliser pour récupérer la taille du conteneur et " +"placer vos contrôles en conséquence.\n" +"[b]Avertissement :[/b] Enlever et libérer ce nÅ“ud rend l'éditeur inutile et " +"peut causer un plantage." #: doc/classes/EditorInterface.xml msgid "Returns the current path being viewed in the [FileSystemDock]." -msgstr "" +msgstr "Retourne l'actuel chemin en train d'être vu dans le [FileSystemDock]." #: doc/classes/EditorInterface.xml msgid "Returns the edited (current) scene's root [Node]." @@ -27533,6 +28398,13 @@ msgid "" "code] and [code]interface/editor/custom_display_scale[/code] editor " "settings. Editor must be restarted for changes to be properly applied." msgstr "" +"Retourne l'échelle actuelle de l'interface de l'éditeur ([code]1.0[/code] " +"étant une échelle à 100%). Cela peut être utilisé pour régler la position et " +"les dimensions des interfaces utilisateurs ajoutées par les greffons.\n" +"[b]Note :[/b] Cette valeur est définie par [code]interface/editor/" +"display_scale[/code] et [code]interface/editor/custom_display_scale[/code]. " +"L'éditeur doit être redémarré pour que les changements soient complètement " +"appliqués." #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorSettings] instance." @@ -27609,6 +28481,9 @@ msgid "" "[FileSystemDock]. If a file is selected, its base directory will be returned " "using [method String.get_base_dir] instead." msgstr "" +"Retourne le chemin du dossier actuellement sélectionné dans le " +"[FileSystemDock]. Si un fichier est sélectionné, son dossier de base sera " +"retourné en utilisant [method String.get_base_dir]." #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorSelection] instance." @@ -27620,6 +28495,10 @@ msgid "" "Inspector dock. If [code]inspector_only[/code] is [code]true[/code], plugins " "will not attempt to edit [code]object[/code]." msgstr "" +"Affiche la propriété donnée sur le [code]object[/code] donné dans la barre " +"d'outils de l'inspecteur de l'éditeur. Si [code]inspector_only[/code] est " +"[code]true[/code], les greffons ne tenteront pas de modifier cet " +"[code]object[/code]." #: doc/classes/EditorInterface.xml #, fuzzy @@ -27693,6 +28572,10 @@ msgid "" "([code]2D[/code], [code]3D[/code], [code]Script[/code], [code]AssetLib[/" "code])." msgstr "" +"Spécifie l'écran principal courant de l'éditeur activé avec celui nommé " +"[code]name[/code]. [code]name[/code] doit correspondre exactement au texte " +"de l'onglet en question (soit [code]2D[/code], [code]3D[/code], " +"[code]Script[/code], ou [code]AssetLib[/code])." #: doc/classes/EditorInterface.xml msgid "" @@ -27711,6 +28594,8 @@ msgid "" "If [code]true[/code], enables distraction-free mode which hides side docks " "to increase the space available for the main view." msgstr "" +"Si [code]true[/code], active le mode sans distraction qui cache les barres " +"d'outils latérales pour augmenter l'espace disponible pour la vue principale." #: doc/classes/EditorPlugin.xml msgid "Used by the editor to extend its functionality." @@ -27723,6 +28608,10 @@ msgid "" "plugins and export plugins. See also [EditorScript] to add functions to the " "editor." msgstr "" +"Les greffons sont utilisés par l'éditeur pour étendre les fonctionnalités. " +"Les types les plus courants de greffons sont ceux qui modifient un nÅ“ud " +"donné ou un type de ressource, les greffons d'importation et d'exportation. " +"Voir aussi [EditorScript] pour ajouter des fonctions à l'éditeur." #: doc/classes/EditorPlugin.xml msgid "" @@ -27879,6 +28768,9 @@ msgid "" "Registers a new [EditorSceneImporter]. Scene importers are used to import " "custom 3D asset formats as scenes." msgstr "" +"Enregistre un nouveau [EditorSceneImporter]. Les importateurs de scène sont " +"utilisés pour importer des formats d'éléments 3D personnalisés comme des " +"scènes." #: doc/classes/EditorPlugin.xml msgid "" @@ -27886,6 +28778,11 @@ msgid "" "custom gizmos to the 3D preview viewport for a [Spatial].\n" "See [method add_inspector_plugin] for an example of how to register a plugin." msgstr "" +"Enregistre un nouveau [EditorSpatialGizmoPlugin]. Les greffons du " +"manipulateur sont utilisés pour ajouter des manipulateurs personnalisés dans " +"la fenêtre d'affichage 3D pour transformer un [Spatial].\n" +"Voir [method add_inspector_greffon] pour un exemple sur comment enregistrer " +"un greffon." #: doc/classes/EditorPlugin.xml msgid "" @@ -27909,6 +28806,13 @@ msgid "" "This is used, for example, in shader editors to let the plugin know that it " "must apply the shader code being written by the user to the object." msgstr "" +"Cette méthode est appelée lorsque l'éditeur est sur le point d'enregistrer " +"le projet, passer à un autre onglet, etc. Il demande au greffon d'appliquer " +"tout changement d'état qui serait en attente pour garder une certaine " +"cohérence.\n" +"Ceci est utilisé, par exemple, dans les éditeurs d'ombres pour signaler au " +"greffon qu'il doit appliquer le shader d'ombre écrit par l'utilisateur à " +"l'objet." #: doc/classes/EditorPlugin.xml msgid "" @@ -27918,6 +28822,13 @@ msgid "" "code], the project will not run. The run is aborted immediately, so this " "also prevents all other plugins' [method build] methods from running." msgstr "" +"Cette méthode est appelée lorsque l'éditeur est sur le point de lancer le " +"projet. Le greffon peut ensuite effectuer les opérations requises avant le " +"lancement du projet.\n" +"Cette méthode doit retourner un booléen. Si cette méthode retourne " +"[code]false[/code], le projet ne sera pas lancé. Le lancement sera " +"immédiatement annulé, ce qui empêche également toutes les autres méthodes de " +"fonctionnement des greffons." #: doc/classes/EditorPlugin.xml msgid "" @@ -27925,24 +28836,34 @@ msgid "" "your plugin does not keep editing a currently existing node, or a node from " "the wrong scene." msgstr "" +"Efface tout l'état et réinitialise à zéro l'objet modifié. Cela garantit que " +"votre greffon ne maintient pas l'édition d'un nÅ“ud existant ou d'une autre " +"scène." #: doc/classes/EditorPlugin.xml msgid "" "Called by the engine when the user disables the [EditorPlugin] in the Plugin " "tab of the project settings window." msgstr "" +"Appelé par le moteur lorsque l'utilisateur désactive le [EditorPlugin] dans " +"l'onglet Greffon de la fenêtre des paramètres du projet." #: doc/classes/EditorPlugin.xml msgid "" "This function is used for plugins that edit specific object types (nodes or " "resources). It requests the editor to edit the given object." msgstr "" +"Cette fonction est utilisée pour les greffons qui modifient des types " +"d'objets spécifiques (nÅ“uds ou ressources). Il demande à l'éditeur de " +"modifier l'objet spécifié." #: doc/classes/EditorPlugin.xml msgid "" "Called by the engine when the user enables the [EditorPlugin] in the Plugin " "tab of the project settings window." msgstr "" +"Appelé par le moteur lorsque l'utilisateur active le [EditorPlugin] dans " +"l'onglet Greffon de la fenêtre des paramètres du projet." #: doc/classes/EditorPlugin.xml msgid "" @@ -27989,6 +28910,11 @@ msgid "" "You need to enable calling of this method by using [method " "set_force_draw_over_forwarding_enabled]." msgstr "" +"Cette méthode est la même que [method forward_canvas_draw_over_viewport], " +"sauf qu'elle est dessinée au-dessus de tout le reste. Utile quand vous avez " +"besoin d'une calque supplémentaire qui s'affiche par dessus les autres.\n" +"Vous devez activer l'appel de cette méthode en utilisant [method " +"set_force_draw_over_forwarding_enabled]." #: doc/classes/EditorPlugin.xml msgid "" @@ -28079,6 +29005,11 @@ msgid "" "You need to enable calling of this method by using [method " "set_force_draw_over_forwarding_enabled]." msgstr "" +"Cette méthode est la même que [method forward_spatial_draw_over_viewport], " +"sauf qu'elle est dessinée au-dessus de tout le reste. Utile quand vous avez " +"besoin d'une calque supplémentaire qui s'affiche par dessus les autres.\n" +"Vous devez activer l'appel de cette méthode en utilisant [method " +"set_force_draw_over_forwarding_enabled]." #: doc/classes/EditorPlugin.xml msgid "" @@ -28132,6 +29063,9 @@ msgid "" "breakpoints in the format ([code]script:line[/code]), for example: " "[code]res://path_to_script.gd:25[/code]." msgstr "" +"C'est pour les éditeurs qui modifient des objets basés sur des scripts. Vous " +"pouvez retourner une liste de points d'arrêt avec le format ([code]script:" +"line[/code]), par exemple : [code]res://path_to_script.gd:25[/code]." #: doc/classes/EditorPlugin.xml msgid "" @@ -28318,6 +29252,11 @@ msgid "" "Remember that you have to manage the visibility of all your editor controls " "manually." msgstr "" +"Cette fonction sera appelée lorsqu'il est demandé à l'éditeur de devenir " +"visible. Il est utilisé pour les greffons qui modifient un type d'objet " +"spécifique.\n" +"Rappelez-vous que vous devez gérer manuellement la visibilité de tous les " +"contrôles de votre éditeur." #: doc/classes/EditorPlugin.xml msgid "Queue save the project's editor layout." @@ -28390,6 +29329,9 @@ msgid "" "This method is called after the editor saves the project or when it's " "closed. It asks the plugin to save edited external scenes/resources." msgstr "" +"Cette méthode est appelée après que l'éditeur enregistre le projet ou " +"lorsqu'il est fermé. Il demande au greffon d'enregistrer les scènes et " +"ressources externes modifiées." #: doc/classes/EditorPlugin.xml msgid "" @@ -28398,6 +29340,11 @@ msgid "" "editor when their viewports are updated. You need to call this method only " "once and it will work permanently for this plugin." msgstr "" +"Permet d'appeler [method forward_canvas_force_draw_over_viewport] pour " +"l'éditeur 2D et [method forward_spatial_force_draw_over_viewport] pour " +"l'éditeur 3D lorsque leurs fenêtres d'affichage sont mises à jour. Vous " +"devez appeler cette méthode qu'une seule fois, et ça fonctionnera en " +"permanence pour ce greffon." #: doc/classes/EditorPlugin.xml msgid "" @@ -28405,6 +29352,9 @@ msgid "" "inside [method forward_spatial_gui_input]. It might be especially usable if " "your plugin will want to use raycast in the scene." msgstr "" +"Utilisez cette méthode si vous voulez toujours recevoir les entrées dans " +"l'écran d'aperçu 3D dans [method forward_spatial_gui_input]. Ça peut être " +"utile si votre greffon veut utiliser un Raycast dans la scène." #: doc/classes/EditorPlugin.xml msgid "" @@ -28461,6 +29411,11 @@ msgid "" "forward_spatial_draw_over_viewport] and [method " "forward_spatial_force_draw_over_viewport] to be called." msgstr "" +"Met à jour des sur-couches de l'éditeur 2D et 3D. Fait que les méthodes " +"[method forward_canvas_draw_over_viewport], [method " +"forward_canvas_force_draw_over_viewport], [method " +"forward_spatial_draw_over_viewport] et [method " +"forward_spatial_force_draw_over_port] seront appelées." #: doc/classes/EditorPlugin.xml msgid "" @@ -28477,6 +29432,9 @@ msgid "" "the root node of the scene that has just become active. If this scene is new " "and empty, the argument will be [code]null[/code]." msgstr "" +"Émis lorsque la scène est changée dans l'éditeur. L'argument retournera le " +"nÅ“ud racine de la scène qui vient de devenir active. Si cette scène est " +"nouvelle et vide, l'argument sera [code]null[/code]." #: doc/classes/EditorPlugin.xml msgid "" @@ -28508,6 +29466,8 @@ msgid "" "If any of the controls added can gain keyboard focus, add it here. This " "ensures that focus will be restored if the inspector is refreshed." msgstr "" +"Si l'un des contrôles ajoutés peut récupérer le focus du clavier, ajoutez-le " +"ici. Cela permettra de rétablir le focus si l'inspecteur est mis à jour." #: doc/classes/EditorProperty.xml msgid "" @@ -28517,6 +29477,11 @@ msgid "" "requesting this property to be refreshed (leave as [code]false[/code] if " "unsure)." msgstr "" +"Si une ou plusieurs propriétés ont changé, cela doit être appelé. " +"[code]field[/code] est utilisé au cas où votre éditeur peut modifier les " +"champs séparément (par exemple : Vector3.x) L'argument [code]changing[/code] " +"évite à l'éditeur de demander que cette propriété soit rafraîchie (laissez-" +"le à [code]false[/code] en cas de doute)." #: doc/classes/EditorProperty.xml msgid "Gets the edited object." @@ -28528,16 +29493,23 @@ msgid "" "[method EditorInspectorPlugin.parse_property]), then this will return the " "property." msgstr "" +"Retourne la propriété modifiée. Si votre éditeur n'est que pour une seule " +"propriété (ajouté par [method EditorInspectorPlugin.parse_property]), cela " +"retournera la propriété." #: doc/classes/EditorProperty.xml msgid "Must be implemented to provide a custom tooltip to the property editor." msgstr "" +"Doit être implémenté pour fournir un outil personnalisé dans l'éditeur de " +"propriété." #: doc/classes/EditorProperty.xml msgid "" "Puts the [code]editor[/code] control below the property label. The control " "must be previously added using [method Node.add_child]." msgstr "" +"Place le contrôle [code]editor[/code] sous le label de la propriété. Le " +"contrôle doit d'abord être ajouté avec [method Node.add_child]" #: doc/classes/EditorProperty.xml msgid "When this virtual function is called, you must update your editor." @@ -28550,11 +29522,15 @@ msgid "" "Used by the inspector, set to [code]true[/code] when the property is " "checkable." msgstr "" +"Utilisé par l'inspecteur, défini à [code]true[/code] lorsque la propriété " +"peut être cochée." #: doc/classes/EditorProperty.xml msgid "" "Used by the inspector, set to [code]true[/code] when the property is checked." msgstr "" +"Utilisé par l'inspecteur, défini à [code]true[/code] quand la propriété est " +"cochée." #: doc/classes/EditorProperty.xml msgid "" @@ -28562,6 +29538,9 @@ msgid "" "with the editor theme's warning color. This is used for editable children's " "properties." msgstr "" +"Utilisé par l'inspecteur, définit à [code]true[/code] quand la propriété est " +"affiché avec la couleur d'avertissement de l'éditeur. Ceci est utilisé pour " +"les propriétés modifiables pour les nÅ“uds enfants." #: doc/classes/EditorProperty.xml msgid "" @@ -28582,16 +29561,23 @@ msgid "" "Used by the inspector, set to [code]true[/code] when the property is read-" "only." msgstr "" +"Utilisé par l'inspecteur, défini à [code]true[/code] quand la propriété est " +"en lecture-seule." #: doc/classes/EditorProperty.xml msgid "" "Emit it if you want multiple properties modified at the same time. Do not " "use if added via [method EditorInspectorPlugin.parse_property]." msgstr "" +"Emettez-le si vous voulez plusieurs propriétés modifiées en même temps. Ne " +"pas utiliser s'il a été ajouté avec [method EditorInspectorPlugin." +"parse_property]" #: doc/classes/EditorProperty.xml msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." msgstr "" +"Utilisé par des sous-inspecteurs. Émettez-le si l'identifiant d'un Object a " +"été sélectionné." #: doc/classes/EditorProperty.xml msgid "" @@ -28609,10 +29595,14 @@ msgid "" "Emit it if you want to add this value as an animation key (check for keying " "being enabled first)." msgstr "" +"Émettez-le si vous voulez ajouter cette valeur comme clé d'animation " +"(vérifiez que la clé est d'abord activée)." #: doc/classes/EditorProperty.xml msgid "Emit it if you want to key a property with a single value." msgstr "" +"Emettez-le si vous voulez définir une clé pour cette propriété avec une " +"valeur unique." #: doc/classes/EditorProperty.xml msgid "" @@ -28622,6 +29612,11 @@ msgid "" "instantiated and can come from an ancestor scene in the inheritance/" "instancing chain, a script or a builtin class." msgstr "" +"Émettez-le si vous voulez marquer (ou dé-marquer) la valeur d'une propriété " +"pour être sauvegardée peu importe si elle est égale à la valeur par défaut.\n" +"La valeur par défaut est celle que la propriété obtiendra lorsque le nÅ“ud " +"est juste instancié et peut venir d'une scène instanciée ou héritée, d'un " +"script ou d'une classe intégrée." #: doc/classes/EditorProperty.xml msgid "" @@ -28649,6 +29644,13 @@ msgid "" "[b]Note:[/b] This [Control] does not include any editor for the resource, as " "editing is controlled by the Inspector dock itself or sub-Inspectors." msgstr "" +"Ce nÅ“ud [Control] est utilisé dans la barre d'outils de l'inspecteur de " +"l'éditeur pour permettre l'édition des propriétés de type [Resource]. Il " +"offre des options pour créer, charger, enregistrer et convertir des " +"ressources. Peut être utilisé avec [EditorInspectorPlugin] pour recréer le " +"même comportement.\n" +"[b]Note :[/b] Ce [Control] n'inclut aucun éditeur de la ressource, car " +"l'édition est contrôlée par l'inspecteur lui-même ou les sous-inspecteurs." #: doc/classes/EditorResourcePicker.xml msgid "" @@ -28656,12 +29658,17 @@ msgid "" "[member base_type]. If the [member base_type] is empty, an empty list is " "returned." msgstr "" +"Retourne une liste de tous les types et sous-types autorisés correspondant " +"au [member base_type]. Si le [member base_type] est vide, une liste vide est " +"retournée." #: doc/classes/EditorResourcePicker.xml msgid "" "This virtual method can be implemented to handle context menu items not " "handled by default. See [method set_create_options]." msgstr "" +"Cette méthode virtuelle peut être implémentée pour gérer les éléments du " +"menu contextuel non gérés par défaut. Voir [method set_create_options]." #: doc/classes/EditorResourcePicker.xml msgid "" @@ -28672,12 +29679,20 @@ msgid "" "[b]Note:[/b] Implement [method handle_menu_selected] to handle these custom " "items." msgstr "" +"Cette méthode virtuelle est appelée lors de la mise à jour du menu " +"contextuel de [EditorResourcePicker]. Implémenter cette méthode pour " +"remplacer les éléments dans « Nouveau... » par vos propres options. " +"[code]menu_nÅ“ud[/code] est une référence au nÅ“ud [PopupMenu].\n" +"[b]Note :[/b] Implémentez [method handle_menu_sélection] pour traiter ces " +"éléments personnalisés." #: doc/classes/EditorResourcePicker.xml msgid "" "Sets the toggle mode state for the main button. Works only if [member " "toggle_mode] is set to [code]true[/code]." msgstr "" +"Définit l'état du mode de basculement pour le bouton principal. Fonctionne " +"uniquement si [member toggle_mode] est défini à [code]true[/code]." #: doc/classes/EditorResourcePicker.xml msgid "" @@ -28700,6 +29715,9 @@ msgid "" "If [code]true[/code], the main button with the resource preview works in the " "toggle mode. Use [method set_toggle_pressed] to manually set the state." msgstr "" +"Si [code]true[/code], le bouton principal avec la prévisualisation des " +"ressources fonctionne avec le mode de basculement. Utilisez [method " +"set_toggle_pressed] pour définir manuellement cet état." #: doc/classes/EditorResourcePicker.xml #, fuzzy @@ -28712,6 +29730,9 @@ msgid "" "[code]edit[/code] is [code]true[/code], the signal was caused by the context " "menu \"Edit\" option." msgstr "" +"Émis lorsque la valeur de ressource a été définie et que l'utilisateur a " +"cliqué pour la modifier. Lorsque [code]edit[/code] est [code]true[/code], le " +"signal a été causé par le menu contextuel \"Édition\"." #: doc/classes/EditorResourcePreview.xml msgid "Helper to generate previews of resources or files." @@ -28723,6 +29744,11 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_resource_previewer]." msgstr "" +"Cet objet est utilisé pour générer des aperçus pour les ressources de " +"fichiers.\n" +"[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " +"Accédez plutôt à l'instance unique en utilisant [method EditorInterface." +"get_resource_previewer]" #: doc/classes/EditorResourcePreview.xml msgid "Create an own, custom preview generator." @@ -28733,6 +29759,8 @@ msgid "" "Check if the resource changed, if so, it will be invalidated and the " "corresponding signal emitted." msgstr "" +"Vérifiez si la ressource a changé, si oui, elle sera invalidée et le signal " +"correspondant émis." #: doc/classes/EditorResourcePreview.xml msgid "" @@ -28792,6 +29820,8 @@ msgid "" "Emitted if a preview was invalidated (changed). [code]path[/code] " "corresponds to the path of the preview." msgstr "" +"Émis si un aperçu a été invalidé (c'est-à -dire changé). [code]path[/code] " +"correspond au chemin de l'aperçu." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "Custom generator of previews." @@ -28803,6 +29833,9 @@ msgid "" "thumbnail_size[/code] in [EditorSettings] to find out the right size to do " "previews at." msgstr "" +"Le Code personnalisé pour générer des aperçus. Veuillez cocher " +"[code]file_dialog/thumbnail_size[/code] dans [EditorSettings] pour connaître " +"la taille correcte des prévisualisations." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "" @@ -28925,6 +29958,10 @@ msgid "" "to [EditorSceneImporterGLTF] within a script will cause an error in an " "exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les éditeurs. Le " +"chargement et l'enregistrement au format glTF [i]n'est pas[/i] disponible " +"dans les projets exportés. Les références à [EditorSceneImporterGLTF] dans " +"un script provoquent une erreur dans un projet exporté." #: doc/classes/EditorScenePostImport.xml msgid "Post-processes scenes after import." @@ -29001,6 +30038,8 @@ msgid "" "Called after the scene was imported. This method must return the modified " "version of the scene." msgstr "" +"Appelé après l'importation de la scène. Cette méthode doit retourner la " +"version modifiée de la scène." #: doc/classes/EditorScript.xml msgid "Base script that can be used to add extension functions to the editor." @@ -29057,6 +30096,10 @@ msgid "" "Adds [code]node[/code] as a child of the root node in the editor context.\n" "[b]Warning:[/b] The implementation of this method is currently disabled." msgstr "" +"Ajoute [code]node[/code] comme enfant du nÅ“ud racine dans le contexte de " +"l'éditeur.\n" +"[b]Avertissement :[/b] L'implémentation de cette méthode est actuellement " +"désactivée." #: doc/classes/EditorScript.xml msgid "Returns the [EditorInterface] singleton instance." @@ -29071,6 +30114,8 @@ msgid "" "Godot editor's control for selecting the [code]script[/code] property of a " "[Node]." msgstr "" +"Le contrôle de l'éditeur Godot pour sélectionner la propriété [code]script[/" +"code] d'un [Node]." #: doc/classes/EditorScriptPicker.xml msgid "" @@ -29107,6 +30152,10 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_selection]." msgstr "" +"Cet objet gère la sélection dans le SceneTree dans l'éditeur.\n" +"[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " +"Accédez plutôt à l'instance unique en utilisant [method EditorInterface." +"get_selection]" #: doc/classes/EditorSelection.xml msgid "" @@ -29115,6 +30164,10 @@ msgid "" "inspector. If you want to edit a node, use [method EditorInterface." "edit_node]." msgstr "" +"Ajoute un nÅ“ud à la sélection.\n" +"[b]Note :[/b] Le nouveau nÅ“ud sélectionné ne sera pas automatiquement " +"modifié dans l'inspecteur. Si vous souhaitez modifier un nÅ“ud, utilisez " +"[method EditorInterface.edit_nÅ“ud]." #: doc/classes/EditorSelection.xml msgid "Clear the selection." @@ -29130,6 +30183,10 @@ msgid "" "moving them, rotating, etc). This list avoids situations where a node is " "selected and also child/grandchild." msgstr "" +"Retourne la liste des nÅ“uds sélectionnés, optimisés pour les opérations de " +"transformation (c'est-à -dire le fait de les déplacer, les faire pivoter, " +"etc.). Cette liste évite les situations où un nÅ“ud est sélectionné et mais " +"aussi ses descendants." #: doc/classes/EditorSelection.xml msgid "Removes a node from the selection." @@ -29244,6 +30301,10 @@ msgid "" "[code]key[/code] specified. If the metadata doesn't exist, [code]default[/" "code] will be returned instead. See also [method set_project_metadata]." msgstr "" +"Retourne les métadonnées spécifiques au projet pour la [code]section[/code] " +"et [code]key[/code] spécifiées. Si les métadonnées n'existent pas, " +"[code]default[/code] sera retourné à la place. Voir aussi [method " +"set_project_metadata]." #: doc/classes/EditorSettings.xml msgid "" @@ -29268,6 +30329,8 @@ msgid "" "Returns the value of the setting specified by [code]name[/code]. This is " "equivalent to using [method Object.get] on the EditorSettings instance." msgstr "" +"Retourne la valeur du paramètre spécifié par [code]name[/code]. Ceci est " +"équivalent à l'utiliser [method Object.get] sur l'instance EditorSettings." #: doc/classes/EditorSettings.xml msgid "" @@ -29297,6 +30360,10 @@ msgid "" "When this method returns [code]true[/code], a Revert button will display " "next to the setting in the Editor Settings." msgstr "" +"Retourne [code]true[/code] si le paramètre spécifié par [code]name[/code] " +"peut avoir sa valeur rétablie à cette par défaut, ou [code]false[/code] " +"sinon. Lorsque cette méthode retourne [code]true[/code], un bouton Rétablir " +"s'affichera à côté du réglage dans les paramètres de l'éditeur." #: doc/classes/EditorSettings.xml msgid "" @@ -29304,6 +30371,9 @@ msgid "" "This is the value that would be applied when clicking the Revert button in " "the Editor Settings." msgstr "" +"Retourne la valeur par défaut du paramètre spécifié par [code]name[/code]. " +"C'est la valeur qui sera appliquée en cliquant sur le bouton Rétablir dans " +"les paramètres de l'éditeur." #: doc/classes/EditorSettings.xml msgid "Sets the list of favorite files and directories for this project." @@ -29329,6 +30399,11 @@ msgid "" "project folder and therefore won't be checked into version control. See also " "[method get_project_metadata]." msgstr "" +"Définit des métadonnées spécifiques au projet dans la [code]section[/code], " +"la [code]key[/code] et les [code]data[/code] spécifiées. Ces métadonnées " +"sont enregistrées à l'extérieur du dossier du projet, et donc pas dans le " +"système de contrôle de version (Git, etc.). Voir aussi [method " +"get_project_metadata]." #: doc/classes/EditorSettings.xml msgid "" @@ -29344,6 +30419,9 @@ msgid "" "This is equivalent to using [method Object.set] on the EditorSettings " "instance." msgstr "" +"Définit la [code]value[/code] du paramètre nommé [code]name[/code]. Cela " +"équivaut à l'utilisation de [method Object.set] sur l'instance " +"EditorSettings." #: doc/classes/EditorSettings.xml msgid "Emitted after any editor setting has changed." @@ -29355,6 +30433,9 @@ msgid "" "plugins to update their visuals on theme changes or logic on configuration " "changes." msgstr "" +"Émis après que n'importe quel réglage de l'édiateur a changé. Il est utilisé " +"par divers greffons de l'éditeurs pour mettre à jour leur affichage lors de " +"changements de thème ou de configuration." #: doc/classes/EditorSpatialGizmo.xml msgid "Custom gizmo for editing Spatial objects." @@ -29366,12 +30447,18 @@ msgid "" "(handles) for 3D Spatial objects. See [EditorSpatialGizmoPlugin] for more " "information." msgstr "" +"Un manipulateur personnalisé qui est utilisé pour la visualisation et " +"l'édition personnalisées (poignets) pour les objets 3D de type Spatial. Voir " +"[EditorSpatialGizmoPlugin] pour plus d'informations." #: doc/classes/EditorSpatialGizmo.xml msgid "" "Adds the specified [code]segments[/code] to the gizmo's collision shape for " "picking. Call this function during [method redraw]." msgstr "" +"Ajoute le [code]segments[/code] spécifié à la forme de collision du " +"manipulateur pour la sélection. Appelez cette fonction durant [method " +"redraw]." #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -29379,6 +30466,9 @@ msgid "" "generated from a regular [Mesh] too. Call this function during [method " "redraw]." msgstr "" +"Ajoute des triangles de collision au manipulateur pour la sélection. Un " +"[TriangleMesh] peut être généré à partir d'un [Mesh] régulier. Appelez cette " +"fonction durant [method redraw]." #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -29387,6 +30477,10 @@ msgid "" "There are virtual functions which will be called upon editing of these " "handles. Call this function during [method redraw]." msgstr "" +"Ajoute une liste de poignées (points) qui peuvent être utilisées pour " +"déformer l'objet en cours d'édition.\n" +"Il y a des fonctions virtuelles qui seront appelés à l'édition de ces " +"poignées. Appelez cette fonction durant [method redraw]." #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -29394,6 +30488,9 @@ msgid "" "lines are used for visualizing the gizmo. Call this function during [method " "redraw]." msgstr "" +"Ajoute des lignes au gizmo (une liste de paires de points), avec un matériau " +"donné. Les lignes sont utilisées pour visualiser le manipulateur. Appelez " +"cette fonction durant [method redraw]." #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -29402,6 +30499,11 @@ msgid "" "is [code]true[/code], the mesh will rotate to always face the camera. Call " "this function during [method redraw]." msgstr "" +"Ajoute un maillage au manipulateur avec l'état [code]billboard[/code] " +"spécifié, [code]skeleton[/code] et [code]material[/code]. Si " +"[code]billboard[/code] est [code]true[/code], le maillage tourne pour " +"toujours faire toujours face à la caméra. Appelez cette fonction durant " +"[method redraw]." #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -29430,18 +30532,28 @@ msgid "" "by [method add_handles]).\n" "Handles can be named for reference to the user when editing." msgstr "" +"Retourne le nom d'une poignée modifiée (ces poignées doivent d'abord être " +"ajoutées avec [méthode add_handles]).\n" +"Les poignées peuvent être nommées pour référence à l'utilisateur lors de " +"l'édition." #: doc/classes/EditorSpatialGizmo.xml msgid "" "Gets actual value of a handle. This value can be anything and used for " "eventually undoing the motion when calling [method commit_handle]." msgstr "" +"Retourne la valeur réelle d'une poignée. Cette valeur peut être n'importe " +"quoi et utilisée pour finalement annuler le mouvement en appelant [method " +"commit_handle]." #: doc/classes/EditorSpatialGizmo.xml msgid "" "Returns the [EditorSpatialGizmoPlugin] that owns this gizmo. It's useful to " "retrieve materials using [method EditorSpatialGizmoPlugin.get_material]." msgstr "" +"Retourne le [EditorSpatialGizmoPlugin] qui possède ce manipulateur. Il est " +"utile de récupérer les matériaux en utilisant [method " +"EditorSpatialGizmoPlugin.get_material]" #: doc/classes/EditorSpatialGizmo.xml #, fuzzy @@ -29524,6 +30636,9 @@ msgid "" "nodes of your choice, return [code]null[/code] for the rest of nodes. See " "also [method has_gizmo]." msgstr "" +"Surchargez cette méthode pour retourner un [EditorSpatialGizmo] personnalisé " +"pour les nÅ“uds spatiaux de votre choix, retourner [code]null[/code] pour le " +"reste des nÅ“uds. Voir aussi [method has_gizmo]." #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -29533,6 +30648,12 @@ msgid "" "Should not be overridden.\n" "You can optionally provide a texture to use instead of the default icon." msgstr "" +"Crée un matériau de poignée avec ses variantes (sélectionnées et/ou " +"modifiables) et les ajoute à la liste interne des matériaux. Ils peuvent " +"ensuite être consultés avec [method get_material] et utilisés dans [method " +"EditorSpatialGizmo.add_handles] Ne devrait pas être surchargé.\n" +"Vous pouvez en option fournir une texture à utiliser à la place de l'icône " +"par défaut." #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -29541,6 +30662,10 @@ msgid "" "[method get_material] and used in [method EditorSpatialGizmo." "add_unscaled_billboard]. Should not be overridden." msgstr "" +"Crée un matériau d'icône avec ses variantes (sélectionnées et/ou " +"modifiables) et les ajoute à la liste interne des matériaux. Ils peuvent " +"ensuite être consultés avec [method get_material] et utilisés dans [method " +"EditorSpatialGizmo.add_unscaled_billboard]. Ne devrait pas être surchargé." #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -29549,6 +30674,11 @@ msgid "" "[method get_material] and used in [method EditorSpatialGizmo.add_mesh] and " "[method EditorSpatialGizmo.add_lines]. Should not be overridden." msgstr "" +"Crée un matériau non éclairé avec ses variantes (sélectionnées et/ou " +"modifiables) et les ajoute à la liste interne des matériaux. Ils peuvent " +"ensuite être consultés avec [method get_material] et utilisés dans [method " +"EditorSpatialGizmo.add_mesh] et [method EditorSpatialGizmo.add_lines]. Ne " +"devrait pas être dépassé." #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -36815,13 +37945,14 @@ msgstr "Nombre maximal de redirections autorisées." #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -38376,9 +39507,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -39018,10 +40149,13 @@ msgstr "Type d’évènement d’entrée pour les évènements de mouvement de s msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -39033,6 +40167,15 @@ msgid "Mouse and input coordinates" msgstr "Les coordonnées de la souris" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"Retourne le nombre de disposition de clavier.\n" +"[b]Note :[/b] Cette méthode est implémentée sous Linux, macOS et Windows." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -55463,6 +56606,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "Change l'octet à la position donnée." +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "Retire l' élément du tableau à l'index donné." + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -59009,9 +60160,8 @@ msgid "Optional name for the 3D render layer 13." msgstr "Le nom facultatif pour le calque 13 de rendu 3D." #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "Optional name for the 3D render layer 14." -msgstr "Le nom facultatif pour le calque 14 de rendu 3D" +msgstr "Le nom facultatif pour le calque 14 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 15." @@ -65245,7 +66395,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -65285,15 +66436,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -66922,11 +68074,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "La [Transform] globale de ce nÅ“ud." #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -78161,11 +79332,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -78246,8 +79417,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/gl.po b/doc/translations/gl.po index 3273cd8f98..17fb042ad7 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -9966,7 +9966,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10131,7 +10137,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28411,13 +28423,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29831,9 +29844,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30407,10 +30420,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30423,6 +30439,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45290,6 +45312,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54214,7 +54243,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54254,15 +54284,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55738,11 +55769,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65759,11 +65809,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65843,8 +65893,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/hi.po b/doc/translations/hi.po index 361c131a40..98778940cf 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -9965,7 +9965,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10130,7 +10136,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28410,13 +28422,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29830,9 +29843,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30406,10 +30419,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30422,6 +30438,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45289,6 +45311,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54213,7 +54242,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54253,15 +54283,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55737,11 +55768,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65758,11 +65808,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65842,8 +65892,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/hu.po b/doc/translations/hu.po index 2732b7b56a..325d7d0f52 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -9984,7 +9984,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10149,7 +10155,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28429,13 +28441,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29849,9 +29862,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30425,10 +30438,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30441,6 +30457,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45308,6 +45330,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54232,7 +54261,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54272,15 +54302,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55756,11 +55787,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65777,11 +65827,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65861,8 +65911,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/id.po b/doc/translations/id.po index efc379cffd..eb95a98f22 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -15,12 +15,13 @@ # ProgrammerIndonesia 44 <elo.jhy@gmail.com>, 2022. # Reza Almanda <rezaalmanda27@gmail.com>, 2022. # Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>, 2022. +# yusuf afandi <afandi.yusuf.04@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-28 14:11+0000\n" -"Last-Translator: Reza Almanda <rezaalmanda27@gmail.com>\n" +"PO-Revision-Date: 2022-07-09 21:12+0000\n" +"Last-Translator: yusuf afandi <afandi.yusuf.04@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/id/>\n" "Language: id\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -122,7 +123,7 @@ msgstr "Metode ini menerima sejumlah argumen setelah yang dijelaskan di sini." #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "" +msgstr "Metode ini digunakan untuk mengkonstruksi sebuah tipe." #: doc/tools/make_rst.py msgid "" @@ -10377,7 +10378,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10542,7 +10549,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28835,13 +28848,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30255,9 +30269,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30831,10 +30845,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30847,6 +30864,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45755,6 +45778,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54682,7 +54712,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54722,15 +54753,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56206,11 +56238,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66234,11 +66285,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66318,8 +66369,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/is.po b/doc/translations/is.po index bdd631ef18..c68a096dfa 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -9965,7 +9965,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10130,7 +10136,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28410,13 +28422,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29830,9 +29843,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30406,10 +30419,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30422,6 +30438,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45289,6 +45311,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54213,7 +54242,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54253,15 +54283,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55737,11 +55768,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65758,11 +65808,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65842,8 +65892,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/it.po b/doc/translations/it.po index 3d9cd62b30..fd78bc8f1c 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -10991,7 +10991,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -11156,7 +11162,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -29595,13 +29607,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -31020,9 +31033,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -31597,10 +31610,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31612,6 +31628,13 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -46611,6 +46634,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -55551,7 +55581,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55591,15 +55622,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57077,11 +57109,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -67192,11 +67243,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -67276,8 +67327,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ja.po b/doc/translations/ja.po index 8ace2ec0c8..324df4d9ae 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -12677,8 +12677,14 @@ msgstr "" "ã¾ã™ã€‚" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." -msgstr "ã“ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãŒå†ç”Ÿã•れã¦ã„ã‚‹ãƒã‚¹ã€‚" +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer.xml msgid "" @@ -12860,9 +12866,14 @@ msgstr "" "ã¾ã™ã€‚" #: doc/classes/AudioStreamPlayer3D.xml -#, fuzzy -msgid "The bus on which this audio is playing." -msgstr "ã“ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãŒå†ç”Ÿã•れã¦ã„ã‚‹ãƒã‚¹ã€‚" +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -31648,13 +31659,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -33082,9 +33094,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -33658,10 +33670,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -33673,6 +33688,14 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"æ–‡å—列ã®é•·ã•㌠[code]0[/code] ã«ç‰ã—ã‘れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -48785,6 +48808,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "インデックスã«ã‚ˆã‚Šé…列ã‹ã‚‰è¦ç´ を削除ã—ã¾ã™ã€‚" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -57800,7 +57831,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57840,15 +57872,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -59334,11 +59367,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -69788,11 +69840,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -69872,8 +69924,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ko.po b/doc/translations/ko.po index bd808074b9..2f6879593c 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -10141,7 +10141,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10306,7 +10312,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28713,13 +28725,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30141,9 +30154,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30717,10 +30730,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30733,6 +30749,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45796,6 +45818,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54725,7 +54754,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54765,15 +54795,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56249,11 +56280,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66291,11 +66341,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66375,8 +66425,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/lt.po b/doc/translations/lt.po index 2de21d55b3..2468d389d3 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -9975,7 +9975,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10140,7 +10146,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28420,13 +28432,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29840,9 +29853,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30416,10 +30429,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30432,6 +30448,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45299,6 +45321,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54223,7 +54252,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54263,15 +54293,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55747,11 +55778,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65768,11 +65818,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65852,8 +65902,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 45e3188446..9faf7fd017 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -9980,7 +9980,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10145,7 +10151,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28428,13 +28440,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29848,9 +29861,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30424,10 +30437,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30440,6 +30456,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45307,6 +45329,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54231,7 +54260,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54271,15 +54301,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55755,11 +55786,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65776,11 +65826,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65860,8 +65910,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/mr.po b/doc/translations/mr.po index b943c79052..c989fcc549 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -9963,7 +9963,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10128,7 +10134,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28408,13 +28420,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29828,9 +29841,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30404,10 +30417,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30420,6 +30436,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45287,6 +45309,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54211,7 +54240,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54251,15 +54281,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55735,11 +55766,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65756,11 +65806,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65840,8 +65890,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 53fca58f26..8017f4006b 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -9975,7 +9975,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10140,7 +10146,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28420,13 +28432,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29840,9 +29853,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30416,10 +30429,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30432,6 +30448,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45299,6 +45321,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54223,7 +54252,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54263,15 +54293,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55747,11 +55778,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65768,11 +65818,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65852,8 +65902,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ne.po b/doc/translations/ne.po index 24062d3cff..9a17a51fb6 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -9963,7 +9963,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10128,7 +10134,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28408,13 +28420,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29828,9 +29841,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30404,10 +30417,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30420,6 +30436,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45287,6 +45309,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54211,7 +54240,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54251,15 +54281,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55735,11 +55766,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65756,11 +65806,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65840,8 +65890,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/nl.po b/doc/translations/nl.po index b2066a5491..d36175b6c2 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -10032,7 +10032,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10197,7 +10203,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28480,13 +28492,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29900,9 +29913,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30476,10 +30489,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30492,6 +30508,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45359,6 +45381,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54284,7 +54313,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54324,15 +54354,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55808,11 +55839,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65829,11 +65879,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65913,8 +65963,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/pl.po b/doc/translations/pl.po index b28e575320..343dfb0050 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -10471,7 +10471,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10636,7 +10642,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28986,13 +28998,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30409,9 +30422,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30985,10 +30998,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31001,6 +31017,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -46003,6 +46025,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54943,7 +54972,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54983,15 +55013,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56468,11 +56499,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66529,11 +66579,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66613,8 +66663,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/pt.po b/doc/translations/pt.po index 99537cdd6b..fdb01b1579 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -10787,7 +10787,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10952,7 +10958,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -29301,13 +29313,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30721,9 +30734,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -31297,10 +31310,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31313,6 +31329,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -46238,6 +46260,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -55231,7 +55260,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55271,15 +55301,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56757,11 +56788,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66821,11 +66871,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66905,8 +66955,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index b432963519..50d4359c46 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -11025,7 +11025,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -11190,7 +11196,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -29629,13 +29641,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -31054,9 +31067,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -31630,10 +31643,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31646,6 +31662,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -46651,6 +46673,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -55595,7 +55624,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55635,15 +55665,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57123,11 +57154,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -67221,11 +67271,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -67305,8 +67355,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ro.po b/doc/translations/ro.po index 068587e37a..8c7112f102 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -9995,7 +9995,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10160,7 +10166,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28443,13 +28455,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29863,9 +29876,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30439,10 +30452,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30455,6 +30471,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45323,6 +45345,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54247,7 +54276,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54287,15 +54317,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55771,11 +55802,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65792,11 +65842,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65876,8 +65926,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/ru.po b/doc/translations/ru.po index 6455a611e5..1596ca8553 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -11644,7 +11644,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -11809,7 +11815,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -30308,13 +30320,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -31732,9 +31745,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -32308,10 +32321,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -32323,6 +32339,15 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -47447,6 +47472,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "УдалÑет Ñлемент из маÑÑива по индекÑу." + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -56470,7 +56503,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56510,15 +56544,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58001,11 +58036,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -68262,11 +68316,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -68346,8 +68400,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/sk.po b/doc/translations/sk.po index 4964bf3ce0..38e701eef9 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -9966,7 +9966,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10131,7 +10137,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28414,13 +28426,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29834,9 +29847,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30410,10 +30423,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30426,6 +30442,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45293,6 +45315,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54217,7 +54246,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54257,15 +54287,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55741,11 +55772,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65762,11 +65812,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65846,8 +65896,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index 89efbf0d11..3984d209f4 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -9977,7 +9977,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10142,7 +10148,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28425,13 +28437,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29845,9 +29858,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30421,10 +30434,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30437,6 +30453,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45304,6 +45326,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54228,7 +54257,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54268,15 +54298,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55752,11 +55783,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65773,11 +65823,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65857,8 +65907,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/sv.po b/doc/translations/sv.po index e562fe9d6f..9be24493d7 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -9966,7 +9966,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10131,7 +10137,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28411,13 +28423,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29831,9 +29844,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30407,10 +30420,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30423,6 +30439,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45290,6 +45312,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54214,7 +54243,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54254,15 +54284,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55738,11 +55769,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65759,11 +65809,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65843,8 +65893,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/th.po b/doc/translations/th.po index 097eae8507..dabf3c09f3 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -10072,7 +10072,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10237,7 +10243,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28530,13 +28542,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29972,9 +29985,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30564,10 +30577,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30580,6 +30596,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45541,6 +45563,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54475,7 +54504,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54515,15 +54545,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55999,11 +56030,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66040,11 +66090,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66124,8 +66174,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/tl.po b/doc/translations/tl.po index 7473388512..b100d0e612 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -10046,7 +10046,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10211,7 +10217,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28500,13 +28512,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29920,9 +29933,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30496,10 +30509,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30512,6 +30528,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45406,6 +45428,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54330,7 +54359,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54370,15 +54400,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55854,11 +55885,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -65884,11 +65934,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -65968,8 +66018,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/tr.po b/doc/translations/tr.po index 77fbf5f31a..dc9d2524b7 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -10753,7 +10753,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10918,7 +10924,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -29252,13 +29264,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30674,9 +30687,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -31250,10 +31263,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -31266,6 +31282,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -46231,6 +46253,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -55167,7 +55196,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55207,15 +55237,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56691,11 +56722,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66739,11 +66789,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66823,8 +66873,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/uk.po b/doc/translations/uk.po index fe1ac7f153..afedf189b4 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -10125,7 +10125,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10290,7 +10296,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28608,13 +28620,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30030,9 +30043,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30606,10 +30619,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30622,6 +30638,12 @@ msgstr "Мишка Ñ– координати введеннÑ" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45563,6 +45585,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54492,7 +54521,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54532,15 +54562,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56017,11 +56048,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66064,11 +66114,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66148,8 +66198,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/vi.po b/doc/translations/vi.po index 4dbfaf376a..ab16aa1782 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -10420,7 +10420,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10585,7 +10591,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28905,13 +28917,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -30328,9 +30341,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30904,10 +30917,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30920,6 +30936,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45875,6 +45897,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54813,7 +54842,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54853,15 +54883,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56339,11 +56370,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66389,11 +66439,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66473,8 +66523,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index 2888f15fd1..d2179a01f2 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -62,7 +62,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-05 23:52+0000\n" +"PO-Revision-Date: 2022-07-17 07:14+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -71,7 +71,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -507,7 +507,7 @@ msgid "" "a = dectime(60, 10, 0.1)) # a is 59.0\n" "[/codeblock]" msgstr "" -"[b]注æ„:[/b][code]dectime[/code] 已被废弃,将在 Godot 4.0 ä¸åˆ 除,请使用 " +"[b]注æ„:[/b][code]dectime[/code] 已被废弃,将在 Godot 4.0 ä¸ç§»é™¤ï¼Œè¯·ä½¿ç”¨ " "[method move_toward] 代替。\n" "返回 [code]value[/code] å‡åŽ» [code]step[/code] * [code]amount[/code] 的结" "果。\n" @@ -570,7 +570,6 @@ msgstr "" "将(之å‰ä½¿ç”¨ [method inst2dict] 创建的)å—典转æ¢å›žå®žä¾‹ã€‚适用于ååºåˆ—化。" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -590,9 +589,9 @@ msgid "" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." msgstr "" -"返回 [code]x[/code] “缓动åŽâ€çš„值,结果基于使用 [code]curve[/code] 值定义的缓" -"动函数。该缓动函数是基于指数的。[code]curve[/code] 值å¯ä»¥æ˜¯ä»»æ„浮点数,具体数" -"值会导致以下行为:\n" +"返回 [code]x[/code]“缓动åŽâ€çš„值,结果基于使用 [code]curve[/code] 值定义的缓动" +"函数。该缓动函数是基于指数的。[code]curve[/code] 值å¯ä»¥æ˜¯ä»»æ„浮点数,具体数值" +"会导致以下行为:\n" "[codeblock]\n" "- 低于 -1.0(开区间):缓入缓出\n" "- -1.0:线性\n" @@ -602,9 +601,9 @@ msgstr "" "- 1.0:线性\n" "- 大于 1.0(开区间):缓入\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() 曲线值速查表[/url]\n" -"请å‚阅 [method smoothstep]ã€‚å¦‚æžœä½ éœ€è¦æ‰§è¡Œæ›´é«˜çº§çš„过渡,请使用 [Tween] 或 " +"å¦è¯·å‚阅 [method smoothstep]ã€‚å¦‚æžœä½ éœ€è¦æ‰§è¡Œæ›´é«˜çº§çš„过渡,请使用 [Tween] 或 " "[AnimationPlayer]。" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1688,7 +1687,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1731,7 +1729,7 @@ msgstr "" "与曲线值为 [code]-1.6521[/code] çš„ [method ease] 相比,[method smoothstep] è¿”" "回最平滑的曲线,导数没有çªç„¶å˜åŒ–ã€‚å¦‚æžœä½ éœ€è¦æ‰§è¡Œæ›´é«˜çº§çš„过渡,请使用 [Tween] " "或 [AnimationPlayer]。\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]smoothstep() 与 ease(x, -1.6521) 返回值的比较" "[/url]" @@ -4876,7 +4874,7 @@ msgstr "" "custom_action]ä¿¡å·ã€‚\n" "如果[code]right[/code]为 [code]true[/code],按钮会被放置在所有åŒçº§æŒ‰é’®çš„å³" "边。\n" -"您å¯ä»¥ä½¿ç”¨ [method remove_button] æ–¹æ³•ä»Žå¯¹è¯æ¡†ä¸åˆ é™¤ä½¿ç”¨æ¤æ–¹æ³•创建的按钮。" +"您å¯ä»¥ä½¿ç”¨ [method remove_button] æ–¹æ³•ä»Žå¯¹è¯æ¡†ä¸ç§»é™¤ä½¿ç”¨æ¤æ–¹æ³•创建的按钮。" #: doc/classes/AcceptDialog.xml msgid "" @@ -4887,7 +4885,7 @@ msgid "" msgstr "" "å‘å¯¹è¯æ¡†ä¸æ·»åŠ ä¸€ä¸ªæ ‡ç¾ä¸º[code]name[/code]å’Œä¸€ä¸ªå–æ¶ˆåŠ¨ä½œçš„æŒ‰é’®ï¼Œç„¶åŽè¿”回这个新" "创建的按钮。\n" -"您å¯ä»¥ä½¿ç”¨ [method remove_button] æ–¹æ³•ä»Žå¯¹è¯æ¡†ä¸åˆ é™¤ä½¿ç”¨æ¤æ–¹æ³•创建的按钮。" +"您å¯ä»¥ä½¿ç”¨ [method remove_button] æ–¹æ³•ä»Žå¯¹è¯æ¡†ä¸ç§»é™¤ä½¿ç”¨æ¤æ–¹æ³•创建的按钮。" #: doc/classes/AcceptDialog.xml msgid "" @@ -4897,7 +4895,7 @@ msgid "" "[member CanvasItem.visible] property." msgstr "" "è¿”å›žå†…ç½®æ–‡æœ¬æ‰€ä½¿ç”¨çš„æ ‡ç¾ã€‚\n" -"[b]è¦å‘Šï¼š[/b]这是个必è¦çš„å†…éƒ¨èŠ‚ç‚¹ï¼Œåˆ é™¤å’Œé‡Šæ”¾å®ƒæœ‰å¯èƒ½é€ æˆå´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éšè—" +"[b]è¦å‘Šï¼š[/b]这是个必è¦çš„内部节点,移除并释放它有å¯èƒ½é€ æˆå´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éšè—" "它或它的任æ„一个å节点,请使用它们的 [member CanvasItem.visible] 属性。" #: doc/classes/AcceptDialog.xml @@ -4908,7 +4906,7 @@ msgid "" "[member CanvasItem.visible] property." msgstr "" "返回确定按钮 [Button] 实例。\n" -"[b]è¦å‘Šï¼š[/b]这是个必è¦çš„å†…éƒ¨èŠ‚ç‚¹ï¼Œåˆ é™¤å’Œé‡Šæ”¾å®ƒæœ‰å¯èƒ½é€ æˆå´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éšè—" +"[b]è¦å‘Šï¼š[/b]这是个必è¦çš„内部节点,移除并释放它有å¯èƒ½é€ æˆå´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éšè—" "它或它的任æ„一个å节点,请使用它们的 [member CanvasItem.visible] 属性。" #: doc/classes/AcceptDialog.xml @@ -5653,7 +5651,7 @@ msgstr "返回给定轨é“ä¸ç»™å®šé”®çš„æ–¹æ³•轨é“上è¦è°ƒç”¨çš„傿•°å€¼ã€‚ #: doc/classes/Animation.xml msgid "Removes a track by specifying the track index." -msgstr "通过指定轨é“索引æ¥åˆ 除一个轨é“。" +msgstr "通过指定轨é“索引æ¥ç§»é™¤ä¸€ä¸ªè½¨é“。" #: doc/classes/Animation.xml msgid "" @@ -5739,11 +5737,11 @@ msgstr "将轨é“上移。" #: doc/classes/Animation.xml msgid "Removes a key by index in a given track." -msgstr "在指定的轨é“ä¸ŠæŒ‰ç´¢å¼•åˆ é™¤ä¸€ä¸ªé”®ã€‚" +msgstr "在指定的轨é“上按索引移除一个键。" #: doc/classes/Animation.xml msgid "Removes a key by position (seconds) in a given track." -msgstr "按ä½ç½®ï¼ˆç§’ï¼‰åˆ é™¤æŒ‡å®šè½¨é“ä¸çš„键。" +msgstr "按ä½ç½®ï¼ˆç§’)移除指定轨é“ä¸çš„键。" #: doc/classes/Animation.xml msgid "Enables/disables the given track. Tracks are enabled by default." @@ -6074,11 +6072,11 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "Removes an input, call this only when inactive." -msgstr "åˆ é™¤è¾“å…¥ï¼Œä»…åœ¨å¤„äºŽéžæ´»åŠ¨çŠ¶æ€æ—¶è°ƒç”¨æ¤è¾“入。" +msgstr "ç§»é™¤è¾“å…¥ï¼Œä»…åœ¨å¤„äºŽéžæ´»åŠ¨çŠ¶æ€æ—¶è°ƒç”¨æ¤è¾“入。" #: doc/classes/AnimationNode.xml msgid "Adds or removes a path for the filter." -msgstr "æ·»åŠ æˆ–åˆ é™¤ç›é€‰å™¨çš„路径。" +msgstr "æ·»åŠ æˆ–ç§»é™¤ç›é€‰å™¨çš„路径。" #: doc/classes/AnimationNode.xml msgid "" @@ -6094,7 +6092,7 @@ msgstr "如果为 [code]true[/code],则å¯ç”¨ç›é€‰åŠŸèƒ½ã€‚" #: doc/classes/AnimationNode.xml msgid "Emitted when the node was removed from the graph." -msgstr "当该节点从图ä¸åˆ 除时触å‘。" +msgstr "当该节点从图ä¸ç§»é™¤æ—¶è§¦å‘。" #: doc/classes/AnimationNode.xml msgid "" @@ -6317,7 +6315,7 @@ msgstr "返回索引 [code]point[/code] 处的点的ä½ç½®ã€‚" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "Removes the point at index [code]point[/code] from the blend axis." -msgstr "将索引 [code]point[/code] 处的点从混åˆè½´ä¸Šåˆ 除。" +msgstr "将索引 [code]point[/code] 处的点从混åˆè½´ä¸Šç§»é™¤ã€‚" #: doc/classes/AnimationNodeBlendSpace1D.xml #: doc/classes/AnimationNodeBlendSpace2D.xml @@ -6424,12 +6422,12 @@ msgstr "" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Removes the point at index [code]point[/code] from the blend space." -msgstr "从混åˆç©ºé—´ä¸åˆ 除索引 [code]point[/code] 处的点。" +msgstr "从混åˆç©ºé—´ä¸ç§»é™¤ç´¢å¼• [code]point[/code] 处的点。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "Removes the triangle at index [code]triangle[/code] from the blend space." -msgstr "从混åˆç©ºé—´ä¸åˆ 除索引 [code]triangle[/code] 处的三角形。" +msgstr "从混åˆç©ºé—´ä¸ç§»é™¤ç´¢å¼• [code]triangle[/code] 处的三角形。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" @@ -6475,7 +6473,7 @@ msgstr "æ··åˆç©ºé—´ Y è½´çš„å称。" msgid "" "Emitted every time the blend space's triangles are created, removed, or when " "one of their vertices changes position." -msgstr "æ¯å½“创建ã€åˆ 除混åˆç©ºé—´çš„三角形,或当其ä¸ä¸€ä¸ªé¡¶ç‚¹æ”¹å˜ä½ç½®æ—¶å‘出。" +msgstr "æ¯å½“创建ã€ç§»é™¤æ··åˆç©ºé—´çš„三角形,或当其ä¸ä¸€ä¸ªé¡¶ç‚¹æ”¹å˜ä½ç½®æ—¶å‘出。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "The interpolation between animations is linear." @@ -6549,7 +6547,7 @@ msgstr "如果å˜åœ¨å称为 [code]name[/code] çš„å节点,则返回 [code]t #: doc/classes/AnimationNodeBlendTree.xml msgid "Removes a sub-node." -msgstr "åˆ é™¤ä¸€ä¸ªå节点。" +msgstr "移除一个å节点。" #: doc/classes/AnimationNodeBlendTree.xml msgid "Changes the name of a sub-node." @@ -7879,9 +7877,9 @@ msgid "" "list is modified once during the physics step, not immediately after objects " "are moved. Consider using signals instead." msgstr "" -"返回相交的[Area]的列表。é‡å 区域的[member CollisionObject.collision_layer]å¿…" -"须是这个区域[member CollisionObject.collision_mask]çš„ä¸€éƒ¨åˆ†ï¼Œè¿™æ ·æ‰èƒ½è¢«æ£€æµ‹" -"到。\n" +"返回相交的 [Area] 的列表。é‡å 区域的 [member CollisionObject." +"collision_layer] 必须是这个区域 [member CollisionObject.collision_mask] 的一" +"éƒ¨åˆ†ï¼Œè¿™æ ·æ‰èƒ½è¢«æ£€æµ‹åˆ°ã€‚\n" "å‡ºäºŽæ€§èƒ½çš„è€ƒè™‘ï¼Œå› ç¢°æ’žéƒ½æ˜¯åŒæ—¶å¤„ç†çš„ï¼Œè¿™ä¸ªåˆ—è¡¨åœ¨ç‰©ç†æ¥éª¤ä¸åªä¿®æ”¹ä¸€æ¬¡ï¼Œè€Œä¸æ˜¯" "在物体被移动åŽç«‹å³ä¿®æ”¹ã€‚è€ƒè™‘ä½¿ç”¨ä¿¡å·æ¥ä»£æ›¿ã€‚" @@ -7894,9 +7892,9 @@ msgid "" "list is modified once during the physics step, not immediately after objects " "are moved. Consider using signals instead." msgstr "" -"返回相交的[PhysicsBody]的列表。é‡å 物体的[member CollisionObject." -"collision_layer]必须是这个区域[member CollisionObject.collision_mask]的一部" -"åˆ†ï¼Œè¿™æ ·æ‰èƒ½è¢«æ£€æµ‹åˆ°ã€‚\n" +"返回相交的 [PhysicsBody] 的列表。é‡å 物体的 [member CollisionObject." +"collision_layer] 必须是这个区域 [member CollisionObject.collision_mask] 的一" +"éƒ¨åˆ†ï¼Œè¿™æ ·æ‰èƒ½è¢«æ£€æµ‹åˆ°ã€‚\n" "å‡ºäºŽæ€§èƒ½çš„è€ƒè™‘ï¼Œå› ç¢°æ’žéƒ½æ˜¯åŒæ—¶å¤„ç†çš„ï¼Œè¿™ä¸ªåˆ—è¡¨åœ¨ç‰©ç†æ¥éª¤ä¸åªä¿®æ”¹ä¸€æ¬¡ï¼Œè€Œä¸æ˜¯" "在物体被移动åŽç«‹å³ä¿®æ”¹ã€‚è€ƒè™‘ä½¿ç”¨ä¿¡å·æ¥ä»£æ›¿ã€‚" @@ -7975,8 +7973,8 @@ msgid "" "The area's gravity vector (not normalized). If gravity is a point (see " "[member gravity_point]), this will be the point of attraction." msgstr "" -"区域的未归一化的é‡åŠ›å‘é‡ã€‚如果é‡åŠ›ä½œç”¨åœ¨ä¸€ä¸ªç‚¹ä¸Šï¼Œåˆ™å®ƒå°†æ˜¯å¼•åŠ›ç‚¹ã€‚è¯·å‚阅 " -"[member gravity_point]。" +"区域的未归一化的é‡åŠ›å‘é‡ã€‚如果é‡åŠ›ä½œç”¨åœ¨ä¸€ä¸ªç‚¹ä¸Šï¼Œåˆ™å®ƒå°†æ˜¯å¼•åŠ›ç‚¹ï¼ˆè§ [member " +"gravity_point])。" #: doc/classes/Area.xml msgid "" @@ -8882,7 +8880,7 @@ msgid "" "if the array is empty, without printing an error message. See also [method " "pop_front]." msgstr "" -"åˆ é™¤å¹¶è¿”å›žæ•°ç»„ä¸çš„æœ«å°¾å…ƒç´ 。数组为空时,返回 [code]null[/code]。å¦è¯·å‚阅 " +"移除并返回数组ä¸çš„æœ«å°¾å…ƒç´ 。数组为空时,返回 [code]null[/code]。å¦è¯·å‚阅 " "[method pop_front]。" #: doc/classes/Array.xml @@ -9142,11 +9140,11 @@ msgstr "" #: doc/classes/ArrayMesh.xml msgid "Removes all blend shapes from this [ArrayMesh]." -msgstr "åˆ é™¤æ¤[ArrayMesh]的所有混åˆå½¢çŠ¶ã€‚" +msgstr "ç§»é™¤æ¤ [ArrayMesh] 的所有混åˆå½¢çŠ¶ã€‚" #: doc/classes/ArrayMesh.xml msgid "Removes all surfaces from this [ArrayMesh]." -msgstr "åˆ é™¤æ¤[ArrayMesh]的所有表é¢ã€‚" +msgstr "ç§»é™¤æ¤ [ArrayMesh] 的所有表é¢ã€‚" #: doc/classes/ArrayMesh.xml msgid "Returns the number of blend shapes that the [ArrayMesh] holds." @@ -9485,7 +9483,7 @@ msgstr "" "这是链接到控制器跟踪的辅助空间节点。它还为控制器上的按钮ç‰çŠ¶æ€æä¾›äº†å‡ ä¸ªä¾¿æ·" "的通é“。\n" "控制器通过它们的 ID é“¾æŽ¥ã€‚ä½ å¯ä»¥åœ¨æŽ§åˆ¶å™¨å¯ç”¨ä¹‹å‰åˆ›å»ºæŽ§åˆ¶å™¨èŠ‚ç‚¹ã€‚å¦‚æžœä½ çš„æ¸¸æˆ" -"æ€»æ˜¯ä½¿ç”¨ä¸¤ä¸ªæŽ§åˆ¶å™¨ï¼Œå³æ¯åªæ‰‹ä¸€ä¸ªï¼Œä½ å¯ä»¥é¢„先定义 ID 为 1 å’Œ 2 的控制器;一旦" +"总是使用两个控制器(æ¯åªæ‰‹ä¸€ä¸ªï¼‰ï¼Œä½ å¯ä»¥é¢„先定义 ID 为 1 å’Œ 2 的控制器;一旦" "ç¡®å®šäº†æŽ§åˆ¶å™¨ï¼Œå®ƒä»¬å°±ä¼šè¢«æ¿€æ´»ã€‚å¦‚æžœä½ å¸Œæœ›ä½¿ç”¨é¢å¤–的控制器,应该对信å·åР以处" "ç†ï¼Œå¹¶å°† ARVRController èŠ‚ç‚¹æ·»åŠ åˆ°æ‚¨åœºæ™¯ä¸ã€‚\n" "控制器节点的ä½ç½®ç”± [ARVRServer] 自动更新。这使得该节点éžå¸¸é€‚åˆæ·»åŠ å节点以实" @@ -9615,8 +9613,8 @@ msgid "" "[ARVRServer]." msgstr "" "需è¦å®žçŽ°è¿™ä¸ªç±»æ‰èƒ½ä½¿ AR 或 VR å¹³å°å¯ä¾› Godot 使用,并且应实现为 C++ æ¨¡å—æˆ– " -"GDNative 模å—,注æ„,对于 GDNative,应使用åç±» ARVRScriptInterface。部分接å£" -"å‘ GDScript å…¬å¼€ï¼Œå› è€Œï¼Œæ‚¨å¯ä»¥æ£€æµ‹ã€å¯ç”¨å’Œé…ç½® AR 或 VR å¹³å°ã€‚\n" +"GDNative 模å—(注æ„,对于 GDNative,应使用åç±» ARVRScriptInterface)。部分接" +"å£å‘ GDScript å…¬å¼€ï¼Œå› è€Œï¼Œæ‚¨å¯ä»¥æ£€æµ‹ã€å¯ç”¨å’Œé…ç½® AR 或 VR å¹³å°ã€‚\n" "接å£åº”ä»¥è¿™æ ·çš„æ–¹å¼ç¼–写,åªéœ€å¯ç”¨å®ƒä»¬å°±å¯ä»¥ä¸ºæˆ‘们æä¾›å·¥ä½œé…置。您å¯ä»¥é€šè¿‡ " "[ARVRServer] 查询å¯ç”¨æŽ¥å£ã€‚" @@ -9637,7 +9635,7 @@ msgstr "返回 [enum Capabilities] æ ‡ç¾çš„组åˆï¼Œæä¾›å…³äºŽè¿™ä¸ªæŽ¥å£åŠŸ #: doc/classes/ARVRInterface.xml msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." -msgstr "返回该接å£çš„å称,如 OpenVRã€OpenHMDã€ARKit ç‰ã€‚" +msgstr "返回该接å£çš„å称(OpenVRã€OpenHMDã€ARKit ç‰ï¼‰ã€‚" #: doc/classes/ARVRInterface.xml msgid "" @@ -9713,7 +9711,7 @@ msgstr "没有 ARVR 功能。" #: doc/classes/ARVRInterface.xml msgid "" "This interface can work with normal rendering output (non-HMD based AR)." -msgstr "æ¤æŽ¥å£å¯ä»¥ä¸Žæ£å¸¸çš„æ¸²æŸ“输出一起工作,éžåŸºäºŽ HMD çš„ AR。" +msgstr "æ¤æŽ¥å£å¯ä»¥ä¸Žæ£å¸¸çš„æ¸²æŸ“输出一起工作(éžåŸºäºŽ HMD çš„ AR)。" #: doc/classes/ARVRInterface.xml msgid "This interface supports stereoscopic rendering." @@ -9721,7 +9719,7 @@ msgstr "è¯¥æŽ¥å£æ”¯æŒç«‹ä½“渲染。" #: doc/classes/ARVRInterface.xml msgid "This interface supports AR (video background and real world tracking)." -msgstr "è¯¥æŽ¥å£æ”¯æŒ AR,视频背景和真实世界跟踪。" +msgstr "è¯¥æŽ¥å£æ”¯æŒ AR(视频背景和真实世界跟踪)。" #: doc/classes/ARVRInterface.xml msgid "" @@ -9764,7 +9762,7 @@ msgstr "追踪行为符åˆé¢„期。" msgid "" "Tracking is hindered by excessive motion (the player is moving faster than " "tracking can keep up)." -msgstr "过度è¿åŠ¨ä¼šé˜»ç¢è¿½è¸ªï¼Œå³çŽ©å®¶çš„ç§»åŠ¨é€Ÿåº¦è¶…è¿‡è¿½è¸ªçš„é€Ÿåº¦ã€‚" +msgstr "过度è¿åŠ¨ä¼šé˜»ç¢è¿½è¸ªï¼ˆçŽ©å®¶çš„ç§»åŠ¨é€Ÿåº¦å¤§äºŽè¿½è¸ªçš„é€Ÿåº¦ï¼‰ã€‚" #: doc/classes/ARVRInterface.xml msgid "" @@ -9782,7 +9780,7 @@ msgstr "我们ä¸çŸ¥é“跟踪的状æ€ï¼Œæˆ–è€…è¿™ä¸ªæŽ¥å£æœªæä¾›å馈。" msgid "" "Tracking is not functional (camera not plugged in or obscured, lighthouses " "turned off, etc.)." -msgstr "追踪功能失效,å³ç›¸æœºæœªæ’ç”µæˆ–è¢«é®æŒ¡ï¼Œç¯å¡”å…³é—,ç‰ç‰ã€‚" +msgstr "追踪功能失效(相机未æ’ç”µæˆ–è¢«é®æŒ¡ã€ç¯å¡”å…³é—,ç‰ç‰ï¼‰ã€‚" #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "GDNative wrapper for an ARVR interface." @@ -10097,7 +10095,7 @@ msgstr "æ·»åŠ æ–°æŽ¥å£æ—¶è§¦å‘。" #: doc/classes/ARVRServer.xml msgid "Emitted when an interface is removed." -msgstr "当接å£è¢«åˆ 除时触å‘。" +msgstr "当接å£è¢«ç§»é™¤æ—¶è§¦å‘。" #: doc/classes/ARVRServer.xml msgid "" @@ -10118,9 +10116,9 @@ msgid "" "available (i.e. a new controller is switched on that takes the place of the " "previous one)." msgstr "" -"åˆ é™¤è·Ÿè¸ªå™¨æ—¶è§¦å‘ã€‚å¦‚æžœé€‚å½“ï¼Œæ‚¨åº”è¯¥åˆ é™¤æ‰€æœ‰ [ARVRController] 或 [ARVRAnchor] " -"ç‚¹ã€‚è¿™ä¸æ˜¯å¼ºåˆ¶æ€§çš„ï¼ŒèŠ‚ç‚¹åªæ˜¯å˜ä¸ºä¸æ´»åŠ¨çŠ¶æ€ï¼Œå½“新的跟踪器å¯ç”¨æ—¶å°†å†æ¬¡æ¿€æ´»ï¼Œå³" -"打开一个新的控制器æ¥ä»£æ›¿å‰ä¸€ä¸ªæŽ§åˆ¶å™¨ã€‚" +"移除跟踪器时触å‘ã€‚å¦‚æžœé€‚å½“ï¼Œæ‚¨åº”è¯¥åˆ é™¤æ‰€æœ‰ [ARVRController] 或 [ARVRAnchor] " +"ç‚¹ã€‚è¿™ä¸æ˜¯å¼ºåˆ¶æ€§çš„ï¼ŒèŠ‚ç‚¹åªæ˜¯å˜ä¸ºä¸æ´»åŠ¨çŠ¶æ€ï¼Œå½“新的跟踪器å¯ç”¨æ—¶å°†å†æ¬¡æ¿€æ´»ï¼ˆå³" +"打开一个新的控制器æ¥ä»£æ›¿å‰ä¸€ä¸ªæŽ§åˆ¶å™¨ï¼‰ã€‚" #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location of a controller." @@ -10248,7 +10246,7 @@ msgstr "" #: doc/classes/AspectRatioContainer.xml msgid "" "Aligns child controls with the beginning (left or top) of the container." -msgstr "å°†åæŽ§ä»¶ä¸Žå®¹å™¨çš„开头对é½ï¼Œå·¦ä¾§æˆ–顶部。" +msgstr "å°†åæŽ§ä»¶ä¸Žå®¹å™¨çš„开头对é½ï¼ˆå·¦ä¾§æˆ–顶部)。" #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the center of the container." @@ -10256,7 +10254,7 @@ msgstr "ä½¿åæŽ§ä»¶ä¸Žå®¹å™¨çš„ä¸å¿ƒå¯¹é½ã€‚" #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the end (right or bottom) of the container." -msgstr "å°†åæŽ§ä»¶ä¸Žå®¹å™¨çš„æœ«ç«¯å¯¹é½ï¼Œå³ä¾§æˆ–底部。" +msgstr "å°†åæŽ§ä»¶ä¸Žå®¹å™¨çš„æœ«ç«¯å¯¹é½ï¼ˆå³ä¾§æˆ–底部)。" #: doc/classes/AStar.xml msgid "" @@ -10603,7 +10601,7 @@ msgstr "返回是å¦ç¦ç”¨ç‚¹ä»¥è¿›è¡Œå¯»è·¯ã€‚默认情况下,所有点å‡å¤„ msgid "" "Removes the point associated with the given [code]id[/code] from the points " "pool." -msgstr "ä»Žç‚¹æ± ä¸åˆ 除与给定 [code]id[/code] å…³è”的点。" +msgstr "ä»Žç‚¹æ± ä¸ç§»é™¤ä¸Žç»™å®š [code]id[/code] å…³è”的点。" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -11765,7 +11763,7 @@ msgid "" "If [code]true[/code], the sound will be recorded. Note that restarting the " "recording will remove the previously recorded sample." msgstr "" -"如果为 [code]true[/code],将录制声音。请注æ„ï¼Œé‡æ–°å¼€å§‹å½•éŸ³å°†åˆ é™¤å…ˆå‰å½•éŸ³çš„æ ·" +"如果为 [code]true[/code],将录制声音。请注æ„ï¼Œé‡æ–°å¼€å§‹å½•音将移除先å‰å½•éŸ³çš„æ ·" "本。" #: doc/classes/AudioEffectRecord.xml @@ -12058,7 +12056,7 @@ msgid "" "Removes the effect at index [code]effect_idx[/code] from the bus at index " "[code]bus_idx[/code]." msgstr "" -"将索引 [code]effect_idx[/code] 的效果从索引 [code]bus_idx[/code] çš„æ€»çº¿ä¸Šåˆ " +"将索引 [code]effect_idx[/code] 的效果从索引 [code]bus_idx[/code] 的总线上移" "除。" #: doc/classes/AudioServer.xml @@ -12374,8 +12372,14 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "如果为 [code]true[/code]ï¼Œåœ¨æ·»åŠ åˆ°åœºæ™¯æ ‘æ—¶å°†æ’æ”¾éŸ³é¢‘。" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." -msgstr "æ’æ”¾æ¤éŸ³é¢‘的总线。" +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer.xml msgid "" @@ -12568,8 +12572,14 @@ msgstr "" "频。" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." -msgstr "æ’æ”¾æ¤éŸ³é¢‘的总线。" +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -13324,7 +13334,7 @@ msgid "" "will be removed in Godot 4.0. This property no longer has any effect when " "set. Please use [member Control.focus_mode] instead." msgstr "" -"[i]已弃用。[/i]由于冗余,æ¤å±žæ€§å·²å¼ƒç”¨ï¼Œå°†åœ¨ Godot 4.0 ä¸åˆ 除。æ¤å±žæ€§åœ¨è®¾ç½®åŽ" +"[i]已弃用。[/i]由于冗余,æ¤å±žæ€§å·²å¼ƒç”¨ï¼Œå°†åœ¨ Godot 4.0 ä¸ç§»é™¤ã€‚æ¤å±žæ€§åœ¨è®¾ç½®åŽ" "ä¸ä¼šæœ‰ä»»ä½•å½±å“。请改用 [member Control.focus_mode]。" #: doc/classes/BaseButton.xml @@ -13460,7 +13470,7 @@ msgstr "" "用于 3D 旋转和缩放的 3×3 çŸ©é˜µã€‚å‡ ä¹Žæ€»æ˜¯ç”¨ä½œå˜æ¢çš„æ£äº¤åŸºã€‚\n" "åŒ…å« 3 个å‘é‡å—段 Xã€Y å’Œ Z ä½œä¸ºå…¶åˆ—ï¼Œé€šå¸¸è¢«è§£é‡Šä¸ºå˜æ¢çš„局部基å‘é‡ã€‚对于这ç§" "ç”¨é€”ï¼Œå®ƒä¾æ¬¡ç”±ä¸€ä¸ªç¼©æ”¾çŸ©é˜µå’Œä¸€ä¸ªæ—‹è½¬çŸ©é˜µç»„æˆï¼ˆM=R.S)。\n" -"也å¯ä»¥ä½œä¸ºä¸‰ç»´å‘é‡çš„æ•°ç»„æ¥è®¿é—®ã€‚这些å‘é‡é€šå¸¸æ˜¯ç›¸äº’æ£äº¤çš„,但ä¸ä¸€å®šæ˜¯å½’一化的" +"也å¯ä»¥ä½œä¸º 3D å‘é‡çš„æ•°ç»„æ¥è®¿é—®ã€‚这些å‘é‡é€šå¸¸æ˜¯ç›¸äº’æ£äº¤çš„,但ä¸ä¸€å®šæ˜¯å½’一化的" "(由于缩放)。\n" "更多信æ¯è¯·é˜…读文档ä¸çš„ã€ŠçŸ©é˜µå’Œå˜æ¢ã€‹ä¸€æ–‡ã€‚" @@ -14397,9 +14407,9 @@ msgid "" "to the position and orientation of the camera by subclassed cameras such as " "[ClippedCamera], [InterpolatedCamera] and [ARVRCamera]." msgstr "" -"è¿”å›žç›¸æœºçš„å˜æ¢åŠ ä¸Šåž‚ç›´[member v_offset]和水平[member h_offset]çš„åç§»é‡ï¼›ä»¥åŠ" -"ç”±å类相机如[ClippedCamera]ã€[InterpolatedCamera]å’Œ[ARVRCamera]对相机的ä½ç½®å’Œ" -"æ–¹å‘åšå‡ºçš„任何其他调整。" +"è¿”å›žç›¸æœºçš„å˜æ¢åŠ ä¸Šåž‚ç›´ [member v_offset] 和水平 [member h_offset] çš„åç§»é‡ï¼›" +"以åŠç”±å类相机如 [ClippedCamera]ã€[InterpolatedCamera] å’Œ [ARVRCamera] 对相机" +"çš„ä½ç½®å’Œæ–¹å‘åšå‡ºçš„任何其他调整。" #: doc/classes/Camera.xml msgid "" @@ -14510,8 +14520,8 @@ msgid "" "angle in degrees, and the [code]z_near[/code] and [code]z_far[/code] clip " "planes in world space units." msgstr "" -"å°†æ‘„åƒæœºçš„æŠ•影设置为é€è§†æ¨¡å¼ï¼Œå‚阅[constant PROJECTION_PERSPECTIVE]),指定" -"[code]fov[/code] 视野角度,å•ä½åº¦ï¼Œä»¥åŠä¸–界空间å•ä½çš„[code]z_near[/code]å’Œ" +"å°†æ‘„åƒæœºçš„æŠ•影设置为é€è§†æ¨¡å¼ï¼ˆè§ [constant PROJECTION_PERSPECTIVE]),指定 " +"[code]fov[/code] 视野角度,å•ä½ä¸ºåº¦ï¼Œä»¥åŠä¸–界空间å•ä½çš„[code]z_near[/code]å’Œ" "[code]z_far[/code]è£å‰ªå¹³é¢ã€‚" #: doc/classes/Camera.xml @@ -14772,7 +14782,7 @@ msgstr "将相机与跟踪的节点对é½ã€‚" msgid "" "Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" "assigned camera." -msgstr "从父级[Viewport]的内部当å‰åˆ†é…的相机ä¸åˆ 除任何[Camera2D]。" +msgstr "从父级 [Viewport] 的内部当å‰åˆ†é…的相机ä¸ç§»é™¤ä»»ä½• [Camera2D]。" #: doc/classes/Camera2D.xml msgid "Forces the camera to update scroll immediately." @@ -16737,7 +16747,7 @@ msgstr "æ·»åŠ ç¢°æ’žä¾‹å¤–ï¼Œä»¥ä½¿ç›¸æœºä¸ä¼šä¸ŽæŒ‡å®šçš„[RID]碰撞。" #: doc/classes/ClippedCamera.xml msgid "Removes all collision exceptions." -msgstr "åˆ é™¤æ‰€æœ‰ç¢°æ’žä¾‹å¤–ã€‚" +msgstr "移除所有碰撞例外。" #: doc/classes/ClippedCamera.xml msgid "Returns the distance the camera has been offset due to a collision." @@ -16753,11 +16763,11 @@ msgstr "" #: doc/classes/ClippedCamera.xml msgid "Removes a collision exception with the specified node." -msgstr "åˆ é™¤ä¸ŽæŒ‡å®šèŠ‚ç‚¹çš„ç¢°æ’žä¾‹å¤–ã€‚" +msgstr "移除与指定节点的碰撞例外。" #: doc/classes/ClippedCamera.xml msgid "Removes a collision exception with the specified [RID]." -msgstr "åˆ é™¤æŒ‡å®š [RID] 的碰撞例外。" +msgstr "移除指定 [RID] 的碰撞例外。" #: doc/classes/ClippedCamera.xml msgid "" @@ -16924,11 +16934,11 @@ msgstr "返回具有给定形状所有者的给定 id 的形状 [Shape] çš„åç´ #: doc/classes/CollisionObject.xml msgid "Returns the shape owner's [Transform]." -msgstr "返回形状所有者的[Transform]。" +msgstr "返回形状所有者的 [Transform]。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "Removes a shape from the given shape owner." -msgstr "从给定的形状所有者ä¸åˆ 除一个形状。" +msgstr "从给定的形状所有者ä¸ç§»é™¤ä¸€ä¸ªå½¢çŠ¶ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "If [code]true[/code], disables the given shape owner." @@ -16936,7 +16946,7 @@ msgstr "如果为 [code]true[/code],则ç¦ç”¨ç»™å®šçš„形状所有者。" #: doc/classes/CollisionObject.xml msgid "Sets the [Transform] of the given shape owner." -msgstr "设置给定形状所有者的[Transform]。" +msgstr "设置给定形状所有者的 [Transform]。" #: doc/classes/CollisionObject.xml msgid "" @@ -17009,7 +17019,7 @@ msgstr "å½“é¼ æ ‡æŒ‡é’ˆé€€å‡ºæ¤å¯¹è±¡çš„æ‰€æœ‰å½¢çŠ¶æ—¶å‘出。" #: doc/classes/CollisionObject2D.xml msgid "Base node for 2D collision objects." -msgstr "二维碰撞对象的基础节点。" +msgstr "2D 碰撞对象的基础节点。" #: doc/classes/CollisionObject2D.xml msgid "" @@ -17045,7 +17055,7 @@ msgid "" "Returns the [code]one_way_collision_margin[/code] of the shape owner " "identified by given [code]owner_id[/code]." msgstr "" -"返回由给定的[code]owner_id[/code]æ ‡è¯†çš„å½¢çŠ¶æ‰€æœ‰è€…çš„" +"返回由给定的 [code]owner_id[/code] æ ‡è¯†çš„å½¢çŠ¶æ‰€æœ‰è€…çš„ " "[code]one_way_collision_margin[/code]。" #: doc/classes/CollisionObject2D.xml @@ -17054,26 +17064,26 @@ msgid "" "this [CollisionObject2D] will not be reported to collided with " "[CollisionObject2D]s." msgstr "" -"返回 [code]true[/code],如果æºäºŽè¿™ä¸ª[CollisionObject2D]的形状所有者的碰撞ä¸ä¼š" -"被报告给[CollisionObject2D]s。" +"返回 [code]true[/code],如果æºäºŽè¿™ä¸ª [CollisionObject2D] 的形状所有者的碰撞ä¸" +"会被报告给 [CollisionObject2D]。" #: doc/classes/CollisionObject2D.xml msgid "Adds a [Shape2D] to the shape owner." -msgstr "ç»™å½¢çŠ¶æ‰€æœ‰è€…æ·»åŠ ä¸€ä¸ª[Shape2D]。" +msgstr "ç»™å½¢çŠ¶æ‰€æœ‰è€…æ·»åŠ ä¸€ä¸ª [Shape2D]。" #: doc/classes/CollisionObject2D.xml msgid "Returns the [Shape2D] with the given id from the given shape owner." -msgstr "从给定的形状所有者那里返回给定idçš„[Shape2D]。" +msgstr "从给定的形状所有者那里返回给定 id çš„ [Shape2D]。" #: doc/classes/CollisionObject2D.xml msgid "" "Returns the child index of the [Shape2D] with the given id from the given " "shape owner." -msgstr "从给定的形状所有者那里返回给定idçš„[Shape2D]çš„å索引。" +msgstr "从给定的形状所有者那里返回给定 id çš„ [Shape2D] çš„å索引。" #: doc/classes/CollisionObject2D.xml msgid "Returns the shape owner's [Transform2D]." -msgstr "返回形状所有者的[Transform2D]。" +msgstr "返回形状所有者的 [Transform2D]。" #: doc/classes/CollisionObject2D.xml msgid "" @@ -17081,20 +17091,20 @@ msgid "" "originating from this [CollisionObject2D] will not be reported to collided " "with [CollisionObject2D]s." msgstr "" -"如果[code]enable[/code]为 [code]true[/code],则æºè‡ªè¿™ä¸ª[CollisionObject2D]çš„" -"形状所有者的碰撞将ä¸ä¼šè¢«æŠ¥å‘Šç»™[CollisionObject2D]。" +"如果 [code]enable[/code] 为 [code]true[/code],则æºè‡ªè¿™ä¸ª " +"[CollisionObject2D] 的形状所有者的碰撞将ä¸ä¼šè¢«æŠ¥å‘Šç»™ [CollisionObject2D]。" #: doc/classes/CollisionObject2D.xml msgid "" "Sets the [code]one_way_collision_margin[/code] of the shape owner identified " "by given [code]owner_id[/code] to [code]margin[/code] pixels." msgstr "" -"将由给定的[code]owner_id[/code]æ ‡è¯†çš„å½¢çŠ¶æ‰€æœ‰è€…çš„" -"[code]one_way_collision_margin[/code]设置为[code]margin[/code]åƒç´ 。" +"将由给定的 [code]owner_id[/code] æ ‡è¯†çš„å½¢çŠ¶æ‰€æœ‰è€…çš„ " +"[code]one_way_collision_margin[/code] 设置为 [code]margin[/code] åƒç´ 。" #: doc/classes/CollisionObject2D.xml msgid "Sets the [Transform2D] of the given shape owner." -msgstr "设置给定形状所有者的[Transform2D]。" +msgstr "设置给定形状所有者的 [Transform2D]。" #: doc/classes/CollisionObject2D.xml msgid "" @@ -18391,7 +18401,7 @@ msgstr "" #: doc/classes/ColorPicker.xml msgid "" "Removes the given color from the list of color presets of this color picker." -msgstr "从这个å–色器的颜色预设列表ä¸åˆ 除给定的颜色。" +msgstr "从这个å–色器的颜色预设列表ä¸ç§»é™¤ç»™å®šçš„颜色。" #: doc/classes/ColorPicker.xml msgid "Returns the list of colors in the presets of the color picker." @@ -18452,7 +18462,7 @@ msgstr "æ·»åŠ é¢„è®¾æ—¶å‘出。" #: doc/classes/ColorPicker.xml msgid "Emitted when a preset is removed." -msgstr "åˆ é™¤é¢„è®¾æ—¶å‘出。" +msgstr "移除预设时å‘出。" #: doc/classes/ColorPicker.xml msgid "The width of the hue selection slider." @@ -18530,7 +18540,7 @@ msgid "" msgstr "" "返回控件的 [PopupPanel],它å…è®¸ä½ è¿žæŽ¥åˆ°å¼¹å‡ºä¿¡å·ã€‚è¿™å…è®¸ä½ åœ¨æ˜¾ç¤ºæˆ–éšè— " "ColorPicker 时事件处ç†ã€‚\n" -"[b]è¦å‘Šï¼š[/b]è¿™æ˜¯ä¸€ä¸ªå¿…éœ€çš„å†…éƒ¨èŠ‚ç‚¹ï¼Œåˆ é™¤å’Œé‡Šæ”¾å®ƒå¯èƒ½ä¼šå¯¼è‡´å´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éš" +"[b]è¦å‘Šï¼š[/b]这是一个必需的内部节点,移除并释放它å¯èƒ½ä¼šå¯¼è‡´å´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éš" "è—它或其任何å项,请使用其 [member CanvasItem.visible] 属性。" #: doc/classes/ColorPickerButton.xml @@ -18891,7 +18901,7 @@ msgstr "" #: doc/classes/ConfigFile.xml msgid "Removes the entire contents of the config." -msgstr "åˆ é™¤é…置的全部内容。" +msgstr "移除é…置的全部内容。" #: doc/classes/ConfigFile.xml msgid "" @@ -19019,7 +19029,7 @@ msgid "" "if it ends up empty once the key has been removed." msgstr "" "ä¸ºæŒ‡å®šç« èŠ‚çš„æŒ‡å®šé”®èµ‹å€¼ã€‚å¦‚æžœèŠ‚æˆ–é”®ä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºå®ƒä»¬ã€‚如果指定的键å˜åœ¨ï¼Œä¼ 递 " -"[code]null[/code] å€¼å°±ä¼šåˆ é™¤æŒ‡å®šçš„é”®ï¼Œå¦‚æžœé”®è¢«åˆ é™¤åŽï¼Œé”®æœ€ç»ˆæ˜¯ç©ºçš„ï¼Œå°±ä¼šåˆ é™¤" +"[code]null[/code] 值就会移除指定的键,如果键被移除åŽï¼Œé”®æœ€ç»ˆæ˜¯ç©ºçš„,就会移除" "节。" #: doc/classes/ConfirmationDialog.xml @@ -19051,7 +19061,7 @@ msgid "" "[member CanvasItem.visible] property." msgstr "" "è¿”å›žå–æ¶ˆæŒ‰é’®ã€‚\n" -"[b]è¦å‘Šï¼š[/b]è¿™æ˜¯ä¸€ä¸ªå¿…éœ€çš„å†…éƒ¨èŠ‚ç‚¹ï¼Œåˆ é™¤å’Œé‡Šæ”¾å®ƒå¯èƒ½ä¼šå¯¼è‡´å´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éš" +"[b]è¦å‘Šï¼š[/b]这是一个必需的内部节点,移除并释放它å¯èƒ½ä¼šå¯¼è‡´å´©æºƒã€‚å¦‚æžœä½ å¸Œæœ›éš" "è—它或其任何å项,请使用其 [member CanvasItem.visible] 属性。" #: doc/classes/Container.xml @@ -21232,7 +21242,7 @@ msgid "" "points] property using the convex hull algorithm. Removing all unneeded " "points. See [method Geometry.convex_hull_2d] for details." msgstr "" -"基于所æä¾›ç‚¹çš„集åˆï¼Œä½¿ç”¨å‡¸åŒ…ç®—æ³•åˆ›å»ºå’Œåˆ†é… [member points]å±žæ€§ã€‚åˆ é™¤æ‰€æœ‰ä¸éœ€" +"基于所æä¾›ç‚¹çš„集åˆï¼Œä½¿ç”¨å‡¸åŒ…ç®—æ³•åˆ›å»ºå’Œåˆ†é… [member points]属性。移除所有ä¸éœ€" "è¦çš„点。详情请å‚阅 [method Geometry.convex_hull_2d]。" #: doc/classes/ConvexPolygonShape2D.xml @@ -21400,8 +21410,8 @@ msgid "" "Each particle's color will vary along this [GradientTexture] over its " "lifetime (multiplied with [member color])." msgstr "" -"æ¯ä¸ªç²’å的颜色将在其生命周期内éšç€è¿™ä¸ª[GradientTexture]å˜åŒ–,å³ä¸Ž[member " -"color]相乘。" +"æ¯ä¸ªç²’å的颜色将在其生命周期内éšç€è¿™ä¸ª [GradientTexture] å˜åŒ–(与 [member " +"color] 相乘)。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -22468,8 +22478,8 @@ msgid "" "V around the outline of the [member polygon]), the bottom-left quarter to " "the front end face, and the bottom-right quarter to the back end face." msgstr "" -"用于生æˆçš„ç½‘æ ¼çš„æè´¨ã€‚UV å°†æè´¨çš„上åŠéƒ¨åˆ†æ˜ 射到挤出的形状,å³U沿挤出物的长" -"度,V 围绕 [member polygon]çš„è½®å»“ï¼Œå·¦ä¸‹è§’çš„å››åˆ†ä¹‹ä¸€æ˜ å°„åˆ°å‰ç«¯é¢ï¼Œå³ä¸‹è§’的四分" +"用于生æˆçš„ç½‘æ ¼çš„æè´¨ã€‚UV å°†æè´¨çš„上åŠéƒ¨åˆ†æ˜ 射到挤出的形状(U 沿挤出物的长度," +"V 围绕 [member polygon] çš„è½®å»“ï¼‰ï¼Œå·¦ä¸‹è§’çš„å››åˆ†ä¹‹ä¸€æ˜ å°„åˆ°å‰ç«¯é¢ï¼Œå³ä¸‹è§’的四分" "ä¹‹ä¸€æ˜ å°„åˆ°åŽç«¯é¢ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml @@ -22792,11 +22802,11 @@ msgstr "" #: modules/csg/doc_classes/CSGShape.xml msgid "" "Geometry of both primitives is merged, intersecting geometry is removed." -msgstr "åˆå¹¶ä¸¤ä¸ªå›¾å…ƒçš„å‡ ä½•ä½“ï¼Œåˆ é™¤ç›¸äº¤çš„å‡ ä½•ä½“ã€‚" +msgstr "åˆå¹¶ä¸¤ä¸ªå›¾å…ƒçš„å‡ ä½•ä½“ï¼Œç§»é™¤ç›¸äº¤çš„å‡ ä½•ä½“ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "Only intersecting geometry remains, the rest is removed." -msgstr "ä»…ä¿ç•™ç›¸äº¤çš„å‡ ä½•ï¼Œå…¶ä½™çš„å°†è¢«åˆ é™¤ã€‚" +msgstr "ä»…ä¿ç•™ç›¸äº¤çš„å‡ ä½•ï¼Œå…¶ä½™çš„å°†è¢«ç§»é™¤ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -23231,11 +23241,11 @@ msgstr "釿–°è®¡ç®—曲线的烘焙点缓å˜ã€‚" msgid "" "Removes points that are closer than [code]CMP_EPSILON[/code] (0.00001) units " "to their neighbor on the curve." -msgstr "åˆ é™¤æ¯”æ›²çº¿ä¸Šçš„ç›¸é‚»ç‚¹è¿‘[code]CMP_EPSILON[/code](0.00001)个å•ä½çš„点。" +msgstr "移除比曲线上的相邻点近[code]CMP_EPSILON[/code](0.00001)个å•ä½çš„点。" #: doc/classes/Curve.xml doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "Removes all points from the curve." -msgstr "从曲线ä¸åˆ 除所有点。" +msgstr "从曲线ä¸ç§»é™¤æ‰€æœ‰ç‚¹ã€‚" #: doc/classes/Curve.xml doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "Returns the number of points describing the curve." @@ -23284,7 +23294,7 @@ msgstr "" #: doc/classes/Curve.xml msgid "Removes the point at [code]index[/code] from the curve." -msgstr "从曲线ä¸åˆ 除 [code]index[/code] 处的点。" +msgstr "从曲线ä¸ç§»é™¤ [code]index[/code] 处的点。" #: doc/classes/Curve.xml msgid "" @@ -23569,7 +23579,7 @@ msgstr "" #: doc/classes/Curve3D.xml msgid "Describes a Bézier curve in 3D space." -msgstr "æè¿°äºŒç»´ç©ºé—´çš„è´å…¹å°”曲线。" +msgstr "æè¿° 3D 空间的è´å…¹å°”曲线。" #: doc/classes/Curve3D.xml msgid "" @@ -24099,7 +24109,7 @@ msgstr "GDScript 基础:å—å…¸" #: doc/classes/Dictionary.xml msgid "Clear the dictionary, removing all key/value pairs." -msgstr "清除å—å…¸ï¼Œåˆ é™¤æ‰€æœ‰é”®/值对。" +msgstr "清除å—典,移除所有键/值对。" #: doc/classes/Dictionary.xml msgid "" @@ -24232,7 +24242,6 @@ msgstr "" "æ¢çš„ä¸–ç•Œç©ºé—´åæ ‡ï¼ˆåŽŸç‚¹ï¼‰ä¼šè¢«å¿½ç•¥ã€‚åªä¼šç”¨åŸºæ¥ç¡®å®šå…‰çº¿çš„æ–¹å‘。" #: doc/classes/DirectionalLight.xml -#, fuzzy msgid "" "Amount of extra bias for shadow splits that are far away. If self-shadowing " "occurs only on the splits far away, increasing this value can fix them. This " @@ -24240,7 +24249,8 @@ msgid "" "SHADOW_ORTHOGONAL]." msgstr "" "远处阴影分裂的é¢å¤–åç½®é‡ã€‚如果自身阴影åªäº§ç”Ÿè¿œå¤„çš„åˆ†è£‚ï¼Œå¢žåŠ è¿™ä¸ªå€¼å¯ä»¥ä¿®å¤å®ƒ" -"们。" +"们。当 [member directional_shadow_mode] 为 [constant SHADOW_ORTHOGONAL] 时会" +"被忽略。" #: doc/classes/DirectionalLight.xml msgid "" @@ -24249,6 +24259,9 @@ msgid "" "moderate performance cost. This is ignored when [member " "directional_shadow_mode] is [constant SHADOW_ORTHOGONAL]." msgstr "" +"如果为 [code]true[/code],会牺牲阴影的细节,æ¢å–分割区域之间更平滑的过渡。å¯" +"用阴影混åˆåˆ†å‰²åŒæ—¶ä¹Ÿä¼šå¸¦æ¥ä¸€äº›æ€§èƒ½æ¶ˆè€—。当 [member directional_shadow_mode] " +"为 [constant SHADOW_ORTHOGONAL] 时会被忽略。" #: doc/classes/DirectionalLight.xml msgid "" @@ -24263,6 +24276,8 @@ msgid "" "shadow detail and performance (since more objects need to be included in the " "directional shadow rendering)." msgstr "" +"阴影分割的最大è·ç¦»ã€‚将这个值增大会让方å‘阴影在更远处å¯è§ï¼Œä»£ä»·æ˜¯æ•´ä½“的阴影细" +"节é™ä½Žå’Œæ€§èƒ½ï¼ˆå› 为渲染方å‘阴影时需è¦åŒ…嫿›´å¤šçš„对象)。" #: doc/classes/DirectionalLight.xml msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." @@ -24275,39 +24290,36 @@ msgid "" msgstr "当物体垂直于光线时,å¯ç”¨äºŽä¿®å¤è‡ªèº«é˜´å½±çš„特殊情况。" #: doc/classes/DirectionalLight.xml -#, fuzzy msgid "" "The distance from camera to shadow split 1. Relative to [member " "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " "SHADOW_PARALLEL_4_SPLITS]." msgstr "" -"相机到影å分割1çš„è·ç¦»ã€‚相对于[member directional_shadow_max_distance]ã€‚åªæœ‰å½“" -"[member directional_shadow_mode]是[code]SHADOW_PARALLEL_2_SPLITS[/code]或" -"[code]SHADOW_PARALLEL_4_SPLITS[/code]æ—¶æ‰ä½¿ç”¨ã€‚" +"相机到阴影分割 1 çš„è·ç¦»ã€‚相对于 [member directional_shadow_max_distance]。åª" +"有当 [member directional_shadow_mode] 为 [constant SHADOW_PARALLEL_2_SPLITS] " +"或 [constant SHADOW_PARALLEL_4_SPLITS] æ—¶æ‰ä½¿ç”¨ã€‚" #: doc/classes/DirectionalLight.xml -#, fuzzy msgid "" "The distance from shadow split 1 to split 2. Relative to [member " "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " "SHADOW_PARALLEL_4_SPLITS]." msgstr "" -"阴影分割1到分割2çš„è·ç¦»ã€‚相对于[member directional_shadow_max_distance]。仅在" -"[member directional_shadow_mode]为[code]SHADOW_PARALLEL_2_SPLITS[/code]或" -"[code]SHADOW_PARALLEL_4_SPLITS[/code]时使用。" +"阴影分割 1 到分割 2 çš„è·ç¦»ã€‚相对于 [member directional_shadow_max_distance]。" +"仅在 [member directional_shadow_mode] 为 [constant SHADOW_PARALLEL_2_SPLITS] " +"或 [constant SHADOW_PARALLEL_4_SPLITS] 时使用。" #: doc/classes/DirectionalLight.xml -#, fuzzy msgid "" "The distance from shadow split 2 to split 3. Relative to [member " "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [constant SHADOW_PARALLEL_4_SPLITS]." msgstr "" -"从影å分割2到分割3çš„è·ç¦»ã€‚相对于[member directional_shadow_max_distance]。åª" -"有当[member directional_shadow_mode]为[code]SHADOW_PARALLEL_4_SPLITS[/code]æ—¶" -"æ‰ä½¿ç”¨ã€‚" +"从阴影分割 2 到分割 3 çš„è·ç¦»ã€‚相对于 [member " +"directional_shadow_max_distance]ã€‚åªæœ‰å½“ [member directional_shadow_mode] 为 " +"[constant SHADOW_PARALLEL_4_SPLITS] æ—¶æ‰ä½¿ç”¨ã€‚" #: doc/classes/DirectionalLight.xml msgid "" @@ -24547,8 +24559,8 @@ msgid "" "Closes the current stream opened with [method list_dir_begin] (whether it " "has been fully processed with [method get_next] does not matter)." msgstr "" -"å…³é—用 [method list_dir_begin] æ‰“å¼€çš„å½“å‰æµï¼Œå¹¶ä¸å…³æ³¨æ˜¯å¦å·²ç»ç”¨ [method " -"get_next] 完æˆå¤„ç†ã€‚" +"å…³é—用 [method list_dir_begin] æ‰“å¼€çš„å½“å‰æµï¼ˆå¹¶ä¸å…³æ³¨æ˜¯å¦å·²ç»ç”¨ [method " +"get_next] 完æˆå¤„ç†ï¼‰ã€‚" #: doc/classes/Directory.xml msgid "" @@ -24762,8 +24774,8 @@ msgid "" "[constant PacketPeerDTLS.STATUS_HANDSHAKING], as it is normal that 50% of " "the new connections will be invalid due to cookie exchange." msgstr "" -"å°è¯•与给定的 [code]udp_peer[/code] å¯åЍ DTLS æ¡æ‰‹ï¼Œè¯¥ peer 必须已ç»è¿žæŽ¥ï¼Œè¯·å‚" -"阅 [method PacketPeerUDP.connect_to_host]。\n" +"å°è¯•与给定的 [code]udp_peer[/code] å¯åЍ DTLS æ¡æ‰‹ï¼Œè¯¥ peer 必须已ç»è¿žæŽ¥ï¼ˆè§ " +"[method PacketPeerUDP.connect_to_host])。\n" "[b]注æ„:[/b]ä½ å¿…é¡»æ£€æŸ¥è¿”å›ž PacketPeerUDP çš„çŠ¶æ€æ˜¯å¦ä¸º [constant " "PacketPeerDTLS.STATUS_HANDSHAKING]ï¼Œå› ä¸ºæ£å¸¸æƒ…况下,50% çš„æ–°è¿žæŽ¥ä¼šå› ä¸º " "cookie 交æ¢è€Œæ— 效。" @@ -25334,7 +25346,7 @@ msgstr "" #: doc/classes/EditorFileDialog.xml msgid "Removes all filters except for \"All Files (*)\"." -msgstr "åˆ é™¤é™¤â€œAll Files(*)â€ç›é€‰å™¨ä¹‹å¤–的所有ç›é€‰å™¨ã€‚" +msgstr "移除“All Files(*)â€ç›é€‰å™¨ä¹‹å¤–的所有ç›é€‰å™¨ã€‚" #: doc/classes/EditorFileDialog.xml msgid "" @@ -25948,7 +25960,7 @@ msgstr "" msgid "" "Emitted when the Edit button of an [Object] has been pressed in the " "inspector. This is mainly used in the remote scene tree inspector." -msgstr "åœ¨æ£€æŸ¥å™¨ä¸æŒ‰ä¸‹[Object]的编辑按钮时触å‘。主è¦ç”¨äºŽè¿œç¨‹åœºæ™¯æ ‘检查器ä¸ã€‚" +msgstr "åœ¨æ£€æŸ¥å™¨ä¸æŒ‰ä¸‹ [Object] 的编辑按钮时触å‘。主è¦ç”¨äºŽè¿œç¨‹åœºæ™¯æ ‘检查器ä¸ã€‚" #: doc/classes/EditorInspector.xml msgid "Emitted when a property is edited in the inspector." @@ -25960,8 +25972,8 @@ msgid "" "by clicking the \"key\" icon next to a property when the Animation panel is " "toggled." msgstr "" -"当属性在检查器ä¸è¢«é”®å…¥æ—¶è§¦å‘。当切æ¢åŠ¨ç”»é¢æ¿æ—¶ï¼Œå¯é€šè¿‡ç‚¹å‡»å±žæ€§æ—边的 \"é”® " -"\"å›¾æ ‡å¯¹å±žæ€§è¿›è¡Œé”®æŽ§ã€‚" +"当属性在检查器ä¸è¢«é”®å…¥æ—¶è§¦å‘ã€‚å½“åŠ¨ç”»é¢æ¿æ‰“开时,å¯é€šè¿‡ç‚¹å‡»å±žæ€§æ—边的“钥匙â€å›¾" +"æ ‡ä¸ºå±žæ€§æ·»åŠ å…³é”®å¸§ã€‚" #: doc/classes/EditorInspector.xml msgid "Emitted when a property is selected in the inspector." @@ -26069,7 +26081,7 @@ msgid "" "built-in editor for this property, otherwise allows to insert a custom " "editor before the built-in one." msgstr "" -"å…è®¸è¢«è°ƒç”¨åœ¨æ£€æŸ¥å™¨ä¸æ·»åŠ ç‰¹å®šå±žæ€§çš„ç¼–è¾‘å™¨ã€‚é€šå¸¸è¿™äº›ç¼–è¾‘å™¨ç»§æ‰¿" +"å…è®¸è¢«è°ƒç”¨åœ¨æ£€æŸ¥å™¨ä¸æ·»åŠ ç‰¹å®šå±žæ€§çš„ç¼–è¾‘å™¨ã€‚é€šå¸¸è¿™äº›ç¼–è¾‘å™¨ç»§æ‰¿ " "[EditorProperty]。返回 [code]true[/code]åˆ é™¤è¯¥å±žæ€§çš„å†…ç½®ç¼–è¾‘å™¨ï¼Œå¦åˆ™å…许在内" "ç½®ç¼–è¾‘å™¨ä¹‹å‰æ’入一个自定义编辑器。" @@ -26147,8 +26159,8 @@ msgid "" "code] and [code]interface/editor/custom_display_scale[/code] editor " "settings. Editor must be restarted for changes to be properly applied." msgstr "" -"返回编辑器用户 UI 的实际比例,[code]1.0[/code] 比例为 100%。这å¯ä»¥ç”¨æ¥è°ƒæ•´ç”±" -"æ’ä»¶æ·»åŠ çš„ç”¨æˆ· UI çš„ä½ç½®å’Œå°ºå¯¸ã€‚\n" +"返回编辑器用户 UI 的实际比例([code]1.0[/code] 表示比例为 100%)。这å¯ä»¥ç”¨æ¥" +"调整由æ’ä»¶æ·»åŠ çš„ç”¨æˆ· UI çš„ä½ç½®å’Œå°ºå¯¸ã€‚\n" "[b]注æ„:[/b]这个值是通过 [code]interface/editor/display_scale[/code] å’Œ " "[code]interface/editor/custom_display_scale[/code] 编辑器设置项æ¥è®¾ç½®ã€‚编辑器" "å¿…é¡»é‡æ–°å¯åЍæ‰èƒ½æ£ç¡®åº”用这些å˜åŒ–。" @@ -29114,7 +29126,7 @@ msgid "" "The global color saturation value of the rendered scene (default value is " "1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." msgstr "" -"渲染场景的全局色彩饱和度值,默认值为1ã€‚åªæœ‰åœ¨ [code]adjustment_enabled[/" +"渲染场景的全局色彩饱和度值(默认值为 1ï¼‰ã€‚åªæœ‰åœ¨ [code]adjustment_enabled[/" "code] 为 [code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚" #: doc/classes/Environment.xml @@ -29557,7 +29569,7 @@ msgid "" "The screen-space ambient occlusion bias. This should be kept high enough to " "prevent \"smooth\" curves from being affected by ambient occlusion." msgstr "" -"å±å¹•空间环境光é®è”½åå·®ã€‚è¯¥å€¼åº”ä¿æŒåœ¨è¶³å¤Ÿé«˜çš„æ°´å¹³ï¼Œä»¥é˜²æ¢â€œå¹³æ»‘â€æ›²çº¿å—到环境光" +"å±å¹•空间环境光é®è”½åç½®ã€‚è¯¥å€¼åº”ä¿æŒåœ¨è¶³å¤Ÿé«˜çš„æ°´å¹³ï¼Œä»¥é˜²æ¢â€œå¹³æ»‘â€æ›²çº¿å—到环境光" "é®è”½çš„å½±å“。" #: doc/classes/Environment.xml @@ -29593,13 +29605,13 @@ msgstr "" msgid "" "The primary screen-space ambient occlusion intensity. See also [member " "ssao_radius]." -msgstr "主è¦çš„å±å¹•空间环境光é®è”½å¼ºåº¦ã€‚å‚阅[member ssao_radius]。" +msgstr "主å±å¹•的空间环境光é®è”½å¼ºåº¦ã€‚å¦è¯·å‚阅 [member ssao_radius]。" #: doc/classes/Environment.xml msgid "" "The secondary screen-space ambient occlusion intensity. See also [member " "ssao_radius2]." -msgstr "主è¦çš„å±å¹•空间环境光é®è”½å¼ºåº¦ã€‚å‚阅 [member ssao_radius]。" +msgstr "次å±å¹•的空间环境光é®è”½å¼ºåº¦ã€‚å¦è¯·å‚阅 [member ssao_radius2]。" #: doc/classes/Environment.xml msgid "" @@ -31817,9 +31829,9 @@ msgid "" "inside the segment ([code]s1[/code], [code]s2[/code]) or outside of it, i.e. " "somewhere on the line extending from the segment." msgstr "" -"返回由([code]s1[/code], [code]s2[/code])定义的二维线上最接近[code]point[/" -"code]的二维点。返回的点å¯ä»¥åœ¨çº¿æ®µï¼ˆ[code]s1[/code], [code]s2[/code])内,也å¯" -"以在线段外,å³åœ¨ä»Žçº¿æ®µå»¶ä¼¸å‡ºæ¥çš„æŸå¤„ã€‚" +"返回由 ([code]s1[/code], [code]s2[/code]) 定义的 2D 线上最接近 [code]point[/" +"code] çš„ 2D 点。返回的点å¯ä»¥åœ¨çº¿æ®µ ([code]s1[/code], [code]s2[/code]) 内,也" +"å¯ä»¥åœ¨çº¿æ®µå¤–,å³åœ¨ä»Žçº¿æ®µå»¶ä¼¸å‡ºæ¥çš„æŸå¤„ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -35506,7 +35518,6 @@ msgid "A node with the ability to send HTTP(S) requests." msgstr "具有å‘é€ HTTP(S) 请求能力的节点。" #: doc/classes/HTTPRequest.xml -#, fuzzy msgid "" "A node with the ability to send HTTP requests. Uses [HTTPClient] " "internally.\n" @@ -35601,7 +35612,7 @@ msgstr "" " # 执行 POST 请求。截æ¢åˆ°æ–‡æ¡£ç¼–写时,下é¢çš„ URL 会返回 JSON。\n" " # 注æ„:请勿使用å•个 HTTPRequest 节点进行连ç»è¯·æ±‚。\n" " # 下é¢çš„ä»£ç æ®µä»…ä¾›å‚考。\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -35773,14 +35784,16 @@ msgid "" msgstr "å…许的最大é‡å®šå‘æ•°ã€‚ç”¨äºŽé˜²æ¢æ— é™é‡å®šå‘循环。" #: doc/classes/HTTPRequest.xml +#, fuzzy msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" "如果设为大于 [code]0.0[/code] 的值,在ç»è¿‡ [code]timeout[/code] ç§’ä»æœª[i]完æˆ" "[/i]请求时,该 HTTP 请求就会超时。对于 REST API ç‰è¾ƒå°çš„ HTTP 请求,将 " @@ -36013,7 +36026,7 @@ msgstr "" msgid "" "Stretches the image and enlarges it by a factor of 2. No interpolation is " "done." -msgstr "拉伸图åƒå¹¶å°†å…¶æ”¾å¤§2å€ï¼Œä¸è¿›è¡Œæ’值。" +msgstr "拉伸图åƒå¹¶å°†å…¶æ”¾å¤§ 2 å€ï¼Œä¸è¿›è¡Œæ’值。" #: doc/classes/Image.xml msgid "Fills the image with [code]color[/code]." @@ -36053,7 +36066,7 @@ msgstr "" "错误。\n" "[b]注æ„:[/b]多级æ¸è¿œçº¹ç†çš„ç”Ÿæˆæ˜¯åœ¨ CPU 上完æˆçš„,是å•线程的,并且[i]总是[/i]" "在主线程上完æˆã€‚è¿™æ„味ç€åœ¨æ¸¸æˆè¿‡ç¨‹ä¸ç”Ÿæˆå¤šçº§æ¸è¿œçº¹ç†ä¼šå¯¼è‡´æ˜Žæ˜¾çš„å¡é¡¿ï¼Œå³ä½¿ä»Ž " -"[Thread] 调用[method generate_mipmaps]。" +"[Thread] 调用 [method generate_mipmaps]。" #: doc/classes/Image.xml msgid "Returns a copy of the image's raw data." @@ -36303,7 +36316,7 @@ msgstr "" #: doc/classes/Image.xml msgid "Shrinks the image by a factor of 2." -msgstr "将图åƒç¼©å°2å€ã€‚" +msgstr "将图åƒç¼©å° 2 å€ã€‚" #: doc/classes/Image.xml msgid "Converts the raw data from the sRGB colorspace to a linear scale." @@ -36329,7 +36342,7 @@ msgstr "[Image] 资æºå…许的最大高度。" #: doc/classes/Image.xml msgid "Texture format with a single 8-bit depth representing luminance." -msgstr "çº¹ç†æ ¼å¼ï¼Œå…·æœ‰ä»£è¡¨äº®åº¦çš„å•一8使·±åº¦ã€‚" +msgstr "çº¹ç†æ ¼å¼ï¼Œå…·æœ‰ä»£è¡¨äº®åº¦çš„å•一 8 使·±åº¦ã€‚" #: doc/classes/Image.xml msgid "" @@ -36407,16 +36420,16 @@ msgid "" "OpenGL texture format [code]GL_RGB32F[/code] where there are three " "components, each a 32-bit floating-point values." msgstr "" -"OpenGLçº¹ç†æ ¼å¼[code]GL_RGB32F[/code]ï¼Œå…¶ä¸æœ‰ä¸‰ä¸ªéƒ¨åˆ†ï¼Œæ¯ä¸ªéƒ¨åˆ†éƒ½æ˜¯32使µ®ç‚¹" -"值。" +"OpenGL çº¹ç†æ ¼å¼ [code]GL_RGB32F[/code]ï¼Œå…¶ä¸æœ‰ä¸‰ä¸ªéƒ¨åˆ†ï¼Œæ¯ä¸ªéƒ¨åˆ†éƒ½æ˜¯ 32 使µ®" +"点值。" #: doc/classes/Image.xml msgid "" "OpenGL texture format [code]GL_RGBA32F[/code] where there are four " "components, each a 32-bit floating-point values." msgstr "" -"OpenGLçº¹ç†æ ¼å¼[code]GL_RGBA32F[/code]ï¼Œå…¶ä¸æœ‰å››ä¸ªéƒ¨åˆ†ï¼Œæ¯ä¸ªéƒ¨åˆ†éƒ½æ˜¯32使µ®ç‚¹" -"值。" +"OpenGL çº¹ç†æ ¼å¼ [code]GL_RGBA32F[/code]ï¼Œå…¶ä¸æœ‰å››ä¸ªéƒ¨åˆ†ï¼Œæ¯ä¸ªéƒ¨åˆ†éƒ½æ˜¯ 32 使µ®" +"点值。" #: doc/classes/Image.xml msgid "" @@ -36704,7 +36717,7 @@ msgstr "表示 [enum Format] 枚举的大å°ã€‚" msgid "" "Performs nearest-neighbor interpolation. If the image is resized, it will be " "pixelated." -msgstr "执行最近邻æ’值.如果调整图åƒå¤§å°,它将被åƒç´ 化." +msgstr "执行最近邻æ’值。如果调整图åƒå¤§å°ï¼Œå®ƒå°†è¢«åƒç´ 化。" #: doc/classes/Image.xml msgid "" @@ -36721,8 +36734,8 @@ msgid "" "This mode often gives better results compared to [constant " "INTERPOLATE_BILINEAR], at the cost of being slower." msgstr "" -"执行三次æ’值.如果调整图åƒå¤§å°,则图åƒå°†æ¨¡ç³Š.与[constant INTERPOLATE_BILINEAR]" -"相比,æ¤æ¨¡å¼é€šå¸¸ä¼šäº§ç”Ÿæ›´å¥½çš„结果,但代价是速度较慢." +"执行三次æ’值。如果调整图åƒå¤§å°ï¼Œåˆ™å›¾åƒå°†æ¨¡ç³Šã€‚与 [constant " +"INTERPOLATE_BILINEAR] ç›¸æ¯”ï¼Œæ¤æ¨¡å¼é€šå¸¸ä¼šäº§ç”Ÿæ›´å¥½çš„结果,但代价是速度较慢。" #: doc/classes/Image.xml msgid "" @@ -36754,36 +36767,36 @@ msgid "" "Performs Lanczos interpolation. This is the slowest image resizing mode, but " "it typically gives the best results, especially when downscalng images." msgstr "" -"执行Lanczosæ’值.这是最慢的图åƒè°ƒæ•´å¤§å°æ¨¡å¼,但通常å¯ä»¥æä¾›æœ€ä½³æ•ˆæžœ,尤其是在缩" -"å°å›¾åƒæ—¶." +"执行 Lanczos æ’值。这是最慢的图åƒè°ƒæ•´å¤§å°æ¨¡å¼ï¼Œä½†é€šå¸¸å¯ä»¥æä¾›æœ€ä½³æ•ˆæžœï¼Œå°¤å…¶æ˜¯" +"在缩å°å›¾åƒæ—¶ã€‚" #: doc/classes/Image.xml msgid "Image does not have alpha." -msgstr "图片没有Alpha通é“." +msgstr "图片没有 Alpha 通é“。" #: doc/classes/Image.xml msgid "Image stores alpha in a single bit." -msgstr "图åƒå°†Alphaå˜å‚¨åœ¨å•个bitä¸." +msgstr "图åƒå°† Alpha å˜å‚¨åœ¨å•个 bit ä¸ã€‚" #: doc/classes/Image.xml msgid "Image uses alpha." -msgstr "图åƒä½¿ç”¨é˜¿å°”法。" +msgstr "图åƒä½¿ç”¨ Alpha。" #: doc/classes/Image.xml msgid "Use S3TC compression." -msgstr "使用S3TC压缩。" +msgstr "使用 S3TC 压缩。" #: doc/classes/Image.xml msgid "Use PVRTC2 compression." -msgstr "使用PVRTC2压缩。" +msgstr "使用 PVRTC2 压缩。" #: doc/classes/Image.xml msgid "Use PVRTC4 compression." -msgstr "使用PVRTC4压缩。" +msgstr "使用 PVRTC4 压缩。" #: doc/classes/Image.xml msgid "Use ETC compression." -msgstr "使用ETC压缩。" +msgstr "使用 ETC 压缩。" #: doc/classes/Image.xml msgid "Use ETC2 compression." @@ -37002,7 +37015,7 @@ msgstr "" #: doc/classes/ImmediateGeometry.xml msgid "" "Simple helper to draw an UV sphere with given latitude, longitude and radius." -msgstr "用于绘制给定ç»çº¬åº¦å’ŒåŠå¾„çš„UVçƒä½“的简å•辅助工具。" +msgstr "用于绘制给定ç»çº¬åº¦å’ŒåŠå¾„çš„ UV çƒä½“的简å•辅助工具。" #: doc/classes/ImmediateGeometry.xml msgid "" @@ -37022,11 +37035,11 @@ msgstr "" #: doc/classes/ImmediateGeometry.xml msgid "Clears everything that was drawn using begin/end." -msgstr "清除使用begin/end绘制的一切内容。" +msgstr "清除使用 begin/end 绘制的一切内容。" #: doc/classes/ImmediateGeometry.xml msgid "Ends a drawing context and displays the results." -msgstr "ç»“æŸæ£åœ¨ç»˜åˆ¶çš„context并显示其结果。" +msgstr "ç»“æŸæ£åœ¨ç»˜åˆ¶çš„上下文并显示其结果。" #: doc/classes/ImmediateGeometry.xml msgid "The current drawing color." @@ -37078,10 +37091,10 @@ msgid "" "[method parse_input_event] instead." msgstr "" "这将模拟按下指定的按键动作。\n" -"强度å¯ä»¥ç”¨äºŽéžå¸ƒå°”è¿ç®—的动作,它的范围在0 到 1之间,代表给定动作的力度。\n" -"[b]注æ„:[/b]这个方法ä¸ä¼šå¼•起任何[method Node._input]调用。它旨在与[method " -"is_action_pressed]å’Œ[method is_action_just_pressed]ä¸€èµ·ä½¿ç”¨ã€‚å¦‚æžœä½ æƒ³æ¨¡æ‹Ÿ" -"[code]_input[/code],请使用[method parse_input_event]代替。" +"强度å¯ä»¥ç”¨äºŽéžå¸ƒå°”è¿ç®—的动作,它的范围在 0 到 1 之间,代表给定动作的力度。\n" +"[b]注æ„:[/b]这个方法ä¸ä¼šå¼•起任何 [method Node._input] 调用。它旨在与 " +"[method is_action_pressed] å’Œ [method is_action_just_pressed] 一起使用。如果" +"ä½ æƒ³æ¨¡æ‹Ÿ [code]_input[/code],请使用 [method parse_input_event] 代替。" #: doc/classes/Input.xml msgid "If the specified action is already pressed, this will release it." @@ -37170,8 +37183,8 @@ msgid "" "get_action_strength(\"negative_action\")[/code]." msgstr "" "通过指定两个动作æ¥èŽ·å–轴的输入,一个是负的,一个是æ£çš„。\n" -"这是写[code]Input.get_action_strength(\"positive_action\")-Input." -"get_action_strength(\"negative_action\")[/code]的简写。" +"这是 [code]Input.get_action_strength(\"positive_action\")-Input." +"get_action_strength(\"negative_action\")[/code] 的简写。" #: doc/classes/Input.xml msgid "" @@ -37181,7 +37194,7 @@ msgstr "返回一个 [Array],包å«å½“剿‰€æœ‰è¿žæŽ¥æ‰‹æŸ„的设备 ID。" #: doc/classes/Input.xml msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." -msgstr "è¿”å›žå½“å‰æŒ‡å®šçš„å…‰æ ‡å½¢çŠ¶ï¼ˆå‚阅 [enum CursorShape])。" +msgstr "è¿”å›žå½“å‰æŒ‡å®šçš„å…‰æ ‡å½¢çŠ¶ï¼ˆè§ [enum CursorShape])。" #: doc/classes/Input.xml msgid "" @@ -37192,11 +37205,11 @@ msgid "" "measurement for each axis is m/s² while on iOS it's a multiple of the " "Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²)." msgstr "" -"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„é‡åŠ›ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回[constant Vector3." +"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„é‡åŠ›ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回 [constant Vector3." "ZERO]。\n" -"[b]注æ„:[/b]这个方法åªåœ¨Androidå’ŒiOS上工作。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”回" -"[constant Vector3.ZERO]。在Android上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯m/s²,而在iOS上,它是" -"地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•°[code]g[/code](~9.81 m/s²)。" +"[b]注æ„:[/b]这个方法åªåœ¨ Android å’Œ iOS 上工作。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”回 " +"[constant Vector3.ZERO]。在 Android 上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯ m/s²,而在 iOS " +"上,它是地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•° [code]g[/code](~9.81 m/s²)。" #: doc/classes/Input.xml msgid "" @@ -37206,16 +37219,16 @@ msgid "" "[b]Note:[/b] This method only works on Android and iOS. On other platforms, " "it always returns [constant Vector3.ZERO]." msgstr "" -"å¦‚æžœè®¾å¤‡æœ‰é™€èžºä»ªä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žå›´ç»•è®¾å¤‡Xã€Yã€Z轴的旋转速率,å•ä½ä¸ºrad/s。å¦" -"则,该方法返回[constant Vector3.ZERO]。\n" -"[b]注æ„:[/b]这个方法åªåœ¨Androidå’ŒiOS上工作。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回[constant " -"Vector3.ZERO]。" +"å¦‚æžœè®¾å¤‡æœ‰é™€èžºä»ªä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žå›´ç»•è®¾å¤‡ Xã€Yã€Z 轴的旋转速率,å•ä½ä¸º rad/s。å¦" +"则,该方法返回 [constant Vector3.ZERO]。\n" +"[b]注æ„:[/b]这个方法åªåœ¨ Android å’Œ iOS 上工作。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回 " +"[constant Vector3.ZERO]。" #: doc/classes/Input.xml msgid "" "Returns the current value of the joypad axis at given index (see [enum " "JoystickList])." -msgstr "è¿”å›žç»™å®šç´¢å¼•çš„æ¸¸æˆæ‰‹æŸ„轴的当å‰å€¼ï¼Œå‚阅[enum JoystickList]。" +msgstr "è¿”å›žç»™å®šç´¢å¼•çš„æ¸¸æˆæ‰‹æŸ„轴的当å‰å€¼ï¼ˆè§ [enum JoystickList])。" #: doc/classes/Input.xml msgid "Returns the index of the provided axis name." @@ -37236,15 +37249,16 @@ msgid "" "Receives a gamepad button from [enum JoystickList] and returns its " "equivalent name as a string." msgstr "" -"从[enum JoystickList]ä¸æŽ¥æ”¶æ¸¸æˆæ‰‹æŸ„按钮,并将其对应的å称作为一个å—符串返回。" +"从 [enum JoystickList] ä¸æŽ¥æ”¶æ¸¸æˆæ‰‹æŸ„按钮,并将其对应的å称作为一个å—符串返" +"回。" #: doc/classes/Input.xml msgid "" "Returns a SDL2-compatible device GUID on platforms that use gamepad " "remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." msgstr "" -"åœ¨ä½¿ç”¨æ¸¸æˆæ‰‹æŸ„釿˜ 射的平å°ä¸Šè¿”回一个SDL2兼容的设备GUID。å¦åˆ™è¿”回 " -"[code]\"Default Gamepad\"[/code]é»˜è®¤æ¸¸æˆæ‰‹æŸ„。" +"åœ¨ä½¿ç”¨æ¸¸æˆæ‰‹æŸ„釿˜ 射的平å°ä¸Šè¿”回一个 SDL2 兼容的设备 GUID。å¦åˆ™è¿”回 " +"[code]\"Default Gamepad\"[/code] é»˜è®¤æ¸¸æˆæ‰‹æŸ„。" #: doc/classes/Input.xml msgid "Returns the name of the joypad at the specified device index." @@ -37485,7 +37499,7 @@ msgstr "" #: doc/classes/Input.xml msgid "" "Removes all mappings from the internal database that match the given GUID." -msgstr "从内部数æ®åº“ä¸åˆ 除与给定GUID匹é…çš„æ‰€æœ‰æ˜ å°„." +msgstr "从内部数æ®åº“ä¸åˆ 除与给定 GUID 匹é…çš„æ‰€æœ‰æ˜ å°„ã€‚" #: doc/classes/Input.xml msgid "" @@ -37495,9 +37509,9 @@ msgid "" "[b]Note:[/b] This value can be immediately overwritten by the hardware " "sensor value on Android and iOS." msgstr "" -"è®¾ç½®åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨çš„åŠ é€Ÿåº¦å€¼ã€‚å¯ä»¥ç”¨äºŽåœ¨æ²¡æœ‰ç¡¬ä»¶ä¼ 感器的设备上进行调试,例如在" -"PC上的编辑器ä¸ã€‚\n" -"[b]注æ„:[/b]这个值在Androidå’ŒiOS上å¯ç«‹å³è¢«ç¡¬ä»¶ä¼ 感器的值所覆盖。" +"è®¾ç½®åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨çš„åŠ é€Ÿåº¦å€¼ã€‚å¯ä»¥ç”¨äºŽåœ¨æ²¡æœ‰ç¡¬ä»¶ä¼ 感器的设备上进行调试,例如在 " +"PC 上的编辑器ä¸ã€‚\n" +"[b]注æ„:[/b]这个值在 Android å’Œ iOS 上å¯ç«‹å³è¢«ç¡¬ä»¶ä¼ 感器的值所覆盖。" #: doc/classes/Input.xml msgid "" @@ -37532,7 +37546,7 @@ msgid "" "[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " "cursor immediately." msgstr "" -"设置视窗ä¸ä½¿ç”¨çš„é»˜è®¤å…‰æ ‡å½¢çŠ¶ï¼Œè€Œä¸æ˜¯ [constant CURSOR_ARROW]。\n" +"设置该视区ä¸ä½¿ç”¨çš„é»˜è®¤å…‰æ ‡å½¢çŠ¶ï¼Œè€Œä¸æ˜¯ [constant CURSOR_ARROW]。\n" "[b]注æ„:[/b]å¦‚æžœè¦æ›´æ”¹ [Control] èŠ‚ç‚¹çš„é»˜è®¤å…‰æ ‡å½¢çŠ¶ï¼Œè¯·æ”¹ç”¨ [member Control." "mouse_default_cursor_shape]。\n" "[b]注æ„:[/b]这个方法会生æˆä¸€ä¸ª [InputEventMouseMotion] ä»¥ç«‹å³æ›´æ–°å…‰æ ‡ã€‚" @@ -37639,16 +37653,18 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" "如果为 [code]true[/code],会对æ“作系统å‘é€çš„类似输入事件进行累积。当å¯ç”¨è¾“å…¥" "累积时,在一帧ä¸äº§ç”Ÿçš„æ‰€æœ‰è¾“入事件将被åˆå¹¶ï¼Œå¹¶åœ¨è¯¥å¸§å®Œæˆæ¸²æŸ“æ—¶å‘å‡ºã€‚å› æ¤ï¼Œè¿™" "é™åˆ¶äº†æ¯ç§’的输入方法调用次数,使之与渲染FPS相一致。\n" -"è¾“å…¥ç´¯åŠ åœ¨é»˜è®¤æƒ…å†µä¸‹æ˜¯å¯ç”¨çš„。它å¯ä»¥è¢«ç¦ç”¨ï¼Œå°†ä»¥å¢žåŠ CPU使用率为代价,获得ç¨å¾®" +"输入累积在默认情况下是å¯ç”¨çš„。它å¯ä»¥è¢«ç¦ç”¨ï¼Œå°†ä»¥å¢žåŠ CPU使用率为代价,获得ç¨å¾®" "æ›´ç²¾ç¡®åŠæ›´çµæ•的输入。在需è¦è‡ªç”±ç»˜åˆ¶çº¿æ¡çš„应用ä¸ï¼Œä¸€èˆ¬åº”ç”¨åœ¨ç”¨æˆ·ç»˜åˆ¶çº¿æ¡æ—¶ç¦" -"ç”¨è¾“å…¥ç´¯åŠ ï¼Œä»¥èŽ·å¾—ç´§è·Ÿå®žé™…è¾“å…¥çš„ç»“æžœã€‚" +"ç”¨è¾“å…¥ç´¯åŠ ï¼Œä»¥èŽ·å¾—ç´§è·Ÿå®žé™…è¾“å…¥çš„ç»“æžœã€‚\n" +"[b]注æ„:[/b]默认[i]ç¦ç”¨[/i]输入累积是出于å‘åŽå…¼å®¹çš„缘故。然而我们推è那些ä¸" +"需è¦éžå¸¸æ´»è·ƒè¾“入的游æˆå°†å…¶å¯ç”¨ï¼Œèƒ½å¤Ÿé™ä½Ž CPU å 用。" #: doc/classes/Input.xml msgid "Emitted when a joypad device has been connected or disconnected." @@ -38056,7 +38072,8 @@ msgstr "" msgid "" "Stores information about joystick motions. One [InputEventJoypadMotion] " "represents one axis at a time." -msgstr "å˜å‚¨å…³äºŽæ“纵æ†è¿åŠ¨çš„ä¿¡æ¯ã€‚一个[InputEventJoypadMotion]一次代表一个轴。" +msgstr "" +"å˜å‚¨å…³äºŽæ“纵æ†è¿åŠ¨çš„ä¿¡æ¯ã€‚一个 [InputEventJoypadMotion] 一次代表一个轴。" #: doc/classes/InputEventJoypadMotion.xml msgid "Axis identifier. Use one of the [enum JoystickList] axis constants." @@ -38377,28 +38394,41 @@ msgstr "é¼ æ ‡ç§»åŠ¨äº‹ä»¶çš„è¾“å…¥äº‹ä»¶ç±»åž‹ã€‚" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " "avoid visible gaps in lines if the user is moving the mouse quickly." msgstr "" "包å«é¼ æ ‡å’Œç¬”çš„è¿åŠ¨ä¿¡æ¯ã€‚支æŒç›¸å¯¹ã€ç»å¯¹ä½ç½®å’Œé€Ÿåº¦ã€‚è§ [method Node._input]。\n" -"[b]注æ„:[/b]默认情况下,这个事件最多åªèƒ½åœ¨æ¯ä¸€å¸§æ¸²æŸ“ä¸å‘å‡ºä¸€æ¬¡ã€‚å¦‚æžœä½ éœ€è¦æ›´" -"精确的输入报告,请将 [member Input.use_accumulated_input] 设为 [code]false[/" -"code],让事件尽å¯èƒ½é¢‘ç¹åœ°å‘å°„ã€‚å¦‚æžœä½ ä½¿ç”¨ InputEventMouseMotion æ¥ç”»çº¿ï¼Œè¯·è€ƒ" -"è™‘åŒæ—¶å®žçް [url=https://en.wikipedia.org/wiki/" -"Bresenham%27s_line_algorithm]Bresenham 的线æ¡ç®—法[/url],以é¿å…在用户快速移动" -"é¼ æ ‡æ—¶å‡ºçŽ°å¯è§çš„线æ¡ç©ºéš™ã€‚" +"[b]注æ„:[/b]默认情况下,这个事件能够æ¯å¸§å‘出多次,æä¾›æ›´ç²¾ç¡®çš„输入报告,但代" +"价是更高的 CPU å ç”¨ã€‚ä½ å¯ä»¥å°† [member Input.use_accumulated_input] 设为 " +"[code]true[/code],将æ¯å¸§ä¸çš„多个事件åˆå¹¶ä¸ºå•个事件进行å‘é€ã€‚\n" +"[b]注æ„:[/b]å¦‚æžœä½ ä½¿ç”¨ InputEventMouseMotion æ¥ç”»çº¿ï¼Œè¯·è€ƒè™‘åŒæ—¶å®žçް" +"[url=https://zh.wikipedia.org/zh-cn/" +"%E5%B8%83%E9%9B%B7%E6%A3%AE%E6%BC%A2%E5%A7%86%E7%9B%B4%E7%B7%9A%E6%BC%94%E7%AE%97%E6%B3%95]" +"布雷森汉姆直线算法[/url],以é¿å…åœ¨ç”¨æˆ·å¿«é€Ÿç§»åŠ¨é¼ æ ‡æ—¶å‡ºçŽ°å¯è§çš„线æ¡ç©ºéš™ã€‚" #: doc/classes/InputEventMouseMotion.xml msgid "Mouse and input coordinates" msgstr "é¼ æ ‡å’Œè¾“å…¥åæ ‡" #: doc/classes/InputEventMouseMotion.xml +#, fuzzy +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" +"返回键盘布局的数é‡ã€‚\n" +"[b]注æ„:[/b]本方法在Linuxã€macOSå’ŒWindows上实现。" + +#: doc/classes/InputEventMouseMotion.xml msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." @@ -38540,15 +38570,15 @@ msgstr "" #: doc/classes/InputMap.xml msgid "" "Adds an [InputEvent] to an action. This [InputEvent] will trigger the action." -msgstr "ç»™ä¸€ä¸ªåŠ¨ä½œæ·»åŠ ä¸€ä¸ª[InputEvent]。这个[InputEvent]将触å‘这个动作。" +msgstr "ç»™æŸä¸ªåŠ¨ä½œæ·»åŠ ä¸€ä¸ª [InputEvent]。这个 [InputEvent] 将触å‘这个动作。" #: doc/classes/InputMap.xml msgid "Removes an [InputEvent] from an action." -msgstr "从一个动作ä¸åˆ 除一个[InputEvent]。" +msgstr "从æŸä¸ªåŠ¨ä½œä¸åˆ 除一个 [InputEvent]。" #: doc/classes/InputMap.xml msgid "Removes all events from an action." -msgstr "从动作ä¸åˆ 除所有事件。" +msgstr "从æŸä¸ªåŠ¨ä½œä¸åˆ 除所有事件。" #: doc/classes/InputMap.xml msgid "Returns a deadzone value for the action." @@ -38558,7 +38588,7 @@ msgstr "返回该æ“作的æ»åŒºå€¼ã€‚" msgid "" "Returns [code]true[/code] if the action has the given [InputEvent] " "associated with it." -msgstr "如果该动作有给定的[InputEvent]与之相关,则返回 [code]true[/code]。" +msgstr "如果该动作有给定的 [InputEvent] 与之相关,则返回 [code]true[/code]。" #: doc/classes/InputMap.xml msgid "Sets a deadzone value for the action." @@ -38571,12 +38601,13 @@ msgid "" "An [InputEvent] can then be added to this action with [method " "action_add_event]." msgstr "" -"在[InputMap]ä¸Šæ·»åŠ ä¸€ä¸ªç©ºçš„åŠ¨ä½œï¼Œæœ‰ä¸€ä¸ªå¯é…置的æ»åŒº[code]deadzone[/code]。\n" -"ç„¶åŽå¯ä»¥ç”¨[method action_add_event]ç»™è¿™ä¸ªåŠ¨ä½œæ·»åŠ ä¸€ä¸ª[InputEvent]。" +"在 [InputMap] ä¸Šæ·»åŠ ä¸€ä¸ªç©ºçš„åŠ¨ä½œï¼Œæœ‰ä¸€ä¸ªå¯é…置的æ»åŒº [code]deadzone[/" +"code]。\n" +"ç„¶åŽå¯ä»¥ç”¨ [method action_add_event] ç»™è¿™ä¸ªåŠ¨ä½œæ·»åŠ ä¸€ä¸ª [InputEvent]。" #: doc/classes/InputMap.xml msgid "Removes an action from the [InputMap]." -msgstr "从[InputMap]ä¸åˆ 除一个动作。" +msgstr "从 [InputMap] ä¸åˆ 除一个动作。" #: doc/classes/InputMap.xml msgid "" @@ -38610,21 +38641,21 @@ msgstr "" #: doc/classes/InputMap.xml msgid "Returns an array of all actions in the [InputMap]." -msgstr "返回[InputMap]䏿‰€æœ‰åŠ¨ä½œçš„æ•°ç»„ã€‚" +msgstr "返回 [InputMap] 䏿‰€æœ‰åŠ¨ä½œçš„æ•°ç»„ã€‚" #: doc/classes/InputMap.xml msgid "" "Returns [code]true[/code] if the [InputMap] has a registered action with the " "given name." -msgstr "如果[InputMap]有一个给定å称的注册动作,返回 [code]true[/code]。" +msgstr "如果 [InputMap] 有一个给定å称的注册动作,返回 [code]true[/code]。" #: doc/classes/InputMap.xml msgid "" "Clears all [InputEventAction] in the [InputMap] and load it anew from " "[ProjectSettings]." msgstr "" -"清除[InputMap]ä¸çš„æ‰€æœ‰[InputEventAction],并从[ProjectSettings]项目设置ä¸é‡æ–°" -"åŠ è½½å®ƒã€‚" +"清除 [InputMap] ä¸çš„æ‰€æœ‰ [InputEventAction],并从 [ProjectSettings] 项目设置" +"ä¸é‡æ–°åŠ è½½å®ƒã€‚" #: doc/classes/InstancePlaceholder.xml msgid "Placeholder for the root [Node] of a [PackedScene]." @@ -38663,7 +38694,7 @@ msgid "" "Object.call_deferred] if calling from a thread." msgstr "" "获å–调用 [method replace_by_instance] æ—¶é»˜è®¤åŠ è½½çš„ [PackedScene] èµ„æºæ–‡ä»¶çš„è·¯" -"å¾„ã€‚ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从线程调用,请使用[method Object.call_deferred]。" +"å¾„ã€‚ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从线程调用,请使用 [method Object.call_deferred]。" #: doc/classes/InstancePlaceholder.xml msgid "" @@ -38757,7 +38788,7 @@ msgstr "" #: doc/classes/InterpolatedCamera.xml msgid "[i]Deprecated.[/i] Camera which moves toward another node." -msgstr "[i] 已弃用。[/i] å‘å¦ä¸€ä¸ªèŠ‚ç‚¹ç§»åŠ¨çš„ç›¸æœºã€‚" +msgstr "[i] 已弃用。[/i]å‘å¦ä¸€ä¸ªèŠ‚ç‚¹ç§»åŠ¨çš„ç›¸æœºã€‚" #: doc/classes/InterpolatedCamera.xml msgid "" @@ -38767,10 +38798,10 @@ msgid "" "If it is not [member enabled] or does not have a valid target set, " "InterpolatedCamera acts like a normal Camera." msgstr "" -"[i]å·²ç»å¼ƒç”¨ï¼ˆå°†åœ¨Godot 4.0 ä¸åˆ 除)。[/i]æ’值相机是一ç§[Camera],å¯ä»¥å¹³ç¨³åœ°ç§»" +"[i]已弃用(将在Godot 4.0 ä¸åˆ 除)。[/i]æ’å€¼ç›¸æœºæ˜¯ä¸€ç§ [Camera],å¯ä»¥å¹³ç¨³åœ°ç§»" "动,以匹é…ç›®æ ‡èŠ‚ç‚¹çš„ä½ç½®å’Œæ—‹è½¬ã€‚\n" -"å¦‚æžœå®ƒä¸æ˜¯[member enabled]æˆ–æ²¡æœ‰æœ‰æ•ˆçš„ç›®æ ‡é›†ï¼ŒInterpolatedCamera 的行为就åƒä¸€" -"个æ£å¸¸çš„相机。" +"å¦‚æžœå®ƒä¸æ˜¯ [member enabled] æˆ–æ²¡æœ‰æœ‰æ•ˆçš„ç›®æ ‡é›†ï¼ŒInterpolatedCamera 的行为就åƒ" +"一个æ£å¸¸çš„相机。" #: doc/classes/InterpolatedCamera.xml msgid "Sets the node to move toward and orient with." @@ -38783,10 +38814,9 @@ msgid "" msgstr "如果为 [code]true[/code]ï¼Œå¹¶ä¸”è®¾ç½®äº†ç›®æ ‡ï¼Œç›¸æœºå°†è‡ªåŠ¨ç§»åŠ¨ã€‚" #: doc/classes/InterpolatedCamera.xml -#, fuzzy msgid "" "The camera's process callback. See [enum InterpolatedCameraProcessMode]." -msgstr "相机的过程回调。请å‚阅[enum Camera2DProcessMode]。" +msgstr "该相机的处ç†å›žè°ƒã€‚è§ [enum InterpolatedCameraProcessMode]。" #: doc/classes/InterpolatedCamera.xml msgid "" @@ -38796,7 +38826,7 @@ msgstr "相机å‘å…¶ç›®æ ‡ç§»åŠ¨çš„é€Ÿåº¦ã€‚è¾ƒé«˜çš„å€¼å°†å¯¼è‡´ç›¸æœºçš„è¿åЍ #: doc/classes/InterpolatedCamera.xml msgid "The target's [NodePath]." -msgstr "ç›®æ ‡çš„[NodePath]。" +msgstr "ç›®æ ‡çš„ [NodePath]。" #: doc/classes/IntervalTweener.xml msgid "Creates an idle interval in a [SceneTreeTween] animation." @@ -38847,7 +38877,7 @@ msgstr "" #: doc/classes/IP.xml msgid "Returns all the user's current IPv4 and IPv6 addresses as an array." -msgstr "以数组形å¼è¿”回所有用户的当å‰IPv4å’ŒIPv6地å€ã€‚" +msgstr "以数组形å¼è¿”å›žæ‰€æœ‰ç”¨æˆ·çš„å½“å‰ IPv4 å’Œ IPv6 地å€ã€‚" #: doc/classes/IP.xml msgid "" @@ -38905,8 +38935,8 @@ msgid "" "method). The address type returned depends on the [enum Type] constant given " "as [code]ip_type[/code]." msgstr "" -"åœ¨è§£æžæ—¶è¿”回一个给定的主机åçš„IPv4或IPv6地å€ï¼ˆé˜»å¡žç±»åž‹æ–¹æ³•)。返回的地å€ç±»åž‹" -"å–决于作为[code]ip_type[/code]çš„[enum Type]常é‡ã€‚" +"åœ¨è§£æžæ—¶è¿”回一个给定的主机åçš„ IPv4 或 IPv6 地å€ï¼ˆé˜»å¡žç±»åž‹æ–¹æ³•)。返回的地å€" +"类型å–决于作为 [code]ip_type[/code] çš„ [enum Type] 常é‡ã€‚" #: doc/classes/IP.xml msgid "" @@ -38947,7 +38977,7 @@ msgid "" "Maximum number of concurrent DNS resolver queries allowed, [constant " "RESOLVER_INVALID_ID] is returned if exceeded." msgstr "" -"å…许的最大并å‘DNSè§£æžå™¨æŸ¥è¯¢æ•°é‡ï¼Œå¦‚果超过,则返回[constant " +"å…è®¸çš„æœ€å¤§å¹¶å‘ DNS è§£æžå™¨æŸ¥è¯¢æ•°é‡ï¼Œå¦‚果超过,则返回 [constant " "RESOLVER_INVALID_ID]。" #: doc/classes/IP.xml @@ -38978,7 +39008,6 @@ msgid "" msgstr "æä¾›å¯é€‰ä¸é¡¹ç›®ï¼ˆå’Œ/æˆ–å›¾æ ‡ï¼‰åˆ—è¡¨çš„æŽ§ä»¶ï¼Œæ—¢å¯ä»¥æ˜¯å•列,也å¯ä»¥æ˜¯å¤šåˆ—。" #: doc/classes/ItemList.xml -#, fuzzy msgid "" "This control provides a selectable list of items that may be in a single (or " "multiple columns) with option of text, icons, or both text and icon. " @@ -39008,12 +39037,19 @@ msgstr "" "本ã€å›¾æ ‡æˆ–åŒæ—¶é€‰æ‹©æ–‡æœ¬å’Œå›¾æ ‡ã€‚支æŒå·¥å…·æç¤ºï¼Œåˆ—表ä¸çš„æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æ˜¯ä¸åŒ" "的。\n" "列表ä¸å¯é€‰æ‹©çš„项目å¯ä»¥è¢«é€‰æ‹©æˆ–å–æ¶ˆé€‰æ‹©ï¼Œå¹¶ä¸”å¯ä»¥å¯ç”¨å¤šé‡é€‰æ‹©ã€‚ç”¨é¼ æ ‡å³é”®é€‰æ‹©" -"也å¯ä»¥è¢«å¯ç”¨ï¼Œä»¥å…许使用弹出å¼ä¸Šä¸‹æ–‡èœå•。项目也å¯ä»¥é€šè¿‡åŒå‡»å®ƒä»¬æˆ–按Enter回车" -"é”®æ¥ \"激活\"。\n" -"é¡¹ç›®æ–‡æœ¬åªæ”¯æŒå•行å—符串,å—符串ä¸çš„æ¢è¡Œå—符(例如[code]\\n[/code])ä¸ä¼šäº§ç”Ÿ" -"æ¢è¡Œã€‚在[constant ICON_MODE_TOP]模å¼ä¸‹ï¼Œæ–‡æœ¬è‡ªé€‚应(warp)是å¯ç”¨çš„,但默认情况" -"下会调整列的宽度以完全适åˆå…¶å†…å®¹ã€‚ä½ éœ€è¦è®¾ç½®[member fixed_column_width]大于0" -"æ¥åŒ…使–‡æœ¬ã€‚" +"也å¯ä»¥è¢«å¯ç”¨ï¼Œä»¥å…许使用弹出å¼ä¸Šä¸‹æ–‡èœå•。项目也å¯ä»¥é€šè¿‡åŒå‡»å®ƒä»¬æˆ–按回车键" +"æ¥â€œæ¿€æ´»â€ã€‚\n" +"é¡¹ç›®æ–‡æœ¬åªæ”¯æŒå•行å—符串,å—符串ä¸çš„æ¢è¡Œå—符(例如 [code]\\n[/code])ä¸ä¼šäº§ç”Ÿ" +"æ¢è¡Œã€‚文本æ¢è¡Œä¼šåœ¨ [constant ICON_MODE_TOP] 模å¼ä¸‹å¯ç”¨ï¼Œä½†é»˜è®¤æƒ…况下会调整列" +"的宽度以完全适åˆå…¶å†…å®¹ã€‚ä½ éœ€è¦å°† [member fixed_column_width] 设为大于 0 的值" +"æ‰èƒ½è®©æ–‡æœ¬æ¢è¡Œã€‚\n" +"[b]å¢žé‡æœç´¢ï¼š[/b]与 [PopupMenu] å’Œ [Tree] 类似,[ItemList] 也支æŒåœ¨èšç„¦æŽ§ä»¶æ—¶" +"在列表ä¸è¿›è¡Œæœç´¢ã€‚按下与æŸä¸ªæ¡ç›®åç§°é¦–å—æ¯ä¸€è‡´çš„æŒ‰é”®ï¼Œå°±ä¼šé€‰ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„" +"第一个æ¡ç›®ã€‚在æ¤ä¹‹åŽï¼Œè¿›è¡Œå¢žé‡æœç´¢çš„办法有两ç§ï¼š1)在超时å‰å†æ¬¡æŒ‰ä¸‹åŒä¸€ä¸ªæŒ‰" +"键,选ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„下一个æ¡ç›®ã€‚2ï¼‰åœ¨è¶…æ—¶å‰æŒ‰ä¸‹å‰©ä½™å—æ¯å¯¹åº”的按键,直接匹é…" +"并选䏿‰€éœ€çš„æ¡ç›®ã€‚è¿™ä¸¤ä¸ªåŠ¨ä½œéƒ½ä¼šåœ¨æœ€åŽä¸€æ¬¡æŒ‰é”®è¶…æ—¶åŽé‡ç½®å›žåˆ—è¡¨é¡¶ç«¯ã€‚ä½ å¯ä»¥é€š" +"过 [member ProjectSettings.gui/timers/incremental_search_max_interval_msec] " +"修改超时时长。" #: doc/classes/ItemList.xml msgid "Adds an item to the item list with no text, only an icon." @@ -39026,9 +39062,9 @@ msgid "" "with no icon.\n" "If selectable is [code]true[/code], the list item will be selectable." msgstr "" -"å°†ä¸€ä¸ªé¡¹ç›®æ·»åŠ åˆ°é¡¹ç›®åˆ—è¡¨ä¸ï¼Œå¹¶æŒ‡å®šæ–‡æœ¬ã€‚æŒ‡å®šä¸€ä¸ªå›¾æ ‡[code]icon[/code],或者图" -"æ ‡[code]icon[/code]使用空[code]null[/code]ä½œä¸ºæ²¡æœ‰å›¾æ ‡çš„åˆ—è¡¨é¡¹ã€‚\n" -"如果å¯é€‰æ‹©å¡«[code]true[/code],列表项将是å¯é€‰æ‹©çš„。" +"å°†ä¸€ä¸ªé¡¹ç›®æ·»åŠ åˆ°é¡¹ç›®åˆ—è¡¨ä¸ï¼Œå¹¶æŒ‡å®šæ–‡æœ¬ã€‚æŒ‡å®šä¸€ä¸ªå›¾æ ‡ [code]icon[/code],或者" +"å›¾æ ‡ [code]icon[/code] 使用空 [code]null[/code] ä½œä¸ºæ²¡æœ‰å›¾æ ‡çš„åˆ—è¡¨é¡¹ã€‚\n" +"如果å¯é€‰æ‹©å¡« [code]true[/code],列表项将是å¯é€‰æ‹©çš„。" #: doc/classes/ItemList.xml msgid "Removes all items from the list." @@ -39059,13 +39095,13 @@ msgstr "返回当å‰åˆ—表ä¸çš„项目数。" msgid "" "Returns the custom background color of the item specified by [code]idx[/" "code] index." -msgstr "返回由[code]idx[/code]索引指定的项目的自定义背景颜色。" +msgstr "返回由 [code]idx[/code] 索引指定的项目的自定义背景颜色。" #: doc/classes/ItemList.xml msgid "" "Returns the custom foreground color of the item specified by [code]idx[/" "code] index." -msgstr "返回由[code]idx[/code]ç´¢å¼•æŒ‡å®šé¡¹ç›®çš„è‡ªå®šä¹‰å‰æ™¯é¢œè‰²ã€‚" +msgstr "返回由 [code]idx[/code] ç´¢å¼•æŒ‡å®šé¡¹ç›®çš„è‡ªå®šä¹‰å‰æ™¯é¢œè‰²ã€‚" #: doc/classes/ItemList.xml msgid "Returns the icon associated with the specified index." @@ -39073,13 +39109,13 @@ msgstr "è¿”å›žä¸ŽæŒ‡å®šç´¢å¼•ç›¸å…³çš„å›¾æ ‡ã€‚" #: doc/classes/ItemList.xml msgid "Returns a [Color] modulating item's icon at the specified index." -msgstr "返回指定索引处的[Color]颜色调制(modulating) é¡¹çš„å›¾æ ‡ã€‚" +msgstr "返回指定索引处的 [Color] é¢œè‰²è°ƒåˆ¶é¡¹çš„å›¾æ ‡ã€‚" #: doc/classes/ItemList.xml msgid "" "Returns the region of item's icon used. The whole icon will be used if the " "region has no area." -msgstr "è¿”å›žé¡¹ç›®å›¾æ ‡çš„ä½¿ç”¨åŒºåŸŸã€‚å¦‚æžœè¯¥åŒºåŸŸå¤§å°ä¸º0ï¼Œæ•´ä¸ªå›¾æ ‡å°†è¢«ä½¿ç”¨ã€‚" +msgstr "è¿”å›žé¡¹ç›®å›¾æ ‡çš„ä½¿ç”¨åŒºåŸŸã€‚å¦‚æžœè¯¥åŒºåŸŸå¤§å°ä¸º 0ï¼Œæ•´ä¸ªå›¾æ ‡å°†è¢«ä½¿ç”¨ã€‚" #: doc/classes/ItemList.xml msgid "Returns the metadata value of the specified index." @@ -39159,13 +39195,13 @@ msgstr "" msgid "" "Sets the background color of the item specified by [code]idx[/code] index to " "the specified [Color]." -msgstr "å°†[code]idx[/code]索引指定的项目的背景色设置为指定的颜色[Color]。" +msgstr "å°† [code]idx[/code] 索引指定的项目的背景色设置为指定的颜色 [Color]。" #: doc/classes/ItemList.xml msgid "" "Sets the foreground color of the item specified by [code]idx[/code] index to " "the specified [Color]." -msgstr "å°†[code]idx[/code]ç´¢å¼•æŒ‡å®šé¡¹ç›®çš„å‰æ™¯é¢œè‰²è®¾ç½®ä¸ºæŒ‡å®šçš„颜色[Color]。" +msgstr "å°† [code]idx[/code] ç´¢å¼•æŒ‡å®šé¡¹ç›®çš„å‰æ™¯é¢œè‰²è®¾ç½®ä¸ºæŒ‡å®šçš„颜色 [Color]。" #: doc/classes/ItemList.xml msgid "" @@ -39174,17 +39210,17 @@ msgid "" "(when double-clicking or pressing Enter)." msgstr "" "ç¦ç”¨ï¼ˆæˆ–å¯ç”¨ï¼‰æŒ‡å®šç´¢å¼•上的项目。\n" -"ç¦ç”¨çš„项目ä¸èƒ½è¢«é€‰ä¸ï¼Œä¹Ÿä¸ä¼šè§¦å‘激活信å·ï¼ˆå½“åŒå‡»æˆ–按Enter回车键)。" +"ç¦ç”¨çš„项目ä¸èƒ½è¢«é€‰ä¸ï¼Œä¹Ÿä¸ä¼šè§¦å‘激活信å·ï¼ˆå½“åŒå‡»æˆ–按回车键)。" #: doc/classes/ItemList.xml msgid "" "Sets (or replaces) the icon's [Texture] associated with the specified index." -msgstr "设置(或替æ¢ï¼‰ä¸ŽæŒ‡å®šç´¢å¼•ç›¸å…³çš„å›¾æ ‡çš„çº¹ç†[Texture]。" +msgstr "设置(或替æ¢ï¼‰ä¸ŽæŒ‡å®šç´¢å¼•ç›¸å…³çš„å›¾æ ‡çš„çº¹ç† [Texture]。" #: doc/classes/ItemList.xml msgid "" "Sets a modulating [Color] of the item associated with the specified index." -msgstr "设置与指定索引相关的项目的调制颜色[Color]。" +msgstr "设置与指定索引相关的项目的调制颜色 [Color]。" #: doc/classes/ItemList.xml msgid "" @@ -39263,19 +39299,20 @@ msgid "" "affected." msgstr "" "æ‰€æœ‰å›¾æ ‡å°†è¢«è°ƒæ•´åˆ°çš„å°ºå¯¸ã€‚\n" -"如果X或Y分é‡ä¸å¤§äºŽ0ï¼Œå›¾æ ‡çš„å¤§å°å°†ä¸ä¼šå—到影å“。" +"如果 X 或 Y 分é‡ä¸å¤§äºŽ 0ï¼Œå›¾æ ‡çš„å¤§å°å°†ä¸ä¼šå—到影å“。" #: doc/classes/ItemList.xml msgid "" "The icon position, whether above or to the left of the text. See the [enum " "IconMode] constants." -msgstr "å›¾æ ‡çš„ä½ç½®ï¼Œæ˜¯åœ¨æ–‡æœ¬çš„上方还是在文本的左边。å‚阅[enum IconMode]常é‡ã€‚" +msgstr "" +"å›¾æ ‡çš„ä½ç½®ï¼Œæ˜¯åœ¨æ–‡æœ¬çš„上方还是在文本的左边。å‚阅 [enum IconMode] 常é‡ã€‚" #: doc/classes/ItemList.xml msgid "" "The scale of icon applied after [member fixed_icon_size] and transposing " "takes effect." -msgstr "在[member fixed_icon_size]和转置生效åŽåº”ç”¨çš„å›¾æ ‡æ¯”ä¾‹ã€‚" +msgstr "在 [member fixed_icon_size] 和转置生效åŽåº”ç”¨çš„å›¾æ ‡æ¯”ä¾‹ã€‚" #: doc/classes/ItemList.xml msgid "" @@ -39320,7 +39357,7 @@ msgstr "å…许å•选或多选。å‚阅[enum SelectMode]常é‡ã€‚" msgid "" "Triggered when specified list item is activated via double-clicking or by " "pressing Enter." -msgstr "当指定的列表项目通过åŒå‡»æˆ–按Enter激活时触å‘。" +msgstr "当指定的列表项目通过åŒå‡»æˆ–按回车键激活时触å‘。" #: doc/classes/ItemList.xml msgid "" @@ -39352,7 +39389,7 @@ msgstr "在å…许多选的列表上更改多选时触å‘。" msgid "" "Triggered when a left mouse click is issued within the rect of the list but " "on empty space." -msgstr "å½“é¼ æ ‡å·¦é”®åœ¨åˆ—è¡¨çš„çŸ©å½¢(rect)范围内但在空白处å•击时,会被触å‘。" +msgstr "å½“é¼ æ ‡å·¦é”®åœ¨åˆ—è¡¨çš„çŸ©å½¢èŒƒå›´å†…ä½†åœ¨ç©ºç™½å¤„å•击时,会被触å‘。" #: doc/classes/ItemList.xml msgid "" @@ -39360,8 +39397,8 @@ msgid "" "on empty space.\n" "[member allow_rmb_select] must be enabled." msgstr "" -"当在列表的矩形(rect)范围内但在空白处å•å‡»é¼ æ ‡å³é”®æ—¶è¢«è§¦å‘。\n" -"[member allow_rmb_select]必须被å¯ç”¨ã€‚" +"当在列表的矩形范围内但在空白处å•å‡»é¼ æ ‡å³é”®æ—¶è¢«è§¦å‘。\n" +"[member allow_rmb_select] 必须被å¯ç”¨ã€‚" #: doc/classes/ItemList.xml msgid "Icon is drawn above the text." @@ -39377,7 +39414,7 @@ msgstr "ä»…å…许选择å•个项目。" #: doc/classes/ItemList.xml msgid "Allows selecting multiple items by holding Ctrl or Shift." -msgstr "å…许通过按ä½Ctrl或Shift选择多个项目。" +msgstr "å…è®¸é€šè¿‡æŒ‰ä½ Ctrl 或 Shift 选择多个项目。" #: doc/classes/ItemList.xml doc/classes/Tree.xml msgid "Default text [Color] of the item." @@ -39385,7 +39422,7 @@ msgstr "项目的默认文本颜色 [Color]。" #: doc/classes/ItemList.xml doc/classes/Tree.xml msgid "Text [Color] used when the item is selected." -msgstr "选择项目时使用的文本颜色[Color]。" +msgstr "选择项目时使用的文本颜色 [Color]。" #: doc/classes/ItemList.xml msgid "" @@ -39421,27 +39458,27 @@ msgstr "[ItemList] çš„é»˜è®¤æ ·å¼ç›’ [StyleBox],å³åœ¨æŽ§ä»¶æœªèŽ·å¾—ç„¦ç‚¹æ— #: doc/classes/ItemList.xml msgid "[StyleBox] used when the [ItemList] is being focused." -msgstr "当[ItemList]被èšç„¦æ—¶ä½¿ç”¨çš„æ ·å¼ç›’[StyleBox]。" +msgstr "当 [ItemList] 被èšç„¦æ—¶ä½¿ç”¨çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "[StyleBox] used for the cursor, when the [ItemList] is being focused." -msgstr "当[ItemList]被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’[StyleBox]。" +msgstr "当 [ItemList] 被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] used for the cursor, when the [ItemList] is not being focused." -msgstr "当[ItemList]没有被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’[StyleBox]。" +msgstr "当 [ItemList] 没有被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is not being " "focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’[StyleBox],当[ItemList]没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is being focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’[StyleBox],当[ItemList]没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" #: doc/classes/JavaScript.xml msgid "" @@ -39670,7 +39707,7 @@ msgstr "创建 Android æ’ä»¶" #: doc/classes/Joint.xml msgid "Base class for all 3D joints." -msgstr "所有3D关节的基类。" +msgstr "所有 3D 关节的基类。" #: doc/classes/Joint.xml msgid "" @@ -39694,11 +39731,11 @@ msgstr "如果为 [code]true[/code]ï¼Œåˆ™èŠ‚ç‚¹çš„ä¸¤ä¸ªä¸»ä½“æ— æ³•ç›¸äº’ç¢°æ’ž #: doc/classes/Joint.xml msgid "The node attached to the first side (A) of the joint." -msgstr "连接到关节第一侧(A)的节点。" +msgstr "连接到关节第一侧(A)的节点。" #: doc/classes/Joint.xml msgid "The node attached to the second side (B) of the joint." -msgstr "连接到关节第二侧(B)的节点。" +msgstr "连接到关节第二侧(B)的节点。" #: doc/classes/Joint.xml msgid "" @@ -39957,9 +39994,9 @@ msgid "" "- [code]params[/code]: An array or dictionary of parameters being passed to " "the method." msgstr "" -"返回JSON-RPC通知形å¼çš„å—典。通知是一次性的信æ¯ï¼Œä¸éœ€è¦æœ‰å“应。\n" -"- [code]method[/code]:被调用的方法的å称。\n" -"- [code]params[/code]:ä¼ é€’ç»™è¯¥æ–¹æ³•çš„å‚æ•°çš„æ•°ç»„或å—典。" +"返回 JSON-RPC 通知形å¼çš„å—典。通知是一次性的信æ¯ï¼Œä¸éœ€è¦æœ‰å“应。\n" +"- [code]method[/code]:被调用的方法的å称。\n" +"- [code]params[/code]ï¼šä¼ é€’ç»™è¯¥æ–¹æ³•çš„å‚æ•°çš„æ•°ç»„或å—典。" #: doc/classes/JSONRPC.xml msgid "" @@ -39972,11 +40009,11 @@ msgid "" "- [code]id[/code]: Uniquely identifies this request. The server is expected " "to send a response with the same ID." msgstr "" -"以JSON-RPC请求的形å¼è¿”回å—典。请求被å‘é€åˆ°æœåŠ¡å™¨ï¼Œå¹¶æœŸæœ›å¾—åˆ°å“应。ID å—æ®µç”¨äºŽ" -"æœåŠ¡å™¨æŒ‡å®šå®ƒæ£åœ¨å“应的确切请求。\n" -"- [code]method[/code]:被调用的方法的å称。\n" -"- [code]params[/code]:ä¼ é€’ç»™è¯¥æ–¹æ³•çš„å‚æ•°çš„æ•°ç»„或å—典。\n" -"- [code]id[/code]:å”¯ä¸€æ ‡è¯†æ¤è¯·æ±‚。æœåŠ¡å™¨åº”å‘é€å…·æœ‰ç›¸åŒ ID çš„å“应。" +"以 JSON-RPC 请求的形å¼è¿”回å—典。请求被å‘é€åˆ°æœåŠ¡å™¨ï¼Œå¹¶æœŸæœ›å¾—åˆ°å“应。ID å—æ®µç”¨" +"于æœåŠ¡å™¨æŒ‡å®šå®ƒæ£åœ¨å“应的确切请求。\n" +"- [code]method[/code]:被调用的方法的å称。\n" +"- [code]params[/code]ï¼šä¼ é€’ç»™è¯¥æ–¹æ³•çš„å‚æ•°çš„æ•°ç»„或å—典。\n" +"- [code]id[/code]ï¼šå”¯ä¸€æ ‡è¯†æ¤è¯·æ±‚。æœåŠ¡å™¨åº”å‘é€å…·æœ‰ç›¸åŒ ID çš„å“应。" #: doc/classes/JSONRPC.xml msgid "" @@ -40016,9 +40053,8 @@ msgid "" "[code]action[/code]: The action to be run, as a Dictionary in the form of a " "JSON-RPC request or notification." msgstr "" -"给定采用 JSON-RPC 请求形å¼çš„å—典:解压请求并è¿è¡Œå®ƒã€‚通过查看å为 \"method\" " -"çš„å—æ®µå¹¶åœ¨ JSONRPC å¯¹è±¡ä¸æŸ¥æ‰¾ç‰æ•ˆå‘½å的函数æ¥è§£æžæ–¹æ³•。如果找到,则调用该方" -"法。\n" +"给定采用 JSON-RPC 请求形å¼çš„å—典:解压请求并è¿è¡Œå®ƒã€‚通过查看å为“methodâ€çš„å—" +"段并在 JSONRPC å¯¹è±¡ä¸æŸ¥æ‰¾ç‰æ•ˆå‘½å的函数æ¥è§£æžæ–¹æ³•。如果找到,则调用该方法。\n" "è¦æ·»åŠ æ–°çš„å—æ”¯æŒæ–¹æ³•,请扩展 JSONRPC ç±»å¹¶åœ¨ä½ çš„å类上调用 [method " "process_action]。\n" "[code]action[/code]:è¦è¿è¡Œçš„动作,作为 JSON-RPC 请求或通知形å¼çš„å—典。" @@ -40217,8 +40253,8 @@ msgid "" "platform's motion, it will always be first in the slide collisions." msgstr "" "沿ç€å‘é‡ç§»åŠ¨ç‰©ä½“ã€‚å¦‚æžœè¿™ä¸ªç‰©ä½“ä¸Žå¦ä¸€ä¸ªç‰©ä½“相撞,它将沿ç€å¦ä¸€ä¸ªç‰©ä½“滑动,而ä¸" -"是立å³åœæ¢ã€‚如果å¦ä¸€ä¸ªç‰©ä½“是[KinematicBody]或[RigidBody],它也会被å¦ä¸€ä¸ªç‰©ä½“" -"çš„è¿åŠ¨æ‰€å½±å“ã€‚ä½ å¯ä»¥ç”¨å®ƒæ¥åˆ¶ä½œç§»åŠ¨å’Œæ—‹è½¬çš„å¹³å°ï¼Œæˆ–者让节点推动其他节点。\n" +"是立å³åœæ¢ã€‚如果å¦ä¸€ä¸ªç‰©ä½“是 [KinematicBody] 或 [RigidBody],它也会被å¦ä¸€ä¸ªç‰©" +"体的è¿åŠ¨æ‰€å½±å“ã€‚ä½ å¯ä»¥ç”¨å®ƒæ¥åˆ¶ä½œç§»åŠ¨å’Œæ—‹è½¬çš„å¹³å°ï¼Œæˆ–者让节点推动其他节点。\n" "这个方法应该在 [method Node._physics_process] ä¸ä½¿ç”¨ï¼Œæˆ–者在被 [method Node." "_physics_process] 调用的方法ä¸ä½¿ç”¨ï¼Œå› ä¸ºå®ƒåœ¨è®¡ç®—æ—¶ï¼Œè‡ªåŠ¨ä½¿ç”¨ç‰©ç†æ¥éª¤çš„ " "[code]delta[/code] 值。å¦åˆ™ï¼Œæ¨¡æ‹Ÿå°†ä»¥ä¸æ£ç¡®çš„速度è¿è¡Œã€‚\n" @@ -40411,7 +40447,7 @@ msgid "" "value is always positive and only valid after calling [method " "move_and_slide] and when [method is_on_floor] returns [code]true[/code]." msgstr "" -"æ ¹æ®[code]up_direction[/code]返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿ç¢°æ’žè§’度,默认为" +"æ ¹æ® [code]up_direction[/code] 返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿ç¢°æ’žè§’度,默认为 " "[code]Vector2.UP[/code]。æ¤å€¼å§‹ç»ˆä¸ºæ£å€¼ï¼Œå¹¶ä¸”仅在调用 [method " "move_and_slide] åŽä¸”当 [method is_on_floor] 返回 [code]true[/code] 时有效。" @@ -40421,8 +40457,8 @@ msgid "" "latest collision that occurred during the last call to [method " "move_and_slide]." msgstr "" -"返回[KinematicCollision2D],它包å«åœ¨æœ€åŽä¸€æ¬¡è°ƒç”¨[method move_and_slide]æ—¶å‘生" -"的最新碰撞信æ¯ã€‚" +"返回 [KinematicCollision2D],它包å«åœ¨æœ€åŽä¸€æ¬¡è°ƒç”¨ [method move_and_slide] æ—¶" +"å‘生的最新碰撞信æ¯ã€‚" #: doc/classes/KinematicBody2D.xml msgid "" @@ -40570,9 +40606,9 @@ msgid "" "colliding object, the remaining motion, and the collision position. This " "information can be used to calculate a collision response." msgstr "" -"包å«[KinematicBody]碰撞的碰撞数æ®ã€‚当[KinematicBody]使用[method " -"KinematicBody.move_and_collide]移动时,如果它检测到与å¦ä¸€ä¸ªç‰©ä½“的碰撞就会åœ" -"æ¢ã€‚如果检测到碰撞,将返回一个KinematicCollision对象。\n" +"åŒ…å« [KinematicBody] 碰撞的碰撞数æ®ã€‚当 [KinematicBody] 使用 [method " +"KinematicBody.move_and_collide] 移动时,如果它检测到与å¦ä¸€ä¸ªç‰©ä½“的碰撞就会åœ" +"æ¢ã€‚如果检测到碰撞,将返回一个 KinematicCollision 对象。\n" "这个对象包å«å…³äºŽç¢°æ’žçš„ä¿¡æ¯ï¼ŒåŒ…括碰撞的物体ã€å‰©ä½™çš„è¿åŠ¨å’Œç¢°æ’žçš„ä½ç½®ã€‚这些信æ¯" "å¯ä»¥ç”¨æ¥è®¡ç®—碰撞å“应。" @@ -40581,8 +40617,8 @@ msgid "" "The collision angle according to [code]up_direction[/code], which is " "[code]Vector3.UP[/code] by default. This value is always positive." msgstr "" -"æ ¹æ®[code]up_direction[/code]的碰撞角度,默认为[code]Vector3.UP[/code]。这个" -"值总是为æ£ã€‚" +"æ ¹æ® [code]up_direction[/code] 的碰撞角度,默认为 [code]Vector3.UP[/code]。这" +"个值总是为æ£ã€‚" #: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml msgid "The colliding body." @@ -40819,19 +40855,19 @@ msgstr "通过展开行æ¥å¯¹é½æ•´ä¸ªæ–‡æœ¬ã€‚" #: doc/classes/Label.xml msgid "Default text [Color] of the [Label]." -msgstr "[Label]æ ‡ç¾çš„默认文本颜色[Color]。" +msgstr "[Label] æ ‡ç¾çš„默认文本颜色 [Color]。" #: doc/classes/Label.xml msgid "[Color] of the text's shadow effect." -msgstr "文本阴影效果的颜色[Color]。" +msgstr "文本阴影效果的颜色 [Color]。" #: doc/classes/Label.xml msgid "The tint of [Font]'s outline. See [member DynamicFont.outline_color]." -msgstr "[Font]轮廓的色调。å‚阅[member DynamicFont.outline_color]。" +msgstr "[Font] è½®å»“çš„è‰²è°ƒã€‚è§ [member DynamicFont.outline_color]。" #: doc/classes/Label.xml msgid "Vertical space between lines in multiline [Label]." -msgstr "多行[Label]ä¸å„行之间的垂直空间。" +msgstr "多行 [Label] ä¸å„行之间的垂直空间。" #: doc/classes/Label.xml msgid "" @@ -41169,7 +41205,7 @@ msgstr "如果为 [code]true[/code],ç¯å…‰åªåœ¨ç¼–辑器ä¸å‡ºçŽ°ï¼Œåœ¨è¿è¡Œ #: doc/classes/Light.xml msgid "The light's bake mode. See [enum BakeMode]." -msgstr "ç¯å…‰çš„烘焙模å¼ã€‚å‚阅[enum BakeMode]。" +msgstr "ç¯å…‰çš„烘焙模å¼ã€‚è§ [enum BakeMode]。" #: doc/classes/Light.xml msgid "" @@ -43605,11 +43641,14 @@ msgid "" "[method Mesh.surface_get_material] to get materials associated with the " "[Mesh] resource." msgstr "" +"返回该 [Mesh] 资æºä¸ŠæŸä¸ªè¡¨é¢çš„ [Material] 覆盖项。\n" +"[b]注æ„:[/b]这个函数åªä¼šè¿”回与这个 [MeshInstance] 相关è”çš„[i]覆盖[/i]æè´¨ã€‚" +"è¦èŽ·å–与该 [Mesh] 相关è”çš„æè´¨ï¼Œè¯·è€ƒè™‘使用 [method get_active_material] 或 " +"[method Mesh.surface_get_material]。" #: doc/classes/MeshInstance.xml -#, fuzzy msgid "Returns the number of surface override materials." -msgstr "è¿”å›žè¡¨é¢æè´¨çš„æ•°é‡ã€‚" +msgstr "è¿”å›žè¡¨é¢æè´¨è¦†ç›–é¡¹çš„æ•°é‡ã€‚" #: doc/classes/MeshInstance.xml msgid "" @@ -43664,6 +43703,8 @@ msgid "" "resource. This material is associated with this [MeshInstance] rather than " "with the [Mesh] resource." msgstr "" +"设置该 [Mesh] 资æºçš„æŒ‡å®šè¡¨é¢çš„ [Material] 覆盖项。这个æè´¨ä¼šä¸Žè¿™ä¸ª " +"[MeshInstance] å…³è”ï¼Œè€Œä¸æ˜¯ä¸Ž [Mesh] 资æºå…³è”。" #: doc/classes/MeshInstance.xml msgid "The [Mesh] resource for the instance." @@ -44658,7 +44699,6 @@ msgid "Mesh-based navigation and pathfinding node." msgstr "åŸºäºŽç½‘æ ¼çš„å¯¼èˆªå’Œå¯»è·¯èŠ‚ç‚¹ã€‚" #: doc/classes/Navigation.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " "deprecated and will be removed in a future version. Use [method " @@ -44669,6 +44709,8 @@ msgid "" "class also assists with aligning navigation agents with the meshes they are " "navigating on." msgstr "" +"[i]已弃用。[/i][Navigation] 节点和 [method get_simple_path] 已弃用,会在将æ¥" +"的版本ä¸ç§»é™¤ã€‚请用 [method NavigationServer.map_get_path] 替代。\n" "在 [NavigationMesh] 的集åˆä¸æä¾›å¯¼èˆªå’Œå¯»è·¯åŠŸèƒ½ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œè¿™äº›å°†è‡ªåŠ¨ä»Žå " "[NavigationMeshInstance] èŠ‚ç‚¹ä¸æ”¶é›†ã€‚除了基本的寻路之外,这个类还能帮助导航代" "ç†ä¸Žå…¶æ‰€å¯¼èˆªçš„ç½‘æ ¼å¯¹é½ã€‚" @@ -44716,7 +44758,6 @@ msgid "Returns the [RID] of the navigation map on the [NavigationServer]." msgstr "返回这个导航地图在 [NavigationServer] 上的 [RID]。" #: doc/classes/Navigation.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " "deprecated and will be removed in a future version. Use [method " @@ -44726,6 +44767,8 @@ msgid "" "agent properties associated with each [NavigationMesh] (radius, height, " "etc.) are considered in the path calculation, otherwise they are ignored." msgstr "" +"[i]已弃用。[/i][Navigation] 节点和 [method get_simple_path] 已弃用,会在将æ¥" +"的版本ä¸ç§»é™¤ã€‚请用 [method NavigationServer.map_get_path] 替代。\n" "è¿”å›žä¸¤ä¸ªç»™å®šç‚¹ä¹‹é—´çš„è·¯å¾„ã€‚ç‚¹éƒ½æ˜¯åœ¨å±€éƒ¨åæ ‡ç©ºé—´ä¸çš„。如果 [code]optimize[/" "code] 为 [code]true[/code](默认),则计算路径时会考虑æ¯ä¸ª [NavigationMesh] " "所关è”的代ç†çš„属性(åŠå¾„ã€é«˜åº¦ç‰ï¼‰ï¼Œå¦åˆ™ä¼šè¢«å¿½ç•¥ã€‚" @@ -44770,7 +44813,6 @@ msgid "2D navigation and pathfinding node." msgstr "2D 导航和寻路节点。" #: doc/classes/Navigation2D.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " "deprecated and will be removed in a future version. Use [method " @@ -44779,6 +44821,8 @@ msgid "" "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." msgstr "" +"[i]已弃用。[/i][Navigation2D] 节点和 [method get_simple_path] 已弃用,会在将" +"æ¥çš„版本ä¸ç§»é™¤ã€‚请用 [method Navigation2DServer.map_get_path] 替代。\n" "Navigation2D 在 2D 区域内æä¾›å¯¼èˆªå’Œå¯»è·¯ï¼Œè¯¥åŒºåŸŸä»¥ [NavigationPolygon] 资æºåˆ" "é›†çš„å½¢å¼æŒ‡å®šã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œè¿™äº›èµ„æºæ˜¯è‡ªåŠ¨ä»Žå项 [NavigationPolygonInstance] 节" "ç‚¹ä¸æ”¶é›†çš„。" @@ -44798,7 +44842,6 @@ msgstr "" "[NavigationPolygonInstance]。" #: doc/classes/Navigation2D.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " "deprecated and will be removed in a future version. Use [method " @@ -44807,6 +44850,8 @@ msgid "" "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." msgstr "" +"[i]已弃用。[/i][Navigation2D] 节点和 [method get_simple_path] 已弃用,会在将" +"æ¥çš„版本ä¸ç§»é™¤ã€‚请用 [method Navigation2DServer.map_get_path] 替代。\n" "è¿”å›žä¸¤ä¸ªç»™å®šç‚¹ä¹‹é—´çš„è·¯å¾„ã€‚ç‚¹æ˜¯åœ¨å±€éƒ¨åæ ‡ç©ºé—´ä¸çš„。如果 [code]optimize[/code] " "为 [code]true[/code](默认值),路径将尽å¯èƒ½åœ°åˆå¹¶è·¯å¾„段,从而平滑。" @@ -44973,6 +45018,8 @@ msgid "" "returns both 2D and 3D created navigation maps as there is technically no " "distinction between them." msgstr "" +"返回该 NavigationServer 上所有已创建的导航地图的 [RID]ã€‚ä¼šåŒæ—¶è¿”回已创建的 " +"2D å’Œ 3D å¯¼èˆªåœ°å›¾ï¼Œå› ä¸ºç†è®ºä¸Šå®ƒä»¬ä¹‹é—´æ˜¯æ²¡æœ‰åŒºåˆ«çš„。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." @@ -45006,6 +45053,21 @@ msgid "" "but it can also introduce bugs if used inappropriately without much " "foresight." msgstr "" +"这个函数会立å³å¼ºåˆ¶è¿›è¡ŒæŒ‡å®šå¯¼èˆªåœ°å›¾çš„åŒæ¥ï¼Œå‚æ•° [code]map[/code] 为 [RID] ç±»" +"型。默认情况下,导航地图仅会在æ¯ä¸ªç‰©ç†å¸§çš„æœ«å°¾è¿›è¡ŒåŒæ¥ã€‚这个函数å¯ç”¨äºŽç«‹å³" +"ï¼ˆé‡æ–°ï¼‰è®¡ç®—è¯¥å¯¼èˆªåœ°å›¾çš„æ‰€æœ‰å¯¼èˆªç½‘æ ¼å’Œåœ°åŒºè¿žæŽ¥ã€‚è¿™æ ·å°±èƒ½å¤Ÿåœ¨ä¿®æ”¹åœ°å›¾åŽï¼Œåœ¨åŒ" +"一帧ä¸ç«‹å³å¯¹å¯¼èˆªè·¯å¾„è¿›è¡ŒæŸ¥è¯¢ï¼ˆéœ€è¦æ—¶å¯ä»¥è¿›è¡Œå¤šæ¬¡åŒæ¥ï¼‰ã€‚\n" +"由于技术上的é™åˆ¶ï¼Œå½“å‰çš„ NavigationServer 命令队列会被清空。这æ„å‘³ç€æ‰€æœ‰å·²åœ¨" +"当å‰ç‰©ç†å¸§ä¸å…¥é˜Ÿçš„命令都会被执行,å³ä¾¿è¿™äº›å‘½ä»¤ä¸ŽæŒ‡å®šçš„åœ°å›¾æ— å…³ï¼Œé’ˆå¯¹çš„æ˜¯å…¶ä»–" +"地图ã€åœ°åŒºã€ä»£ç†ã€‚æ¶ˆè€—è¾ƒå¤§çš„å¯¼èˆªç½‘æ ¼ä»¥åŠåœ°åŒºè¿žæŽ¥çš„计算åªä¼šå¯¹æŒ‡å®šçš„地图进行。" +"其他地图会在该物ç†å¸§çš„æœ«å°¾è¿›è¡Œå¸¸è§„çš„åŒæ¥ã€‚如果指定的地图在进行强制更新åŽåˆæ”¶" +"到了修改,那么它也会在其他地图更新时å—到更新。\n" +"这个函数ä¸ä¼šè§¦åŠé¿éšœå¤„ç†ä»¥åŠ [code]safe_velocity[/code] ä¿¡å·çš„分å‘,这些还是" +"会在该物ç†å¸§çš„æœ«å°¾é’ˆå¯¹æ‰€æœ‰åœ°å›¾çš„代ç†è¿›è¡Œå¤„ç†ã€‚\n" +"[b]注æ„:[/b]èƒ½åŠ›è¶Šå¤§ï¼Œè´£ä»»è¶Šå¤§ã€‚åªæœ‰çœŸæ£æ˜Žç™½è‡ªå·±åœ¨å¹²ä»€ä¹ˆçš„用户æ‰åº”è¯¥åœ¨çœŸæ£æœ‰" +"éœ€è¦æ—¶ä½¿ç”¨è¿™ä¸ªå‡½æ•°ã€‚å¼ºåˆ¶è¿›è¡Œå¯¼èˆªåœ°å›¾çš„ç«‹å³æ›´æ–°éœ€è¦å¯¹ NavigationServer åŠ é”å¹¶" +"清空整个 NavigationServer çš„å‘½ä»¤é˜Ÿåˆ—ã€‚è¿™æ ·åšä¸ä»…ä¼šå¤§å¹…å½±å“æ¸¸æˆçš„æ€§èƒ½ï¼Œå¦‚果使" +"用ä¸å½“ã€ç¼ºä¹è¿œè§ï¼Œè¿˜å¯èƒ½å¼•å…¥ bug。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -45139,6 +45201,15 @@ msgid "" "(which should be avoided in general) the result might not be what is " "expected." msgstr "" +"å¦‚æžœç»™å‡ºçš„ä¸–ç•Œç©ºé—´åæ ‡ç‚¹ [code]point[/code] ç›®å‰ç”±ç»™å‡ºçš„导航地区 " +"[code]region[/code] 拥有,则返回 [code]true[/code]ã€‚è¿™é‡Œçš„â€œæ‹¥æœ‰â€æŒ‡çš„æ˜¯è¯¥åœ°åŒº" +"çš„å¯¼èˆªç½‘æ ¼å¤šè¾¹å½¢é¢ä¸åŒ…å«è¿™ä¸ªå¯èƒ½çš„ä½ç½®ï¼Œå¹¶ä¸”与给出的地区的导航地区上所有其他" +"å¯¼èˆªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸æ¯”ï¼Œå®ƒä¸Žè¿™ä¸ªç‚¹çš„è·ç¦»æ˜¯æœ€è¿‘的。\n" +"å¦‚æžœæœ‰å¤šä¸ªå¯¼èˆªç½‘æ ¼åŒ…å«è¿™ä¸ªç‚¹å¹¶ä¸”è·ç¦»ç›¸ç‰ï¼Œå“ªä¸ªå¯¼èˆªåœ°åŒºçš„多边形先被处ç†ï¼Œé‚£ä¸ª" +"å¯¼èˆªåœ°åŒºå°±èŽ·å–æ‰€æœ‰æƒã€‚多边形的处ç†é¡ºåºä¸Žå¯¼èˆªåœ°åŒºåœ¨ NavigationServer 上的注册" +"顺åºä¸€è‡´ã€‚\n" +"[b]注æ„:[/b]如果ä¸åŒå¯¼èˆªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼å˜åœ¨é‡å (通常应当é¿å…),å¯èƒ½å¾—到预料" +"之外的结果。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." @@ -45405,6 +45476,10 @@ msgid "" "it will constantly overshoot or undershoot the distance to the next point on " "each physics frame update." msgstr "" +"è·ç¦»é˜ˆå€¼ï¼Œç”¨äºŽç¡®å®šæ˜¯å¦å·²åˆ°è¾¾æŸä¸ªè·¯å¾„点。使用这个值,代ç†å°±ä¸å¿…精确地到达æŸä¸ª" +"路径点,到达æŸä¸ªåŒºåŸŸå†…å³å¯ã€‚如果这个值设得太大,该 NavigationAgent 将跳过路径" +"上的点,å¯èƒ½å¯¼è‡´å…¶ç¦»å¼€è¯¥å¯¼èˆªç½‘æ ¼ã€‚å¦‚æžœè¿™ä¸ªå€¼è®¾å¾—å¤ªå°ï¼Œè¯¥ NavigationAgent 将陷" +"入釿–°å¯»è·¯çš„æ»å¾ªçŽ¯ï¼Œå› ä¸ºå®ƒåœ¨æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†ä¸‹ä¸€ä¸ªç‚¹ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -45424,6 +45499,11 @@ msgid "" "bake [NavigationMesh] resources with a different [member NavigationMesh." "agent_radius] property and use different navigation maps for each actor size." msgstr "" +"该é¿éšœä»£ç†çš„åŠå¾„。这是该é¿éšœä»£ç†çš„“身体â€ï¼Œä¸æ˜¯é¿éšœæœºåˆ¶çš„èµ·å§‹åŠå¾„(由 [member " +"neighbor_dist] 控制)。\n" +"ä¸ä¼šå½±å“æ£å¸¸çš„寻路。è¦ä¿®æ”¹è§’色的寻路åŠå¾„,请在烘焙 [NavigationMesh] èµ„æºæ—¶ä½¿" +"用ä¸åŒçš„ [member NavigationMesh.agent_radius] 属性,针对ä¸åŒçš„角色大å°ä½¿ç”¨ä¸" +"åŒçš„导航地图。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -45434,6 +45514,9 @@ msgid "" "overshoot or undershoot the distance to the final target point on each " "physics frame update." msgstr "" +"è·ç¦»é˜ˆå€¼ï¼Œç”¨äºŽç¡®å®šæ˜¯å¦å·²åˆ°è¾¾æœ€ç»ˆçš„ç›®æ ‡ç‚¹ã€‚ä½¿ç”¨è¿™ä¸ªå€¼ï¼Œä»£ç†å°±ä¸å¿…精确地到达最" +"ç»ˆçš„ç›®æ ‡ï¼Œåˆ°è¾¾è¯¥åŒºåŸŸå†…å³å¯ã€‚如果这个值设得太å°ï¼Œè¯¥ NavigationAgent 将陷入釿–°" +"寻路的æ»å¾ªçŽ¯ï¼Œå› ä¸ºå®ƒåœ¨æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†æœ€ç»ˆçš„ç›®æ ‡ç‚¹ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -45555,6 +45638,9 @@ msgid "" "[member neighbor_dist]).\n" "Does not affect normal pathfinding." msgstr "" +"该é¿éšœä»£ç†çš„åŠå¾„。这是该é¿éšœä»£ç†çš„“身体â€ï¼Œä¸æ˜¯é¿éšœæœºåˆ¶çš„èµ·å§‹åŠå¾„(由 [member " +"neighbor_dist] 控制)。\n" +"ä¸ä¼šå½±å“æ£å¸¸çš„寻路。" #: doc/classes/NavigationMesh.xml msgid "A mesh to approximate the walkable areas and obstacles." @@ -45694,11 +45780,11 @@ msgstr "" msgid "" "If the baking [AABB] has a volume the navigation mesh baking will be " "restricted to its enclosing area." -msgstr "" +msgstr "如果烘焙 [AABB] å˜åœ¨ä½“ç§¯ï¼Œå¯¹è¯¥å¯¼èˆªç½‘æ ¼çš„çƒ˜ç„™ä¼šè¢«é™åˆ¶åœ¨å…¶å†…部区域ä¸ã€‚" #: doc/classes/NavigationMesh.xml msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." -msgstr "" +msgstr "应用于 [member filter_baking_aabb] [AABB] çš„ä½ç½®åç§»é‡ã€‚" #: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." @@ -45871,7 +45957,6 @@ msgid "Helper class for creating and clearing navigation meshes." msgstr "å¯¹å¯¼èˆªç½‘æ ¼è¿›è¡Œåˆ›å»ºå’Œæ¸…ç†çš„辅助类。" #: doc/classes/NavigationMeshGenerator.xml -#, fuzzy msgid "" "This class is responsible for creating and clearing 3D navigation meshes " "used as [NavigationMesh] resources inside [NavigationMeshInstance]. The " @@ -45931,7 +46016,11 @@ msgstr "" "è±¡ï¼Œé€šè¿‡åœ¨ç½‘æ ¼çš„åŒ…å›´åŒºåŸŸå‘¨è¾¹åˆ›å»ºä½“ç´ ä¸–ç•Œï¼Œæ¥æ£€æŸ¥åŽŸå§‹å‡ ä½•ä½“ä¸é€‚åˆ " "[NavigationMesh] 代ç†è¡Œèµ°çš„地形。\n" "ç„¶åŽå°±ä¼šè¿”å›žæœ€ç»ˆçš„å¯¼èˆªç½‘æ ¼ï¼Œä¿å˜åœ¨ [NavigationMesh] ä¸ï¼Œå³å¯äº¤ä»˜ " -"[NavigationMeshInstance] 使用。" +"[NavigationMeshInstance] 使用。\n" +"[b]注æ„:[/b]ä½¿ç”¨ç½‘æ ¼æ¥å®šä¹‰å¯è¡Œèµ°åŒºåŸŸå¹¶é®æŒ¡å¯¼èˆªçƒ˜ç„™å¹¶ä¸æ€»èƒ½æˆåŠŸã€‚çƒ˜ç„™å¯¼èˆªå¤„ç†" +"ç½‘æ ¼åŽŸå§‹å‡ ä½•ä½“æ—¶ï¼Œå¹¶æ²¡æœ‰å‡ ä½•ä½“â€œä½äºŽå†…部â€çš„æ¦‚念,这是有æ„è€Œä¸ºä¹‹çš„ã€‚æ ¹æ®å½“å‰çƒ˜" +"ç„™å‚æ•°çš„ä¸åŒï¼Œåªè¦é®æŒ¡ç½‘æ ¼è¶³å¤Ÿå¤§ï¼Œå¤§åˆ°èƒ½å¤Ÿå°†å¯¼èˆªç½‘æ ¼åŒºåŸŸåŒ…å«åœ¨å…¶å†…部,烘焙时" +"就会生æˆä¸€ä¸ªå¯¼èˆªç½‘æ ¼åŒºåŸŸï¼Œä½äºŽé®æŒ¡çš„åŽŸå§‹å‡ ä½•ä½“ç½‘æ ¼å†…éƒ¨ã€‚" #: doc/classes/NavigationMeshGenerator.xml msgid "" @@ -48495,7 +48584,6 @@ msgstr "" "称设置为唯一å称。" #: doc/classes/Node.xml -#, fuzzy msgid "" "Emitted when a child node enters the scene tree, either because it entered " "on its own or because this node entered with it.\n" @@ -48503,7 +48591,9 @@ msgid "" "NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" "在åèŠ‚ç‚¹è¿›å…¥åœºæ™¯æ ‘æ—¶è§¦å‘,å¯ä»¥æ˜¯å› 为该å节点自行进入,也å¯ä»¥æ˜¯å› 为本节点带ç€" -"该å节点一起进入。" +"该å节点一起进入。\n" +"这个信å·ä¼šåœ¨è¯¥å节点自身的 [constant NOTIFICATION_ENTER_TREE] å’Œ [signal " +"tree_entered] [i]之åŽ[/i]触å‘。" #: doc/classes/Node.xml msgid "" @@ -48514,14 +48604,19 @@ msgid "" "tree and valid. This signal is emitted [i]after[/i] the child node's own " "[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" +"在å节点å³å°†é€€å‡ºåœºæ™¯æ ‘时触å‘,å¯ä»¥æ˜¯å› 为该å节点自行退出,也å¯ä»¥æ˜¯å› 为本节点" +"带ç€è¯¥å节点一起退出。\n" +"æ”¶åˆ°è¿™ä¸ªä¿¡å·æ—¶ï¼Œè¯¥å节 [code]node[/code] ä»åœ¨æ ‘ä¸å¹¶ä¸”有效。这个信å·ä¼šåœ¨è¯¥å节" +"点自身的 [signal tree_exiting] å’Œ [constant NOTIFICATION_EXIT_TREE] [i]之åŽ[/" +"i]触å‘。" #: doc/classes/Node.xml msgid "Emitted when the node is ready." -msgstr "当节点准备好时触å‘。" +msgstr "当该节点准备好时触å‘。" #: doc/classes/Node.xml msgid "Emitted when the node is renamed." -msgstr "在é‡å‘½å节点时触å‘。" +msgstr "当该节点被é‡å‘½å时触å‘。" #: doc/classes/Node.xml msgid "" @@ -48529,34 +48624,39 @@ msgid "" "This signal is emitted [i]after[/i] the related [constant " "NOTIFICATION_ENTER_TREE] notification." msgstr "" +"å½“è¯¥èŠ‚ç‚¹è¿›å…¥æ ‘æ—¶è§¦å‘。\n" +"这个信å·ä¼šåœ¨ç›¸å…³çš„ [constant NOTIFICATION_ENTER_TREE] 通知[i]之åŽ[/i]触å‘。" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." -msgstr "åœ¨èŠ‚ç‚¹é€€å‡ºæ ‘ä¹‹åŽè§¦å‘,并且ä¸å†å¤„于活动状æ€ã€‚" +msgstr "å½“è¯¥èŠ‚ç‚¹é€€å‡ºæ ‘ä¹‹åŽè§¦å‘,并且ä¸å†å¤„于活动状æ€ã€‚" #: doc/classes/Node.xml -#, fuzzy msgid "" "Emitted when the node is still active but about to exit the tree. This is " "the right place for de-initialization (or a \"destructor\", if you will).\n" "This signal is emitted [i]before[/i] the related [constant " "NOTIFICATION_EXIT_TREE] notification." msgstr "" -"当节点ä»å¤„于活动状æ€ä½†å³å°†é€€å‡ºæ ‘æ—¶å‘出。这是ååˆå§‹åŒ–çš„æ£ç¡®ä½ç½®ï¼ˆå¦‚果愿æ„,也" -"å¯ä»¥ç§°ä¹‹ä¸ºâ€œæžæž„函数â€ï¼‰ã€‚" +"当该节点ä»å¤„于活动状æ€ä½†å³å°†é€€å‡ºæ ‘æ—¶å‘出。这是ååˆå§‹åŒ–çš„æ£ç¡®ä½ç½®ï¼ˆå¦‚果愿æ„," +"也å¯ä»¥ç§°ä¹‹ä¸ºâ€œæžæž„函数â€ï¼‰ã€‚\n" +"这个信å·ä¼šåœ¨ç›¸å…³çš„ [constant NOTIFICATION_EXIT_TREE] 通知[i]之å‰[/i]触å‘。" #: doc/classes/Node.xml msgid "" "Notification received when the node enters a [SceneTree].\n" "This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" +"当该节点进入 [SceneTree] 时收到的通知。\n" +"这个通知会在相关的 [signal tree_entered] [i]之å‰[/i]å‘出。" #: doc/classes/Node.xml -#, fuzzy msgid "" "Notification received when the node is about to exit a [SceneTree].\n" "This notification is emitted [i]after[/i] the related [signal tree_exiting]." -msgstr "当该节点å³å°†é€€å‡º [SceneTree] 时收到的通知。" +msgstr "" +"当该节点å³å°†é€€å‡º [SceneTree] 时收到的通知。\n" +"这个通知会在相关的 [signal tree_exiting] [i]之åŽ[/i]å‘出。" #: doc/classes/Node.xml msgid "Notification received when the node is moved in the parent." @@ -50236,7 +50336,7 @@ msgid "" "code] with fixed y-coordinate value 0.0." msgstr "" "返回给定 x åæ ‡å¤„çš„ 1D 噪声值 [code][-1,1][/code]。\n" -"[b]注æ„:[/b]这个方法实际上返回的是固定 Y åæ ‡å€¼ä¸º 0.0 的二维噪声值 [code]" +"[b]注æ„:[/b]这个方法实际上返回的是固定 Y åæ ‡å€¼ä¸º 0.0 çš„ 2D 噪声值 [code]" "[-1,1][/code]。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml @@ -50802,7 +50902,6 @@ msgstr "" "径。" #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns the command-line arguments passed to the engine.\n" "Command-line arguments can be written in any form, including both [code]--" @@ -50842,6 +50941,10 @@ msgstr "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # å°†ä¸å¸¦å‚æ•°çš„é€‰é¡¹åŠ å…¥è¯¥å—典,\n" +" # å–值为空å—符串。\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" #: doc/classes/OS.xml @@ -54032,11 +54135,11 @@ msgid "" "[b]Note:[/b] Many of these monitors are not updated in real-time, so there " "may be a short delay between changes." msgstr "" -"这个类æä¾›äº†å¯¹ä¸€äº›ä¸Žæ€§èƒ½æœ‰å…³çš„ä¸åŒç›‘控的访问,比如内å˜ä½¿ç”¨é‡ã€ç»˜åˆ¶è°ƒç”¨å’ŒFPS。" -"这些与编辑器的[b]Monitor[/b]æ ‡ç¾ä¸çš„[b]Debugger[/b]颿¿æ‰€æ˜¾ç¤ºçš„æ•°å€¼ç›¸åŒã€‚通过" -"使用这个类的[method get_monitor]方法,å¯ä»¥ä»Žä½ 的代ç ä¸è®¿é—®è¿™äº›æ•°æ®ã€‚\n" +"这个类æä¾›äº†å¯¹ä¸€äº›ä¸Žæ€§èƒ½æœ‰å…³çš„ä¸åŒç›‘控的访问,比如内å˜ä½¿ç”¨é‡ã€ç»˜åˆ¶è°ƒç”¨å’Œ " +"FPS。这些与编辑器[b]调试器[/b]颿¿çš„[b]监视[/b]æ ‡ç¾ä¸çš„æ‰€æ˜¾ç¤ºçš„æ•°å€¼ç›¸åŒã€‚通过" +"使用这个类的 [method get_monitor] 方法,å¯ä»¥ä»Žä½ 的代ç ä¸è®¿é—®è¿™äº›æ•°æ®ã€‚\n" "[b]注æ„:[/b]è¿™äº›ç›‘è§†å™¨ä¸æœ‰å‡ 个åªåœ¨è°ƒè¯•模å¼ä¸‹å¯ç”¨ï¼Œå½“在å‘布版构建ä¸ä½¿ç”¨æ—¶ï¼Œå°†" -"总是返回0。\n" +"总是返回 0。\n" "[b]注æ„:[/b]这些监控器ä¸çš„è®¸å¤šä¸æ˜¯å®žæ—¶æ›´æ–°çš„,所以在å˜åŒ–之间å¯èƒ½ä¼šæœ‰çŸæš‚的延" "迟。" @@ -54114,7 +54217,7 @@ msgstr "å¤å„¿èŠ‚ç‚¹çš„æ•°é‡ï¼Œå¤å„¿èŠ‚ç‚¹å³æ— æ³•è¢«æŒ‰çˆ¶çº§è¿½æº¯åˆ°æ ¹èŠ‚ #: doc/classes/Performance.xml msgid "3D objects drawn per frame." -msgstr "æ¯å¸§ç»˜åˆ¶3D对象的数é‡ã€‚" +msgstr "æ¯å¸§ç»˜åˆ¶ 3D 对象的数é‡ã€‚" #: doc/classes/Performance.xml msgid "Vertices drawn per frame. 3D only." @@ -54270,30 +54373,30 @@ msgstr "å¯¹ç‰©ä½“æ–½åŠ æ—‹è½¬å†²é‡ã€‚" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the collider's [RID]." -msgstr "返回碰撞体的[RID]。" +msgstr "返回该碰撞体的 [RID]。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the collider's object id." -msgstr "返回碰撞体的对象 id。" +msgstr "返回该碰撞体的对象 id。" #: doc/classes/Physics2DDirectBodyState.xml msgid "" "Returns the collider object. This depends on how it was created (will return " "a scene node if such was used to create it)." msgstr "" -"返回碰撞体对象。这å–决于它是如何创建的(如果是被作为场景节点创建的,那么将返" -"回场景节点)。" +"返回该碰撞体对象。这å–决于它是如何创建的(如果是被作为场景节点创建的,那么将" +"返回场景节点)。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the contact position in the collider." -msgstr "返回碰撞体ä¸çš„æŽ¥è§¦ä½ç½®ã€‚" +msgstr "返回该碰撞体ä¸çš„æŽ¥è§¦ä½ç½®ã€‚" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the collider's shape index." -msgstr "返回碰撞体的形状索引。" +msgstr "返回该碰撞体的形状索引。" #: doc/classes/Physics2DDirectBodyState.xml msgid "" @@ -54301,13 +54404,13 @@ msgid "" "[method Object.get_meta], and is set with [method Physics2DServer." "shape_set_data]." msgstr "" -"返回碰撞形状的元数æ®ã€‚这个元数æ®ä¸åŒäºŽ [method Object.get_meta],是用 " +"返回该碰撞形状的元数æ®ã€‚这个元数æ®ä¸åŒäºŽ [method Object.get_meta],是用 " "[method Physics2DServer.shape_set_data] 设置的。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the linear velocity vector at the collider's contact point." -msgstr "返回碰撞体接触点处的线速度å‘é‡ã€‚" +msgstr "返回该碰撞体接触点处的线速度å‘é‡ã€‚" #: doc/classes/Physics2DDirectBodyState.xml msgid "" @@ -54315,8 +54418,8 @@ msgid "" "[b]Note:[/b] By default, this returns 0 unless bodies are configured to " "monitor contacts. See [member RigidBody2D.contact_monitor]." msgstr "" -"返回æ¤ç‰©ä½“与其他物体的接触次数。\n" -"[b]注æ„:[/b]默认情况下,除éžç‰©ä½“被设为监视接触者,å¦åˆ™è¿”回0。å‚阅 [member " +"返回这个物体与其他物体的接触次数。\n" +"[b]注æ„:[/b]默认情况下,除éžç‰©ä½“被设为监视接触者,å¦åˆ™è¿”回 0ã€‚è§ [member " "RigidBody2D.contact_monitor]。" #: doc/classes/Physics2DDirectBodyState.xml @@ -54616,7 +54719,7 @@ msgstr "" "通过 [Physics2DShapeQueryParameters] 对象检查给出的形状与空间的交点。返回的相" "交形状是一个å—典数组,包å«ä»¥ä¸‹å—段:\n" "[code]collider[/code]:碰撞的对象。\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" "[code]metadata[/code]:相交形状的元数æ®ã€‚这个元数æ®ä¸Ž [method Object." "get_meta] ä¸åŒï¼Œæ˜¯ç”¨ [method Physics2DServer.shape_set_data] 设置的。\n" "[code]rid[/code]:相交对象的 [RID]。\n" @@ -54725,13 +54828,13 @@ msgid "" "5: The shape index of the area where the object entered/exited." msgstr "" "设置当任何主体/区域进入或退出该区域时调用的函数。这个回调函数将被任何与区域交" -"互的对象调用,并接å—5ä¸ªå‚æ•°:\n" -"1: [constant AREA_BODY_ADDED]或[constant AREA_BODY_REMOVED],å–决于对象是å¦è¿›" -"入或退出该区域。\n" -"2:进入/退出该区域对象的[RID]。\n" -"3:进入/退出该区域对象的实例ID。\n" -"4:进入/离开该区域的物体的形状指数。\n" -"5:物体进入/离开区域的形状指数。" +"äº’çš„å¯¹è±¡è°ƒç”¨ï¼Œå¹¶æŽ¥å— 5 ä¸ªå‚æ•°ï¼š\n" +"1:[constant AREA_BODY_ADDED] 或 [constant AREA_BODY_REMOVED],å–决于对象是å¦" +"进入或退出该区域。\n" +"2:进入/退出该区域对象的 [RID]。\n" +"3:进入/退出该区域对象的实例 ID。\n" +"4:进入/离开该区域的物体的形状指数。\n" +"5:物体进入/离开区域的形状指数。" #: doc/classes/Physics2DServer.xml msgid "" @@ -54847,7 +54950,7 @@ msgstr "è¿”å›žç‰©ä½“å‚æ•°çš„值。请å‚阅 [enum BodyParameter] 获å–å¯ç”¨å #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the [RID] of the nth shape of a body." -msgstr "返回 body 的第 n 个碰撞形状的 [RID]。" +msgstr "返回物体的第 n 个碰撞形状的 [RID]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the number of shapes assigned to a body." @@ -54874,7 +54977,7 @@ msgid "" "Returns whether a body uses a callback function to calculate its own physics " "(see [method body_set_force_integration_callback])." msgstr "" -"返回一个 body 是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†å€¼ï¼ˆè§ [method " +"返回一个物体是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†å€¼ï¼ˆè§ [method " "body_set_force_integration_callback])。" #: doc/classes/Physics2DServer.xml @@ -55059,7 +55162,7 @@ msgstr "è¿”å›žä¸€ä¸ªå…³èŠ‚çš„ç±»åž‹ï¼ˆè§ [enum JointType])。" msgid "" "Sets a joint parameter. See [enum JointParam] for a list of available " "parameters." -msgstr "è®¾ç½®å…³èŠ‚å‚æ•°ã€‚有关å¯ç”¨å‚数的列表,请å‚阅[enum JointParam]。" +msgstr "è®¾ç½®å…³èŠ‚å‚æ•°ã€‚有关å¯ç”¨å‚数的列表,请å‚阅 [enum JointParam]。" #: doc/classes/Physics2DServer.xml msgid "" @@ -55188,8 +55291,8 @@ msgid "" "violating a constraint, to avoid leaving them in that state because of " "numerical imprecision." msgstr "" -"常é‡ï¼Œç”¨äºŽè®¾ç½®/èŽ·å–æ‰€æœ‰ç‰©ç†çº¦æŸçš„默认求解器å置。解算器å差是一个控制两个物体" -"在è¿å约æŸåŽ \"åå¼¹ \"ç¨‹åº¦çš„å› ç´ ï¼Œä»¥é¿å…由于数值ä¸ç²¾ç¡®è€Œä½¿å®ƒä»¬å¤„于这ç§çжæ€ã€‚" +"常é‡ï¼Œç”¨äºŽè®¾ç½®/èŽ·å–æ‰€æœ‰ç‰©ç†çº¦æŸçš„默认求解器å置。解算器å置是一个控制两个物体" +"在è¿å约æŸåŽâ€œåå¼¹â€ç¨‹åº¦çš„å› ç´ ï¼Œä»¥é¿å…由于数值ä¸ç²¾ç¡®è€Œä½¿å®ƒä»¬å¤„于这ç§çжæ€ã€‚" #: doc/classes/Physics2DServer.xml msgid "" @@ -55241,8 +55344,8 @@ msgid "" "supplied form is a convex polygon." msgstr "" "这是用于创建凸多边形的常é‡ã€‚一个多边形是由一个点的列表定义的。它å¯ä»¥ç”¨äºŽäº¤ç‚¹" -"和内/外侧检查。与[member CollisionPolygon2D.polygon]属性ä¸åŒï¼Œç”¨[method " -"shape_set_data]修改的多边形并ä¸éªŒè¯æ‰€æä¾›çš„ç‚¹çš„å½¢å¼æ˜¯ä¸€ä¸ªå‡¸å½¢å¤šè¾¹å½¢ã€‚" +"和内/外侧检查。与 [member CollisionPolygon2D.polygon] 属性ä¸åŒï¼Œç”¨ [method " +"shape_set_data] 修改的多边形并ä¸éªŒè¯æ‰€æä¾›çš„ç‚¹çš„å½¢å¼æ˜¯ä¸€ä¸ªå‡¸å½¢å¤šè¾¹å½¢ã€‚" #: doc/classes/Physics2DServer.xml msgid "" @@ -55344,15 +55447,15 @@ msgstr "" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Constant for static bodies." -msgstr "StaticBody 的常é‡ã€‚" +msgstr "陿€ç‰©ä½“的常é‡ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Constant for kinematic bodies." -msgstr "KinematicBody 的常é‡ã€‚" +msgstr "è¿åЍå¦ç‰©ä½“的常é‡ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Constant for rigid bodies." -msgstr "RigidBody 的常é‡ã€‚" +msgstr "刚体的常é‡ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" @@ -55444,8 +55547,8 @@ msgid "" "undamped spring, while 1 causes the system to reach equilibrium as fast as " "possible (critical damping)." msgstr "" -"设置弹簧接头的阻尼比率。值为0è¡¨ç¤ºæ— é˜»å°¼å¼¹ç°§ï¼Œè€Œ1导致系统尽å¯èƒ½å¿«åœ°è¾¾åˆ°å¹³è¡¡" -"(临界阻尼)。" +"设置弹簧接头的阻尼比率。值为 0 è¡¨ç¤ºæ— é˜»å°¼å¼¹ç°§ï¼Œè€Œ 1 导致系统尽å¯èƒ½å¿«åœ°è¾¾åˆ°å¹³" +"衡(临界阻尼)。" #: doc/classes/Physics2DServer.xml msgid "" @@ -55459,13 +55562,13 @@ msgstr "" msgid "" "Enables continuous collision detection by raycasting. It is faster than " "shapecasting, but less precise." -msgstr "通过射线投射实现连ç»çš„碰撞检测。它比 shapecasting 更快,但ä¸å¤Ÿç²¾ç¡®ã€‚" +msgstr "通过射线投射实现连ç»çš„碰撞检测。它比形状投射更快,但ä¸å¤Ÿç²¾ç¡®ã€‚" #: doc/classes/Physics2DServer.xml msgid "" "Enables continuous collision detection by shapecasting. It is the slowest " "CCD method, and the most precise." -msgstr "通过形å˜å®žçŽ°è¿žç»çš„碰撞检测。它是最慢的CCD方法,也是最精确的。" +msgstr "通过形å˜å®žçŽ°è¿žç»çš„碰撞检测。它是最慢的 CCD 方法,也是最精确的。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" @@ -55665,7 +55768,7 @@ msgid "" "monitor contacts. See [member RigidBody.contact_monitor]." msgstr "" "返回æ¤ç‰©ä½“与其他物体的接触次数。\n" -"[b]注æ„:[/b]默认情况下,除éžç‰©ä½“被设为监视接触者,å¦åˆ™è¿”回0。å‚阅 [member " +"[b]注æ„:[/b]默认情况下,除éžç‰©ä½“被设为监视接触者,å¦åˆ™è¿”回 0ã€‚è§ [member " "RigidBody2D.contact_monitor]。" #: doc/classes/PhysicsDirectBodyState.xml @@ -55745,15 +55848,15 @@ msgid "" "If the shape did not intersect anything, then an empty dictionary is " "returned instead." msgstr "" -"检查通过[PhysicsShapeQueryParameters]对象给出的形状与空间的交点。如果它与一个" -"以上的形状å‘生碰撞,则选择最近的。返回的对象是包å«ä»¥ä¸‹å—段的å—å…¸:\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" -"[code]linear_velocity[/code]:碰撞对象的速度[Vector3]。如果对象是一个[Area]," -"结果是[code](0, 0, 0)[/code]。\n" -"[code]normal[/code]:ç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" -"[code]点[/code]:相交点。\n" -"[code]rid[/code]:相交物体的[RID]。\n" -"[code]shape[/code]:碰撞形状的形状索引。\n" +"检查通过 [PhysicsShapeQueryParameters] 对象给出的形状与空间的交点。如果它与一" +"个以上的形状å‘生碰撞,则选择最近的。返回的对象是包å«ä»¥ä¸‹å—段的å—典:\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" +"[code]linear_velocity[/code]:碰撞对象的速度 [Vector3]。如果对象是一个 " +"[Area],结果是 [code](0, 0, 0)[/code]。\n" +"[code]normal[/code]ï¼šç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" +"[code]point[/code]:相交点。\n" +"[code]rid[/code]:相交物体的 [RID]。\n" +"[code]shape[/code]:碰撞形状的形状索引。\n" "如果该形状没有与任何物体相交,那么将返回空的å—典。" #: doc/classes/PhysicsDirectSpaceState.xml @@ -55802,17 +55905,17 @@ msgid "" "determine if the ray should collide with [PhysicsBody]s or [Area]s, " "respectively." msgstr "" -"在给定的空间ä¸ä¸Žä¸€æ¡å°„çº¿ç›¸äº¤ã€‚è¿”å›žçš„å¯¹è±¡æ˜¯å…·æœ‰ä¸‹åˆ—å—æ®µçš„å—å…¸:\n" -"[code]collider[/code]:碰撞的对象。\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" -"[code]normal[/code]:ç‰©ä½“åœ¨ç›¸äº¤ç‚¹çš„è¡¨é¢æ³•线。\n" -"[code]position[/code]:交å‰ç‚¹ã€‚\n" -"[code]rid[/code]:相交物体的[RID]。\n" -"[code]形状[/code]:碰撞形状的形状索引。\n" +"在给定的空间ä¸ä¸Žä¸€æ¡å°„çº¿ç›¸äº¤ã€‚è¿”å›žçš„å¯¹è±¡æ˜¯å…·æœ‰ä¸‹åˆ—å—æ®µçš„å—典:\n" +"[code]collider[/code]:碰撞的对象。\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" +"[code]normal[/code]ï¼šç‰©ä½“åœ¨ç›¸äº¤ç‚¹çš„è¡¨é¢æ³•线。\n" +"[code]position[/code]:交å‰ç‚¹ã€‚\n" +"[code]rid[/code]:相交物体的 [RID]。\n" +"[code]shape[/code]:碰撞形状的形状索引。\n" "如果射线没有与任何物体相交,那么将返回空的å—典。\n" -"æ¤å¤–,该方法å¯ä»¥æŽ¥å—一个[code]exclude[/code]对象或[RID]数组,该数组将被排除在" -"碰撞之外,[code]collision_mask[/code]使ީç è¡¨ç¤ºè¦æ£€æŸ¥çš„物ç†å±‚,或者布尔值æ¥ç¡®" -"定射线是å¦åº”该分别与[PhysicsBody]或[Area]å‘生碰撞。" +"æ¤å¤–,该方法å¯ä»¥æŽ¥å—一个 [code]exclude[/code] 对象或 [RID] 数组,该数组将被排" +"除在碰撞之外,[code]collision_mask[/code] 使ީç è¡¨ç¤ºè¦æ£€æŸ¥çš„物ç†å±‚,或者布尔" +"值æ¥ç¡®å®šå°„线是å¦åº”该分别与 [PhysicsBody] 或 [Area] å‘生碰撞。" #: doc/classes/PhysicsDirectSpaceState.xml msgid "" @@ -55827,13 +55930,13 @@ msgid "" "The number of intersections can be limited with the [code]max_results[/code] " "parameter, to reduce the processing time." msgstr "" -"通过[PhysicsShapeQueryParameters]对象给出的形状与空间检查交点。相交的形状会以" -"数组的形å¼è¿”å›žï¼Œè¯¥æ•°ç»„åŒ…å«æœ‰ä»¥ä¸‹å—段的å—å…¸:\n" -"[code]collider[/code]:碰撞的对象。\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" -"[code]rid[/code]:相交物体的[RID]。\n" -"[code]shape[/code]:碰撞形状的形状索引。\n" -"å¯ä»¥ç”¨[code]max_results[/code]傿•°é™åˆ¶ç›¸äº¤çš„æ•°é‡ï¼Œä»¥å‡å°‘å¤„ç†æ—¶é—´ã€‚" +"通过 [PhysicsShapeQueryParameters] 对象给出的形状与空间检查交点。相交的形状会" +"以数组的形å¼è¿”å›žï¼Œè¯¥æ•°ç»„åŒ…å«æœ‰ä»¥ä¸‹å—段的å—典:\n" +"[code]collider[/code]:碰撞的对象。\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" +"[code]rid[/code]:相交物体的 [RID]。\n" +"[code]shape[/code]:碰撞形状的形状索引。\n" +"å¯ä»¥ç”¨ [code]max_results[/code] 傿•°é™åˆ¶ç›¸äº¤çš„æ•°é‡ï¼Œä»¥å‡å°‘å¤„ç†æ—¶é—´ã€‚" #: doc/classes/PhysicsMaterial.xml msgid "A material for physics properties." @@ -55842,7 +55945,7 @@ msgstr "具有物ç†å±žæ€§çš„æè´¨ã€‚" #: doc/classes/PhysicsMaterial.xml msgid "" "Provides a means of modifying the collision properties of a [PhysicsBody]." -msgstr "æä¾›äº†ä¸€ç§ä¿®æ”¹[PhysicsBody]的碰撞属性的方法。" +msgstr "æä¾›äº†ä¸€ç§ä¿®æ”¹ [PhysicsBody] 的碰撞属性的方法。" #: doc/classes/PhysicsMaterial.xml msgid "" @@ -55856,14 +55959,16 @@ msgid "" "The body's bounciness. Values range from [code]0[/code] (no bounce) to " "[code]1[/code] (full bounciness)." msgstr "" -"实体的弹性。值的范围从[code]0[/code]ï¼ˆæ— å弹)到[code]1[/code](完全å弹)。" +"实体的弹性。值的范围从 [code]0[/code]ï¼ˆæ— å弹)到 [code]1[/code](完全å" +"弹)。" #: doc/classes/PhysicsMaterial.xml msgid "" "The body's friction. Values range from [code]0[/code] (frictionless) to " "[code]1[/code] (maximum friction)." msgstr "" -"物体的摩擦。å–值范围从[code]0[/code]ï¼ˆæ— æ‘©æ“¦ï¼‰åˆ°[code]1[/code](最大摩擦)。" +"物体的摩擦。å–值范围从 [code]0[/code]ï¼ˆæ— æ‘©æ“¦ï¼‰åˆ° [code]1[/code](最大摩" +"擦)。" #: doc/classes/PhysicsMaterial.xml msgid "" @@ -55891,7 +55996,7 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "Creates an [Area]." -msgstr "创建一个[Area]区域。" +msgstr "创建一个 [Area] 区域。" #: doc/classes/PhysicsServer.xml msgid "" @@ -55936,7 +56041,7 @@ msgid "" "BodyMode] constants, for the type of body created. Additionally, the body " "can be created in sleeping state to save processing time." msgstr "" -"创建物ç†ä½“ã€‚å¯¹äºŽåˆ›å»ºçš„ç‰©ä½“ç±»åž‹ï¼Œç¬¬ä¸€ä¸ªå‚æ•°å¯ä»¥æ˜¯[enum BodyMode]常é‡ä¸çš„任何" +"创建物ç†ä½“ã€‚å¯¹äºŽåˆ›å»ºçš„ç‰©ä½“ç±»åž‹ï¼Œç¬¬ä¸€ä¸ªå‚æ•°å¯ä»¥æ˜¯ [enum BodyMode] 常é‡ä¸çš„任何" "值。æ¤å¤–,物体å¯ä»¥åœ¨ä¼‘çœ çŠ¶æ€ä¸‹åˆ›å»ºï¼Œä»¥èŠ‚çœå¤„ç†æ—¶é—´ã€‚" #: doc/classes/PhysicsServer.xml @@ -55951,7 +56056,7 @@ msgstr "" msgid "" "Returns the value of a body parameter. A list of available parameters is on " "the [enum BodyParameter] constants." -msgstr "è¿”å›žç‰©ä½“å‚æ•°çš„值。å¯ç”¨å‚数列表ä½äºŽ[enum BodyParameter]常é‡ä¸Šã€‚" +msgstr "è¿”å›žç‰©ä½“å‚æ•°çš„值。å¯ç”¨å‚数列表ä½äºŽ [enum BodyParameter] 常é‡ä¸Šã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55982,7 +56087,7 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "Sets the body mode, from one of the [enum BodyMode] constants." -msgstr "从[enum BodyMode]常é‡ä¹‹ä¸€è®¾ç½®ä¸»ä½“模å¼ã€‚" +msgstr "从 [enum BodyMode] 常é‡ä¹‹ä¸€è®¾ç½®ä¸»ä½“模å¼ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55992,7 +56097,7 @@ msgstr "è®¾ç½®ç‰©ä½“å‚æ•°ã€‚å¯ç”¨å‚数列表ä½äºŽ [enum BodyParameter] å¸¸é‡ #: doc/classes/PhysicsServer.xml msgid "Sets the body pickable with rays if [code]enabled[/code] is set." -msgstr "如果设置了[code]enabled[/code],则设置å¯ä½¿ç”¨å…‰çº¿æ‹¾å–的物体。" +msgstr "如果设置了 [code]enabled[/code],则设置å¯ä½¿ç”¨å…‰çº¿æ‹¾å–的物体。" #: doc/classes/PhysicsServer.xml msgid "Sets a body state (see [enum BodyState] constants)." @@ -56108,12 +56213,12 @@ msgstr "设置关节的优先级值。" #: doc/classes/PhysicsServer.xml msgid "" "Returns position of the joint in the local space of body a of the joint." -msgstr "返回关节在关节物体A的局部空间ä¸çš„ä½ç½®ã€‚" +msgstr "返回关节在关节物体 A 的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "" "Returns position of the joint in the local space of body b of the joint." -msgstr "返回关节在关节物体B的局部空间ä¸çš„ä½ç½®ã€‚" +msgstr "返回关节在关节物体 B 的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "Gets a pin_joint parameter (see [enum PinJointParam] constants)." @@ -56121,11 +56226,11 @@ msgstr "èŽ·å– pin_joint 傿•°ï¼ˆè§ [enum PinJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets position of the joint in the local space of body a of the joint." -msgstr "设置关节在关节物体A的局部空间ä¸çš„ä½ç½®ã€‚" +msgstr "设置关节在关节物体 A 的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets position of the joint in the local space of body b of the joint." -msgstr "设置关节在关节物体B的局部空间ä¸çš„ä½ç½®ã€‚" +msgstr "设置关节在关节物体 B 的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets a pin_joint parameter (see [enum PinJointParam] constants)." @@ -56133,7 +56238,7 @@ msgstr "设置 pin_joint 傿•°ï¼ˆè§ [enum PinJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Activates or deactivates the 3D physics engine." -msgstr "激活或åœç”¨3D物ç†å¼•擎。" +msgstr "激活或åœç”¨ 3D 物ç†å¼•擎。" #: doc/classes/PhysicsServer.xml msgid "" @@ -56155,8 +56260,8 @@ msgid "" "body or an area. To do so, you must use [method area_set_shape] or [method " "body_set_shape]." msgstr "" -"创建一个[enum ShapeType]ç±»åž‹çš„å½¢çŠ¶ã€‚ä¸æŠŠå®ƒåˆ†é…给一个体或一个区域。è¦åšåˆ°è¿™ä¸€" -"ç‚¹ï¼Œä½ å¿…é¡»ä½¿ç”¨[method area_set_shape]或[method body_set_shape]。" +"创建一个 [enum ShapeType] ç±»åž‹çš„å½¢çŠ¶ã€‚ä¸æŠŠå®ƒåˆ†é…给一个体或一个区域。è¦åšåˆ°è¿™" +"ä¸€ç‚¹ï¼Œä½ å¿…é¡»ä½¿ç”¨ [method area_set_shape] 或 [method body_set_shape]。" #: doc/classes/PhysicsServer.xml msgid "Returns the type of shape (see [enum ShapeType] constants)." @@ -56177,7 +56282,7 @@ msgstr "" msgid "" "Sets the value for a space parameter. A list of available parameters is on " "the [enum SpaceParameter] constants." -msgstr "è®¾ç½®ç©ºé—´å‚æ•°çš„值。å¯ç”¨å‚数列表ä½äºŽ[enum SpaceParameter]常é‡ä¸Šã€‚" +msgstr "è®¾ç½®ç©ºé—´å‚æ•°çš„值。å¯ç”¨å‚数列表ä½äºŽ [enum SpaceParameter] 常é‡ä¸Šã€‚" #: doc/classes/PhysicsServer.xml msgid "The [Joint] is a [PinJoint]." @@ -56221,7 +56326,7 @@ msgstr "" msgid "" "If above 0, this value is the maximum value for an impulse that this Joint " "puts on its ends." -msgstr "如果大于0ï¼Œè¿™ä¸ªå€¼å°±æ˜¯è¿™ä¸ªå…³èŠ‚å¯¹å…¶ä¸¤ç«¯æ–½åŠ çš„å†²é‡çš„æœ€å¤§å€¼ã€‚" +msgstr "如果大于 0ï¼Œè¿™ä¸ªå€¼å°±æ˜¯è¿™ä¸ªå…³èŠ‚å¯¹å…¶ä¸¤ç«¯æ–½åŠ çš„å†²é‡çš„æœ€å¤§å€¼ã€‚" #: doc/classes/PhysicsServer.xml msgid "The maximum rotation across the Hinge." @@ -56474,7 +56579,7 @@ msgid "" "Pin joint for 3D rigid bodies. It pins 2 bodies (rigid or static) together. " "See also [Generic6DOFJoint]." msgstr "" -"3Dåˆšä½“çš„é’‰å…³èŠ‚ã€‚å®ƒå°†ä¸¤ä¸ªç‰©ä½“ï¼ˆåˆšä½“æˆ–é™æ€ä½“)钉在一起。å‚阅" +"3D åˆšä½“çš„é’‰å…³èŠ‚ã€‚å®ƒå°†ä¸¤ä¸ªç‰©ä½“ï¼ˆåˆšä½“æˆ–é™æ€ä½“)钉在一起。å¦è¯·å‚阅 " "[Generic6DOFJoint]。" #: doc/classes/PinJoint.xml @@ -56493,7 +56598,7 @@ msgstr "è¢«é’‰åœ¨ä¸€èµ·çš„ç‰©ä½“ä¹‹é—´ä¿æŒå…±é€Ÿçš„力。越高,力越大。 msgid "" "If above 0, this value is the maximum value for an impulse that this Joint " "produces." -msgstr "如果大于0,这个值就是æ¤å…³èŠ‚äº§ç”Ÿçš„å†²é‡çš„æœ€å¤§å€¼ã€‚" +msgstr "如果大于 0,这个值就是æ¤å…³èŠ‚äº§ç”Ÿçš„å†²é‡çš„æœ€å¤§å€¼ã€‚" #: doc/classes/PinJoint2D.xml msgid "Pin Joint for 2D shapes." @@ -56551,7 +56656,7 @@ msgstr "返回平é¢çš„ä¸å¿ƒã€‚" msgid "" "Returns the shortest distance from the plane to the position [code]point[/" "code]." -msgstr "返回从平é¢åˆ°ä½ç½®[code]point[/code]的最çŸè·ç¦»ã€‚" +msgstr "返回从平é¢åˆ°ä½ç½® [code]point[/code] 的最çŸè·ç¦»ã€‚" #: doc/classes/Plane.xml msgid "" @@ -56608,7 +56713,7 @@ msgstr "" #: doc/classes/Plane.xml msgid "" "Returns [code]true[/code] if [code]point[/code] is located above the plane." -msgstr "如果[code]point[/code]ä½äºŽå¹³é¢ä¸Šæ–¹ï¼Œåˆ™è¿”回 [code]true[/code]。" +msgstr "如果 [code]point[/code] ä½äºŽå¹³é¢ä¸Šæ–¹ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/Plane.xml msgid "Returns a copy of the plane, normalized." @@ -56618,7 +56723,7 @@ msgstr "返回平é¢çš„ä¸€ä¸ªæ ‡å‡†åŒ–å‰¯æœ¬ã€‚" msgid "" "Returns the orthogonal projection of [code]point[/code] into a point in the " "plane." -msgstr "返回 [code]点[/code]在平é¢ä¸Šçš„æ£äº¤æŠ•å½±ã€‚" +msgstr "返回 [code]point[/code] 在平é¢ä¸Šçš„æ£äº¤æŠ•å½±ã€‚" #: doc/classes/Plane.xml msgid "" @@ -56628,9 +56733,9 @@ msgid "" "[code]d[/code], while the [code](a, b, c)[/code] coordinates are represented " "by the [member normal] property." msgstr "" -"从原点到平é¢çš„è·ç¦»ï¼Œæ²¿[member normal]æ–¹å‘。这个值通常是éžè´Ÿçš„。\n" -"在平é¢[code]ax + by + cz = d[/code]çš„æ ‡é‡æ–¹ç¨‹ä¸ï¼Œè¿™æ˜¯[code]d[/code],而[code]" -"(a, b, c)[/code]åæ ‡ç”±[member normal]属性表示。" +"从原点到平é¢çš„è·ç¦»ï¼Œæ²¿ [member normal] æ–¹å‘。这个值通常是éžè´Ÿçš„。\n" +"åœ¨å¹³é¢ [code]ax + by + cz = d[/code] çš„æ ‡é‡æ–¹ç¨‹ä¸ï¼Œè¿™æ˜¯ [code]d[/code],而 " +"[code](a, b, c)[/code] åæ ‡ç”± [member normal] 属性表示。" #: doc/classes/Plane.xml msgid "" @@ -56640,8 +56745,8 @@ msgid "" "property." msgstr "" "å¹³é¢çš„æ³•线,必须归一化。\n" -"在平é¢[code]ax + by + cz = d[/code]çš„æ ‡é‡æ–¹ç¨‹ä¸ï¼Œè¿™æ˜¯å‘é‡[code](a, b, c)[/" -"code],其ä¸[code]d[/code]是[member d]属性。" +"åœ¨å¹³é¢ [code]ax + by + cz = d[/code] çš„æ ‡é‡æ–¹ç¨‹ä¸ï¼Œè¿™æ˜¯å‘é‡ [code](a, b, c)[/" +"code]ï¼Œå…¶ä¸ [code]d[/code] 是 [member d] 属性。" #: doc/classes/Plane.xml msgid "The X component of the plane's [member normal] vector." @@ -56850,12 +56955,12 @@ msgid "" "If [code]true[/code], polygon will be inverted, containing the area outside " "the defined points and extending to the [code]invert_border[/code]." msgstr "" -"如果为 [code]true[/code],则多边形将å转,包å«å®šä¹‰ç‚¹ä¹‹å¤–的区域,并扩展到" -"[code]invert_border[/code](å转边界)." +"如果为 [code]true[/code],则多边形将å转,包å«å®šä¹‰ç‚¹ä¹‹å¤–的区域,并扩展到 " +"[code]invert_border[/code](å转边界)。" #: doc/classes/Polygon2D.xml msgid "The offset applied to each vertex." -msgstr "应用于æ¯ä¸ªé¡¶ç‚¹çš„ä½ç½®åç§»é‡." +msgstr "应用于æ¯ä¸ªé¡¶ç‚¹çš„ä½ç½®åç§»é‡ã€‚" #: doc/classes/Polygon2D.xml msgid "" @@ -56965,11 +57070,12 @@ msgstr "" msgid "" "Constructs a new [PoolByteArray]. Optionally, you can pass in a generic " "[Array] that will be converted." -msgstr "构建新的[PoolByteArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +msgstr "" +"构建新的 [PoolByteArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolByteArray.xml msgid "Appends a [PoolByteArray] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolByteArray]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolByteArray]。" #: doc/classes/PoolByteArray.xml msgid "" @@ -57114,6 +57220,14 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "改å˜ç»™å®šç´¢å¼•处的å—节。" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +#, fuzzy +msgid "Sorts the elements of the array in ascending order." +msgstr "从数组ä¸åˆ 除ä½äºŽç´¢å¼•çš„å…ƒç´ ã€‚" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -57176,11 +57290,11 @@ msgid "" "Constructs a new [PoolColorArray]. Optionally, you can pass in a generic " "[Array] that will be converted." msgstr "" -"构建新的[PoolColorArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +"构建新的 [PoolColorArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolColorArray.xml msgid "Appends a [PoolColorArray] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ ä¸€ä¸ª[PoolColorArray]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ ä¸€ä¸ª [PoolColorArray]。" #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml msgid "Appends a value to the array." @@ -57260,18 +57374,19 @@ msgstr "" msgid "" "Constructs a new [PoolIntArray]. Optionally, you can pass in a generic " "[Array] that will be converted." -msgstr "构建新的[PoolIntArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +msgstr "" +"构建新的 [PoolIntArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolIntArray.xml msgid "Appends a [PoolIntArray] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolIntArray]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolIntArray]。" #: doc/classes/PoolIntArray.xml msgid "" "Inserts a new int at a given position in the array. The position must be " "valid, or at the end of the array ([code]idx == size()[/code])." msgstr "" -"在数组ä¸çš„æŒ‡å®šä½ç½®æ’入一个新的int。这个ä½ç½®å¿…须是有效的,或者在数组的末端" +"在数组ä¸çš„æŒ‡å®šä½ç½®æ’入一个新的 int。这个ä½ç½®å¿…须是有效的,或者在数组的末端" "([code]idx == size()[/code])。" #: doc/classes/PoolIntArray.xml @@ -57402,11 +57517,11 @@ msgid "" "Constructs a new [PoolStringArray]. Optionally, you can pass in a generic " "[Array] that will be converted." msgstr "" -"构建新的[PoolStringArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +"构建新的 [PoolStringArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolStringArray.xml msgid "Appends a [PoolStringArray] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolStringArray]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolStringArray]。" #: doc/classes/PoolStringArray.xml msgid "" @@ -57481,15 +57596,15 @@ msgid "" "Constructs a new [PoolVector2Array]. Optionally, you can pass in a generic " "[Array] that will be converted." msgstr "" -"构建新的[PoolVector2Array]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +"构建新的 [PoolVector2Array]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolVector2Array.xml msgid "Appends a [PoolVector2Array] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolVector2Array]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolVector2Array]。" #: doc/classes/PoolVector2Array.xml msgid "Inserts a [Vector2] at the end." -msgstr "在末尾æ’å…¥[Vector2]。" +msgstr "在末尾æ’入一个 [Vector2]。" #: doc/classes/PoolVector2Array.xml msgid "Changes the [Vector2] at the given index." @@ -57548,15 +57663,15 @@ msgid "" "Constructs a new [PoolVector3Array]. Optionally, you can pass in a generic " "[Array] that will be converted." msgstr "" -"构建新的[PoolVector3Array]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +"构建新的 [PoolVector3Array]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolVector3Array.xml msgid "Appends a [PoolVector3Array] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolVector3Array]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolVector3Array]。" #: doc/classes/PoolVector3Array.xml msgid "Inserts a [Vector3] at the end." -msgstr "在末尾æ’å…¥[Vector3]。" +msgstr "在末尾æ’入一个 [Vector3]。" #: doc/classes/PoolVector3Array.xml msgid "Changes the [Vector3] at the given index." @@ -57670,11 +57785,11 @@ msgstr "PopupDialog æ˜¯å¼¹å‡ºå¯¹è¯æ¡†çš„基类,与 [WindowDialog] 一起。" #: doc/classes/PopupDialog.xml msgid "Sets a custom [StyleBox] for the panel of the [PopupDialog]." -msgstr "为[PopupDialog]çš„é¢æ¿è®¾ç½®è‡ªå®šä¹‰çš„[StyleBox]。" +msgstr "为 [PopupDialog] çš„é¢æ¿è®¾ç½®è‡ªå®šä¹‰çš„ [StyleBox]。" #: doc/classes/PopupMenu.xml msgid "PopupMenu displays a list of options." -msgstr "PopupMenu(弹出èœå•)显示选项列表." +msgstr "PopupMenu 会显示一个选项列表。" #: doc/classes/PopupMenu.xml msgid "" @@ -57692,6 +57807,14 @@ msgid "" "keystroke was registered. You can adjust the timeout duration by changing " "[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" +"[PopupMenu] 是会显示一个选项列表的 [Control]。常è§äºŽå·¥å…·æ 和上下文èœå•ä¸ã€‚\n" +"[b]å¢žé‡æœç´¢ï¼š[/b]与 [ItemList] å’Œ [Tree] 类似,[PopupMenu] 也支æŒåœ¨èšç„¦æŽ§ä»¶æ—¶" +"在列表ä¸è¿›è¡Œæœç´¢ã€‚按下与æŸä¸ªæ¡ç›®åç§°é¦–å—æ¯ä¸€è‡´çš„æŒ‰é”®ï¼Œå°±ä¼šé€‰ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„" +"第一个æ¡ç›®ã€‚在æ¤ä¹‹åŽï¼Œè¿›è¡Œå¢žé‡æœç´¢çš„办法有两ç§ï¼š1)在超时å‰å†æ¬¡æŒ‰ä¸‹åŒä¸€ä¸ªæŒ‰" +"键,选ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„下一个æ¡ç›®ã€‚2ï¼‰åœ¨è¶…æ—¶å‰æŒ‰ä¸‹å‰©ä½™å—æ¯å¯¹åº”的按键,直接匹é…" +"并选䏿‰€éœ€çš„æ¡ç›®ã€‚è¿™ä¸¤ä¸ªåŠ¨ä½œéƒ½ä¼šåœ¨æœ€åŽä¸€æ¬¡æŒ‰é”®è¶…æ—¶åŽé‡ç½®å›žåˆ—è¡¨é¡¶ç«¯ã€‚ä½ å¯ä»¥é€š" +"过 [member ProjectSettings.gui/timers/incremental_search_max_interval_msec] " +"修改超时时长。" #: doc/classes/PopupMenu.xml msgid "" @@ -57724,12 +57847,13 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯æ£€æŸ¥é¡¹ç›®,并将指定的[ShortCut]分é…给它.å°†å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º" -"ShortCutçš„åç§°.\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª[code]id[/code].如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€" -"个.\n" -"[b]注æ„:[/b]坿£€æŸ¥é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªæ£€æŸ¥æ ‡è®°,但没有任何内置的检查行为,必须手动" -"æ£€æŸ¥æˆ–å–æ¶ˆæ£€æŸ¥. å‚阅 [method set_item_checked]了解更多关于如何控制它的信æ¯." +"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯æ£€æŸ¥é¡¹ç›®,并将指定的 [ShortCut] 分é…给它。将å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º " +"ShortCut çš„å称。\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›" +"建一个。\n" +"[b]注æ„:[/b]坿£€æŸ¥é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªæ£€æŸ¥æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须手" +"åŠ¨æ£€æŸ¥æˆ–å–æ¶ˆæ£€æŸ¥ã€‚å‚阅 [method set_item_checked] 了解更多关于如何控制它的信" +"æ¯ã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57744,14 +57868,14 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯æ£€æŸ¥é¡¹ç›®ï¼Œå¸¦æœ‰æ–‡æœ¬[code]label[/code]å’Œå›¾æ ‡[code]texture[/" +"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯æ£€æŸ¥é¡¹ç›®ï¼Œå¸¦æœ‰æ–‡æœ¬ [code]label[/code] å’Œå›¾æ ‡ [code]texture[/" "code]。\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª[code]id[/code],以åŠä¸€ä¸ªåŠ é€Ÿå™¨ï¼ˆ[code]accel[/code])。如果没" -"有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾›[code]accel[/code],那" -"么默认的[code]0[/code]将被分é…给它。å‚阅[method get_item_accelerator]èŽ·å–æ›´å¤š" -"å…³äºŽåŠ é€Ÿå™¨çš„ä¿¡æ¯ã€‚\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª [code]id[/code],以åŠä¸€ä¸ªåŠ é€Ÿå™¨ï¼ˆ[code]accel[/code])。如果" +"没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/" +"code],那么默认的 [code]0[/code] 将被分é…给它。å‚阅 [method " +"get_item_accelerator] èŽ·å–æ›´å¤šå…³äºŽåŠ é€Ÿå™¨çš„ä¿¡æ¯ã€‚\n" "[b]注æ„:[/b]å¯é€‰é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须手动" -"检查/å–æ¶ˆæ£€æŸ¥ã€‚å‚阅[method set_item_checked]èŽ·å–æ›´å¤šå…³äºŽå¦‚何控制它的信æ¯ã€‚" +"检查/å–æ¶ˆæ£€æŸ¥ã€‚å‚阅 [method set_item_checked] èŽ·å–æ›´å¤šå…³äºŽå¦‚何控制它的信æ¯ã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57764,12 +57888,12 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯é€‰é¡¹ç›®ï¼Œå¹¶ä¸ºå…¶åˆ†é…指定的[ShortCut]å’Œå›¾æ ‡[code]texture[/code]。" -"å°†å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º[ShortCut]çš„å称。\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª[code]id[/code]。如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»º" -"一个。\n" +"æ·»åŠ ä¸€ä¸ªæ–°çš„å¯é€‰é¡¹ç›®ï¼Œå¹¶ä¸ºå…¶åˆ†é…指定的 [ShortCut] å’Œå›¾æ ‡ [code]texture[/" +"code]。将å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º [ShortCut] çš„å称。\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›" +"建一个。\n" "[b]注æ„:[/b]å¯é€‰é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须手动" -"检查/å–æ¶ˆæ£€æŸ¥ã€‚å‚阅[method set_item_checked]èŽ·å–æ›´å¤šå…³äºŽå¦‚何控制它的信æ¯ã€‚" +"检查/å–æ¶ˆæ£€æŸ¥ã€‚å‚阅 [method set_item_checked] èŽ·å–æ›´å¤šå…³äºŽå¦‚何控制它的信æ¯ã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57788,12 +57912,12 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "Same as [method add_icon_check_item], but uses a radio check button." -msgstr "与[method add_icon_check_item]相åŒï¼Œä½†ä½¿ç”¨å•选按钮。" +msgstr "与 [method add_icon_check_item] 相åŒï¼Œä½†ä½¿ç”¨å•选按钮。" #: doc/classes/PopupMenu.xml msgid "" "Same as [method add_icon_check_shortcut], but uses a radio check button." -msgstr "与[method add_icon_check_shortcut]相åŒï¼Œä½†ä½¿ç”¨ä¸€ä¸ªå•选按钮。" +msgstr "与 [method add_icon_check_shortcut] 相åŒï¼Œä½†ä½¿ç”¨ä¸€ä¸ªå•选按钮。" #: doc/classes/PopupMenu.xml msgid "" @@ -57802,9 +57926,9 @@ msgid "" "An [code]id[/code] can optionally be provided. If no [code]id[/code] is " "provided, one will be created from the index." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°é¡¹ï¼Œå¹¶åˆ†é…æŒ‡å®šçš„[ShortCut]å’Œå›¾æ ‡[code]texture[/code]给它。将å¤é€‰æ¡†" -"çš„æ ‡ç¾è®¾ç½®ä¸º[ShortCut]çš„å称。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code]。如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€" +"æ·»åŠ ä¸€ä¸ªæ–°é¡¹ï¼Œå¹¶åˆ†é…æŒ‡å®šçš„ [ShortCut] å’Œå›¾æ ‡ [code]texture[/code] 给它。将å¤" +"é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º [ShortCut] çš„å称。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€" "个。" #: doc/classes/PopupMenu.xml @@ -57889,9 +58013,9 @@ msgid "" "A [code]label[/code] can optionally be provided, which will appear at the " "center of the separator." msgstr "" -"åœ¨é¡¹ç›®ä¹‹é—´æ·»åŠ ä¸€ä¸ªåˆ†éš”ç¬¦ã€‚åˆ†éš”ç¬¦ä¹Ÿå ç”¨ä¸€ä¸ªç´¢å¼•ï¼Œä½ å¯ä»¥é€šè¿‡ä½¿ç”¨[code]id[/code]" -"傿•°æ¥è®¾ç½®ã€‚\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ªæ ‡ç¾[code]label[/code],它将出现在分隔符的ä¸å¿ƒã€‚" +"åœ¨é¡¹ç›®ä¹‹é—´æ·»åŠ ä¸€ä¸ªåˆ†éš”ç¬¦ã€‚åˆ†éš”ç¬¦ä¹Ÿå ç”¨ä¸€ä¸ªç´¢å¼•ï¼Œä½ å¯ä»¥é€šè¿‡ä½¿ç”¨ [code]id[/" +"code] 傿•°æ¥è®¾ç½®ã€‚\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ªæ ‡ç¾ [code]label[/code],它将出现在分隔符的ä¸å¿ƒã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57899,8 +58023,8 @@ msgid "" "An [code]id[/code] can optionally be provided. If no [code]id[/code] is " "provided, one will be created from the index." msgstr "" -"æ·»åŠ ä¸€ä¸ª[ShortCut]。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code]。如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€" +"æ·»åŠ ä¸€ä¸ª [ShortCut]。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€" "个。" #: doc/classes/PopupMenu.xml @@ -57911,14 +58035,14 @@ msgid "" "An [code]id[/code] can optionally be provided. If no [code]id[/code] is " "provided, one will be created from the index." msgstr "" -"æ·»åŠ ä¸€ä¸ªé¡¹ç›®ï¼Œå½“å•击父[PopupMenu]节点时,它将作为åèœå•。[code]submenu[/code]" -"傿•°æ˜¯å节点[PopupMenu]çš„å称,当点击项目时显示该å节点。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code]。如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€" +"æ·»åŠ ä¸€ä¸ªé¡¹ç›®ï¼Œå½“å•击父 [PopupMenu] 节点时,它将作为åèœå•。[code]submenu[/" +"code] 傿•°æ˜¯å节点 [PopupMenu] çš„å称,当点击项目时显示该å节点。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€" "个。" #: doc/classes/PopupMenu.xml msgid "Removes all items from the [PopupMenu]." -msgstr "从[PopupMenu]ä¸ç§»é™¤æ‰€æœ‰é¡¹ç›®ã€‚" +msgstr "从该 [PopupMenu] ä¸ç§»é™¤æ‰€æœ‰é¡¹ç›®ã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57932,19 +58056,20 @@ msgid "" "are special combinations of keys that activate the item, no matter which " "control is focused." msgstr "" -"返回索引[code]idx[/code]å¤„é¡¹ç›®çš„åŠ é€Ÿé¡¹ã€‚åŠ é€Ÿå™¨æ˜¯ä¸€ç§ç‰¹æ®Šçš„æŒ‰é”®ç»„åˆï¼Œå¯ä»¥æ¿€æ´»" -"物å“ï¼Œæ— è®ºå“ªä¸ªæŽ§åˆ¶é”®å¤„äºŽç„¦ç‚¹çŠ¶æ€ã€‚" +"返回索引 [code]idx[/code] å¤„é¡¹ç›®çš„åŠ é€Ÿé¡¹ã€‚åŠ é€Ÿå™¨æ˜¯ä¸€ç§ç‰¹æ®Šçš„æŒ‰é”®ç»„åˆï¼Œå¯ä»¥æ¿€" +"活物å“ï¼Œæ— è®ºå“ªä¸ªæŽ§åˆ¶é”®å¤„äºŽç„¦ç‚¹çŠ¶æ€ã€‚" #: doc/classes/PopupMenu.xml msgid "Returns the number of items in the [PopupMenu]." -msgstr "返回[PopupMenu]ä¸çš„项目数。" +msgstr "返回该 [PopupMenu] ä¸çš„项目数。" #: doc/classes/PopupMenu.xml msgid "" "Returns the id of the item at index [code]idx[/code]. [code]id[/code] can be " "manually assigned, while index can not." msgstr "" -"返回索引[code]idx[/code]处项目的id。[code]id[/code]å¯ä»¥æ‰‹åŠ¨åˆ†é…,而索引ä¸èƒ½ã€‚" +"返回索引 [code]idx[/code] 处项目的 id。[code]id[/code] å¯ä»¥æ‰‹åŠ¨åˆ†é…,而索引ä¸" +"能。" #: doc/classes/PopupMenu.xml msgid "" @@ -57952,8 +58077,8 @@ msgid "" "Index is automatically assigned to each item by the engine. Index can not be " "set manually." msgstr "" -"è¿”å›žåŒ…å«æŒ‡å®šçš„[code]id[/code]的项的索引。索引由引擎自动分é…ç»™æ¯ä¸ªé¡¹ç›®ã€‚ä¸èƒ½æ‰‹" -"动设置索引。" +"è¿”å›žåŒ…å«æŒ‡å®šçš„ [code]id[/code] 的项的索引。索引由引擎自动分é…ç»™æ¯ä¸ªé¡¹ç›®ã€‚ä¸èƒ½" +"手动设置索引。" #: doc/classes/PopupMenu.xml msgid "" @@ -57961,26 +58086,26 @@ msgid "" "can set it with [method set_item_metadata], which provides a simple way of " "assigning context data to items." msgstr "" -"返回指定项的元数æ®ï¼Œè¯¥é¡¹å¯ä»¥æ˜¯ä»»ä½•类型。您å¯ä»¥ä½¿ç”¨[method set_item_metadata]" -"æ¥è®¾ç½®å®ƒï¼Œå®ƒæä¾›äº†ä¸€ç§å°†ä¸Šä¸‹æ–‡æ•°æ®åˆ†é…ç»™é¡¹çš„ç®€å•æ–¹æ³•。" +"返回指定项的元数æ®ï¼Œè¯¥é¡¹å¯ä»¥æ˜¯ä»»ä½•类型。您å¯ä»¥ä½¿ç”¨ [method " +"set_item_metadata] æ¥è®¾ç½®å®ƒï¼Œå®ƒæä¾›äº†ä¸€ç§å°†ä¸Šä¸‹æ–‡æ•°æ®åˆ†é…ç»™é¡¹çš„ç®€å•æ–¹æ³•。" #: doc/classes/PopupMenu.xml msgid "" "Returns the [ShortCut] associated with the specified [code]idx[/code] item." -msgstr "返回与指定的[code]idx[/code]项关è”çš„[ShortCut]。" +msgstr "返回与指定的 [code]idx[/code] 项关è”çš„ [ShortCut]。" #: doc/classes/PopupMenu.xml msgid "" "Returns the submenu name of the item at index [code]idx[/code]. See [method " "add_submenu_item] for more info on how to add a submenu." msgstr "" -"返回在索引[code]idx[/code]处的项目的åèœå•åã€‚æ›´å¤šå…³äºŽå¦‚ä½•æ·»åŠ åèœå•的信æ¯ï¼Œ" -"请å‚阅[method add_submenu_item]。" +"返回在索引 [code]idx[/code] 处的项目的åèœå•åã€‚æ›´å¤šå…³äºŽå¦‚ä½•æ·»åŠ åèœå•的信" +"æ¯ï¼Œè¯·å‚阅 [method add_submenu_item]。" #: doc/classes/PopupMenu.xml msgid "" "Returns the tooltip associated with the specified index [code]idx[/code]." -msgstr "返回与指定索引 [code]idx[/code]å…³è”的工具æç¤ºã€‚" +msgstr "返回与指定索引 [code]idx[/code] å…³è”的工具æç¤ºã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -58056,7 +58181,7 @@ msgstr "将当å‰èšç„¦é¡¹ç›®è®¾ç½®ä¸ºç»™å®šçš„索引 [code]index[/code]。" #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." -msgstr "当窗å£å¤±åŽ»ç„¦ç‚¹æ—¶éšè—[PopupMenu]。" +msgstr "当窗å£å¤±åŽ»ç„¦ç‚¹æ—¶éšè— [PopupMenu]。" #: doc/classes/PopupMenu.xml msgid "" @@ -58064,7 +58189,7 @@ msgid "" "special combinations of keys that activate the item, no matter which control " "is focused." msgstr "" -"设置索引[code]idx[/code]é¡¹çš„åŠ é€Ÿé”®ã€‚åŠ é€Ÿå™¨æ˜¯ä¸€ç§ç‰¹æ®Šçš„æŒ‰é”®ç»„åˆï¼Œå¯ä»¥æ¿€æ´»ç‰©" +"设置索引 [code]idx[/code] é¡¹çš„åŠ é€Ÿé”®ã€‚åŠ é€Ÿå™¨æ˜¯ä¸€ç§ç‰¹æ®Šçš„æŒ‰é”®ç»„åˆï¼Œå¯ä»¥æ¿€æ´»ç‰©" "å“ï¼Œæ— è®ºå“ªä¸ªæŽ§åˆ¶é”®å¤„äºŽç„¦ç‚¹çŠ¶æ€ã€‚" #: doc/classes/PopupMenu.xml @@ -58098,15 +58223,15 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "Sets the checkstate status of the item at index [code]idx[/code]." -msgstr "设置项目在index [code]idx[/code]处的checkstate状æ€ã€‚" +msgstr "è®¾ç½®åœ¨ç´¢å¼•å· [code]idx[/code] 处的项目的勾选状æ€ã€‚" #: doc/classes/PopupMenu.xml msgid "" "Enables/disables the item at index [code]idx[/code]. When it is disabled, it " "can't be selected and its action can't be invoked." msgstr "" -"å¯ç”¨/ç¦ç”¨ç´¢å¼•[code]idx[/code]项。当它被ç¦ç”¨æ—¶ï¼Œå°±æ— æ³•é€‰æ‹©å®ƒï¼Œä¹Ÿæ— æ³•è°ƒç”¨å®ƒçš„æ“" -"作。" +"å¯ç”¨/ç¦ç”¨ç´¢å¼• [code]idx[/code] 项。当它被ç¦ç”¨æ—¶ï¼Œå°±æ— æ³•é€‰æ‹©å®ƒï¼Œä¹Ÿæ— æ³•è°ƒç”¨å®ƒçš„" +"æ“作。" #: doc/classes/PopupMenu.xml msgid "Replaces the [Texture] icon of the specified [code]idx[/code]." @@ -62092,7 +62217,6 @@ msgstr "" "义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "This is the maximum number of shaders that can be compiled (or reconstructed " "from cache) at the same time.\n" @@ -62118,12 +62242,10 @@ msgstr "" "能多的异æ¥ç¼–è¯‘çš„åŒæ—¶ï¼Œä¸å¯¹æ¸¸æˆçš„å“åº”æ€§é€ æˆå½±å“,å¦åˆ™å°±ä¼šè¾œè´Ÿå¼‚æ¥ç¼–译所带æ¥çš„" "好处。æ¢å¥è¯è¯´ï¼Œä½ å¯èƒ½ä¼šç‰ºç‰²ä¸€ç‚¹ç‚¹çš„ FPSï¼Œæ€»æ¯”åŒæ¥ç¼–译让整个游æˆåœæ»žè¦å¥½ã€‚\n" "默认值比较ä¿å®ˆï¼Œæ‰€ä»¥å»ºè®®ä½ æ ¹æ®è‡ªå·±çš„ç›®æ ‡ç¡¬ä»¶ä½œå‡ºè°ƒæ•´ã€‚\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„" -"义。" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "The default is a very conservative override for [member rendering/gles3/" "shaders/max_simultaneous_compiles].\n" @@ -62132,15 +62254,13 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" -"默认是针对 [code]rendering/gles3/shaders/max_concurrent_compiles[/code] 的覆" +"默认是针对 [member rendering/gles3/shaders/max_simultaneous_compiles] 的覆" "盖,å–值éžå¸¸ä¿å®ˆã€‚\n" "æ ¹æ®ä½ æ‰€è®¾å®šä¸ºç›®æ ‡çš„ç‰¹å®šè®¾å¤‡ï¼Œä½ å¯èƒ½ä¼šæƒ³è¦æé«˜è¿™ä¸ªå€¼ã€‚\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„" -"义。" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "The default is a very conservative override for [member rendering/gles3/" "shaders/max_simultaneous_compiles].\n" @@ -62149,15 +62269,13 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" -"默认是针对 [code]rendering/gles3/shaders/max_concurrent_compiles[/code] 的覆" +"默认是针对 [member rendering/gles3/shaders/max_simultaneous_compiles] 的覆" "盖,å–值éžå¸¸ä¿å®ˆã€‚\n" "æ ¹æ®ä½ æ‰€è®¾å®šä¸ºç›®æ ‡çš„ç‰¹å®šè®¾å¤‡ï¼Œä½ å¯èƒ½ä¼šæƒ³è¦æé«˜è¿™ä¸ªå€¼ã€‚\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„" -"义。" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " @@ -62167,12 +62285,10 @@ msgid "" msgstr "" "超级ç€è‰²å™¨ç¼“å˜æ‰€èƒ½å¢žé•¿åˆ°çš„æœ€å¤§å¤§å°ï¼Œå•ä½ä¸ºå…†å—节。在å¯åŠ¨æ—¶ï¼Œä¼šåˆ é™¤æœ€ä¹…æœªç”¨çš„" "æ¡ç›®ï¼Œç›´åˆ°æ€»å¤§å°åˆ°è¾¾èŒƒå›´å†…。\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] 为 [code]Asynchronous + Cache[/code] 时有æ„" -"义。" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] 为 [code]Asynchronous + Cache[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " "smaller maximum size can be configured for mobile platforms, where storage " @@ -62180,14 +62296,12 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" -"[code]rendering/gles3/shaders/ubershader_cache_size_mb[/code] 的覆盖项,为针" -"对移动平å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] 为 [code]Asynchronous + Cache[/code] 时有æ„" -"义。" +"[member rendering/gles3/shaders/shader_cache_size_mb] 的覆盖项,为针对移动平" +"å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] 为 [code]Asynchronous + Cache[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " "smaller maximum size can be configured for web platforms, where storage " @@ -62197,11 +62311,11 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" -"[code]rendering/gles3/shaders/ubershader_cache_size_mb[/code] 的覆盖项,为针" -"对移动平å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" -"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" -"shader_compilation_mode[/code] 为 [code]Asynchronous + Cache[/code] 时有æ„" -"义。" +"[member rendering/gles3/shaders/shader_cache_size_mb] 的覆盖项,为针对移动平" +"å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" +"[b]注æ„:[/b]ç›®å‰ Web å¹³å°å°šä¸æ”¯æŒç€è‰²å™¨ç¼“å˜ã€‚\n" +"[b]注æ„:[/b]本设置仅在 [member rendering/gles3/shaders/" +"shader_compilation_mode] 为 [code]Asynchronous + Cache[/code] 时有æ„义。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62247,28 +62361,26 @@ msgstr "" "ç€è‰²å™¨ä¹Ÿä¸ä¼šä½¿ç”¨å¼‚æ¥ç¼–译。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "An override for [member rendering/gles3/shaders/shader_compilation_mode], so " "asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" -"[code]rendering/gles3/shaders/shader_compilation_mode[/code] 的覆盖项,用于为" -"移动设备ç¦ç”¨å¼‚æ¥ç¼–译。\n" +"[member rendering/gles3/shaders/shader_compilation_mode] 的覆盖项,用于为移动" +"设备ç¦ç”¨å¼‚æ¥ç¼–译。\n" "移动 GPU 通常ä¸ä¼šæ”¯æŒè¶…级ç€è‰²å™¨ï¼Œå› ä¸ºå…¶å¤æ‚度较高。" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "An override for [member rendering/gles3/shaders/shader_compilation_mode], so " "asynchronous compilation can be disabled on web platforms.\n" "You may want to do that since certain browsers (especially on mobile " "platforms) generally won't support ubershaders due to their complexity." msgstr "" -"[code]rendering/gles3/shaders/shader_compilation_mode[/code] 的覆盖项,用于为" -"移动设备ç¦ç”¨å¼‚æ¥ç¼–译。\n" -"移动 GPU 通常ä¸ä¼šæ”¯æŒè¶…级ç€è‰²å™¨ï¼Œå› ä¸ºå…¶å¤æ‚度较高。" +"[member rendering/gles3/shaders/shader_compilation_mode] 的覆盖项,用于为 " +"Web å¹³å°ç¦ç”¨å¼‚æ¥ç¼–译。\n" +"æŸäº›æµè§ˆå™¨ï¼ˆå°¤å…¶åœ¨ç§»åЍ平å°ä¸Šï¼‰é€šå¸¸ä¸ä¼šæ”¯æŒè¶…级ç€è‰²å™¨ï¼Œå› ä¸ºå…¶å¤æ‚度较高。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62887,13 +62999,12 @@ msgid "" msgstr "阴影贴图的细分象é™å¤§å°ã€‚请å‚é˜…é˜´å½±æ˜ å°„æ–‡æ¡£ã€‚" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "Size for shadow atlas (used for OmniLights and SpotLights). The value will " "be rounded up to the nearest power of 2. See shadow mapping documentation." msgstr "" "设置阴影图集的图åƒå¤§å°ï¼ˆç”¨äºŽå…¨å‘光和èšå…‰ï¼‰ã€‚该值将被四èˆäº”入到最接近的 2 çš„" -"幂。" +"幂。è§é˜´å½±è´´å›¾æ–‡æ¡£ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -64170,8 +64281,8 @@ msgid "" "it tries to separate itself from whatever is touching its far endpoint. It's " "often useful for characters." msgstr "" -"äºŒç»´ç¢°æ’žçš„å°„çº¿å½¢çŠ¶ã€‚å°„çº¿å¹¶ä¸æ˜¯çœŸæ£çš„碰撞体;相å,它试图将自己与接触其远端的" -"任何东西分开。它通常对角色很有用。" +"2D ç¢°æ’žçš„å°„çº¿å½¢çŠ¶ã€‚å°„çº¿å¹¶ä¸æ˜¯çœŸæ£çš„碰撞体;相å,它试图将自己与接触其远端的任" +"何东西分开。它通常对角色很有用。" #: doc/classes/Rect2.xml msgid "2D axis-aligned bounding box." @@ -64315,13 +64426,13 @@ msgstr "返回一个更大的 [Rect2],其ä¸åŒ…å«è¿™ä¸ª [Rect2] å’Œ [code]b[/ #: doc/classes/RectangleShape2D.xml msgid "Rectangle shape for 2D collisions." -msgstr "二维碰撞的矩形。" +msgstr "2D 碰撞的矩形。" #: doc/classes/RectangleShape2D.xml msgid "" "Rectangle shape for 2D collisions. This shape is useful for modeling box-" "like 2D objects." -msgstr "二维碰撞的矩形。这个形状对于建模盒状2D对象很有用。" +msgstr "2D 碰撞的矩形。这个形状对于建模盒状 2D 对象很有用。" #: doc/classes/RectangleShape2D.xml msgid "" @@ -66279,8 +66390,8 @@ msgid "" "for a body." msgstr "" "在物ç†å¤„ç†è¿‡ç¨‹ä¸è¢«è°ƒç”¨ï¼Œå…è®¸ä½ è¯»å–并安全地修改对象的模拟状æ€ã€‚默认情况下,它" -"是在通常的物ç†è¡Œä¸ºä¹‹å¤–工作的,但是[member custom_integrator]属性å…è®¸ä½ ç¦ç”¨é»˜" -"è®¤è¡Œä¸ºï¼Œä¸ºä¸€ä¸ªç‰©ä½“æ–½åŠ å®Œå…¨è‡ªå®šä¹‰çš„åˆåŠ›ã€‚" +"会和通常的物ç†è¡Œä¸ºä¸€èµ·ç”Ÿæ•ˆï¼Œä½†æ˜¯ä½ å¯ä»¥é€šè¿‡ [member custom_integrator] 属性ç¦" +"ç”¨é»˜è®¤è¡Œä¸ºï¼Œä¸ºç‰©ä½“æ–½åŠ å®Œå…¨è‡ªå®šä¹‰çš„åˆåŠ›ã€‚" #: doc/classes/RigidBody.xml msgid "" @@ -66321,7 +66432,7 @@ msgid "" "position uses the rotation of the global coordinate system, but is centered " "at the object's origin." msgstr "" -"å¯¹ç‰©ä½“æ–½åŠ ä¸€ä¸ªæœ‰å‘的冲é‡ã€‚冲釿˜¯ä¸Žæ—¶é—´æ— 关的! 在æ¯ä¸€å¸§ä¸æ–½åŠ ä¸€ä¸ªå†²é‡å°†äº§ç”Ÿä¸€" +"å¯¹ç‰©ä½“æ–½åŠ ä¸€ä¸ªæœ‰å‘的冲é‡ã€‚冲釿˜¯ä¸Žæ—¶é—´æ— 关的ï¼åœ¨æ¯ä¸€å¸§ä¸æ–½åŠ ä¸€ä¸ªå†²é‡å°†äº§ç”Ÿä¸€" "ä¸ªä¸Žå¸§çŽ‡ç›¸å…³çš„åŠ›ã€‚å‡ºäºŽè¿™ä¸ªåŽŸå› ï¼Œå®ƒåº”è¯¥åªåœ¨æ¨¡æ‹Ÿä¸€æ¬¡æ€§å½±å“时使用。该ä½ç½®ä½¿ç”¨å…¨" "å±€åæ ‡ç³»çš„æ—‹è½¬ï¼Œä½†ä»¥ç‰©ä½“的原点为ä¸å¿ƒã€‚" @@ -66564,12 +66675,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" -"当与å¦ä¸€ä¸ª[PhysicsBody]或[GridMap]å‘生碰撞时触å‘。需è¦å°†[member " -"contact_monitor]设置为 [code]true[/code],并且将[member contacts_reported]设" -"置得足够高以检测所有的碰撞。如果[MeshLibrary]有碰撞[Shape],[GridMap]就会被检" -"测到。\n" -"[code]body[/code]çš„[Node],如果它å˜åœ¨äºŽæ ‘ä¸ï¼Œåˆ™æ˜¯å…¶ä»–[PhysicsBody]或[GridMap]" -"的节点。" +"当与å¦ä¸€ä¸ª [PhysicsBody] 或 [GridMap] å‘生碰撞时触å‘。需è¦å°† [member " +"contact_monitor] 设置为 [code]true[/code],并且将 [member contacts_reported] " +"设置得足够高以检测所有的碰撞。如果 [MeshLibrary] 有碰撞 [Shape],[GridMap] å°±" +"会被检测到。\n" +"[code]body[/code] çš„ [Node],如果它å˜åœ¨äºŽæ ‘ä¸ï¼Œåˆ™æ˜¯å…¶ä»– [PhysicsBody] 或 " +"[GridMap] 的节点。" #: doc/classes/RigidBody.xml msgid "" @@ -66580,12 +66691,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" -"当与å¦ä¸€ä¸ª[PhysicsBody]或[GridMap]çš„ç¢°æ’žç»“æŸæ—¶è§¦å‘。需è¦å°†[member " -"contact_monitor]设置为 [code]true[/code],并且将[member contacts_reported]设" -"置得足够高以检测到所有的碰撞。如果[MeshLibrary]有碰撞[Shape],[GridMap]就会被" -"检测到。\n" -"[code]body[/code]çš„[Node],如果它å˜åœ¨äºŽæ ‘ä¸ï¼Œåˆ™æ˜¯å…¶ä»–[PhysicsBody]或[GridMap]" -"的节点。" +"当与å¦ä¸€ä¸ª [PhysicsBody]或 [GridMap] çš„ç¢°æ’žç»“æŸæ—¶è§¦å‘。需è¦å°† [member " +"contact_monitor] 设置为 [code]true[/code],并且将 [member contacts_reported] " +"设置得足够高以检测到所有的碰撞。如果 [MeshLibrary] 有碰撞 [Shape],[GridMap] " +"就会被检测到。\n" +"[code]body[/code]çš„[Node],如果它å˜åœ¨äºŽæ ‘ä¸ï¼Œåˆ™æ˜¯å…¶ä»– [PhysicsBody] 或 " +"[GridMap] 的节点。" #: doc/classes/RigidBody.xml msgid "" @@ -66678,35 +66789,34 @@ msgid "" "engine or [code]emit_signal(\"sleeping_state_changed\")[/code] is used." msgstr "" "当物ç†å¼•擎改å˜ç‰©ä½“çš„ç¡çœ çŠ¶æ€æ—¶å‘出。\n" -"[b]注æ„:[/b]改å˜[member sleeping]的值ä¸ä¼šè§¦å‘这个信å·ã€‚åªæœ‰å½“物ç†å¼•擎改å˜äº†" -"ç¡çœ çŠ¶æ€æˆ–者使用了[code]emit_signal(\"sleeping_state_changed\")[/code]时,它" -"æ‰ä¼šè¢«å‘出。" +"[b]注æ„:[/b]æ”¹å˜ [member sleeping] 的值ä¸ä¼šè§¦å‘这个信å·ã€‚åªæœ‰å½“物ç†å¼•擎改å˜" +"了ç¡çœ çŠ¶æ€æˆ–者使用了 [code]emit_signal(\"sleeping_state_changed\")[/code] " +"时,它æ‰ä¼šè¢«å‘出。" #: doc/classes/RigidBody.xml msgid "" "Rigid body mode. This is the \"natural\" state of a rigid body. It is " "affected by forces, and can move, rotate, and be affected by user code." msgstr "" -"刚体模å¼ã€‚这是一个刚体的 \"自然 \"状æ€ã€‚它å—到力的影å“,å¯ä»¥ç§»åŠ¨ã€æ—‹è½¬ï¼Œå¹¶å—" -"到用户代ç 的影å“。" +"刚体模å¼ã€‚这是一个刚体的“自然â€çжæ€ã€‚它å—到力的影å“,å¯ä»¥ç§»åŠ¨ã€æ—‹è½¬ï¼Œå¹¶å—到用" +"户代ç 的影å“。" #: doc/classes/RigidBody.xml msgid "" "Static mode. The body behaves like a [StaticBody], and can only move by user " "code." -msgstr "陿¢æ¨¡å¼ã€‚实体的行为就åƒä¸€ä¸ª[StaticBody],åªèƒ½é€šè¿‡ç”¨æˆ·ä»£ç 移动。" +msgstr "陿¢æ¨¡å¼ã€‚该实体的行为与 [StaticBody] 类似,åªèƒ½è¢«ç”¨æˆ·ä»£ç 移动。" #: doc/classes/RigidBody.xml msgid "" "Character body mode. This behaves like a rigid body, but can not rotate." -msgstr "角色模å¼ã€‚这与刚体的行为类似,但ä¸èƒ½æ—‹è½¬ã€‚" +msgstr "角色模å¼ã€‚与刚体的行为类似,但ä¸èƒ½æ—‹è½¬ã€‚" #: doc/classes/RigidBody.xml msgid "" "Kinematic body mode. The body behaves like a [KinematicBody], and can only " "move by user code." -msgstr "" -"è¿åŠ¨ä½“æ¨¡å¼ã€‚这个实体的行为就åƒä¸€ä¸ª[KinematicBody],åªèƒ½é€šè¿‡ç”¨æˆ·ä»£ç æ¥ç§»åŠ¨ã€‚" +msgstr "è¿åŠ¨ä½“æ¨¡å¼ã€‚该实体的行为与 [KinematicBody] 类似,åªèƒ½è¢«ç”¨æˆ·ä»£ç 移动。" #: doc/classes/RigidBody2D.xml msgid "A body that is controlled by the 2D physics engine." @@ -66744,7 +66854,7 @@ msgstr "" "è¦è®°ä½ï¼Œç‰©ç†ç‰©ä½“在自己管ç†å˜æ¢ï¼Œå®ƒä¼šè¦†ç›–ä½ çš„å˜æ¢è®¾ç½®ã€‚所以任何直接或间接的å˜" "æ¢ï¼ˆåŒ…括节点或其父级的缩放)将åªåœ¨ç¼–辑器ä¸å¯è§ï¼Œå¹¶åœ¨è¿è¡Œæ—¶ç«‹å³é‡ç½®ã€‚\n" "å¦‚æžœä½ éœ€è¦è¦†ç›–默认的物ç†è¡Œä¸ºæˆ–者在è¿è¡Œæ—¶æ·»åŠ å˜æ¢ï¼Œä½ å¯ä»¥å†™ä¸€ä¸ªè‡ªå®šä¹‰çš„åˆåŠ›ã€‚" -"å‚阅 [member custom_integrator]。\n" +"è§ [member custom_integrator]。\n" "è´¨é‡ä¸å¿ƒæ€»æ˜¯ä½äºŽèŠ‚ç‚¹çš„åŽŸç‚¹ï¼Œè€Œä¸è€ƒè™‘ [CollisionShape2D] ä¸å¿ƒç‚¹çš„å移。" #: doc/classes/RigidBody2D.xml @@ -66764,10 +66874,10 @@ msgid "" "custom_integrator] allows you to disable the default behavior and write " "custom force integration for a body." msgstr "" -"å…è®¸ä½ è¯»å–并安全地修改对象的模拟状æ€ã€‚å¦‚æžœä½ éœ€è¦ç›´æŽ¥æ”¹å˜ç‰©ä½“çš„" -"[code]position[/code]或其他物ç†å±žæ€§ï¼Œè¯·ä½¿ç”¨å®ƒä»£æ›¿[method Node." -"_physics_process]。默认情况下,它是在通常的物ç†è¡Œä¸ºä¹‹å¤–工作的,但是[member " -"custom_integrator]å…è®¸ä½ ç¦ç”¨é»˜è®¤è¡Œä¸ºå¹¶ä¸ºä¸€ä¸ªç‰©ä½“编写自定义的åˆåŠ›ã€‚" +"å…è®¸ä½ è¯»å–并安全地修改对象的模拟状æ€ã€‚å¦‚æžœä½ éœ€è¦ç›´æŽ¥æ”¹å˜ç‰©ä½“çš„ " +"[code]position[/code] 或其他物ç†å±žæ€§ï¼Œè¯·ä½¿ç”¨å®ƒä»£æ›¿ [method Node." +"_physics_process]。默认情况下,它是在通常的物ç†è¡Œä¸ºä¹‹å¤–工作的,但是 [member " +"custom_integrator] å…è®¸ä½ ç¦ç”¨é»˜è®¤è¡Œä¸ºå¹¶ä¸ºä¸€ä¸ªç‰©ä½“编写自定义的åˆåŠ›ã€‚" #: doc/classes/RigidBody2D.xml msgid "" @@ -66778,8 +66888,8 @@ msgid "" "global coordinate system, but is centered at the object's origin." msgstr "" "å¯¹ç‰©ä½“æ–½åŠ ä¸€ä¸ªæœ‰å‘的冲é‡ã€‚冲釿˜¯ä¸Žæ—¶é—´æ— 关的。æ¯ä¸€å¸§åº”用一个冲é‡ä¼šæœ‰ä¸€ä¸ªä¸Žå¸§" -"ç›¸å…³çš„åŠ›ã€‚ç”±äºŽè¿™ä¸ªåŽŸå› ï¼Œå®ƒåªåº”该在模拟一次性冲击时使用(å¦åˆ™å°±ä½¿ç”¨\"_force " -"\"函数)。ä½ç½®ä½¿ç”¨å…¨å±€åæ ‡ç³»çš„æ—‹è½¬ï¼Œä½†ä»¥ç‰©ä½“çš„åŽŸç‚¹ä¸ºä¸å¿ƒã€‚" +"ç›¸å…³çš„åŠ›ã€‚ç”±äºŽè¿™ä¸ªåŽŸå› ï¼Œå®ƒåªåº”该在模拟一次性冲击时使用(å¦åˆ™å°±ä½¿ç”¨â€œ_forceâ€å‡½" +"数)。ä½ç½®ä½¿ç”¨å…¨å±€åæ ‡ç³»çš„æ—‹è½¬ï¼Œä½†ä»¥ç‰©ä½“çš„åŽŸç‚¹ä¸ºä¸å¿ƒã€‚" #: doc/classes/RigidBody2D.xml msgid "" @@ -66845,8 +66955,8 @@ msgid "" "If [code]true[/code], the body will emit signals when it collides with " "another RigidBody2D. See also [member contacts_reported]." msgstr "" -"如果为 [code]true[/code],则物体在与å¦ä¸€ä¸ªRigidBody2D碰撞时会å‘出信å·ã€‚å‚阅" -"[member contacts_reported]。" +"如果为 [code]true[/code],则物体在与å¦ä¸€ä¸ª RigidBody2D 碰撞时会å‘出信å·ã€‚å¦è¯·" +"å‚阅 [member contacts_reported]。" #: doc/classes/RigidBody2D.xml msgid "" @@ -66902,7 +67012,7 @@ msgid "" "from the [b]Default Gravity[/b] value in [b]Project > Project Settings > " "Physics > 2d[/b] and/or any additional gravity vector applied by [Area2D]s." msgstr "" -"ä¹˜ä»¥æ–½åŠ åœ¨ç‰©ä½“ä¸Šçš„é‡åŠ›ã€‚ç‰©ä½“çš„é‡åŠ›æ˜¯ç”±[b]项目 > 项目设置 > ç‰©ç† > 2D[/b]ä¸çš„" +"ä¹˜ä»¥æ–½åŠ åœ¨ç‰©ä½“ä¸Šçš„é‡åŠ›ã€‚ç‰©ä½“çš„é‡åŠ›æ˜¯ç”±[b]项目 > 项目设置 > ç‰©ç† > 2D[/b] ä¸çš„" "[b]默认é‡åŠ›[/b]值和/或任何由 [Area2D] 应用的é¢å¤–é‡åŠ›å‘é‡è®¡ç®—出æ¥çš„。" #: doc/classes/RigidBody2D.xml @@ -66939,7 +67049,7 @@ msgid "" "thread and runs at a different granularity. Use [method _integrate_forces] " "as your process loop for precise control of the body state." msgstr "" -"该实体的线速度,å•ä½ä¸ºåƒç´ æ¯ç§’。å¯ä»¥å¶å°”使用,但是[b]ä¸è¦æ¯ä¸€å¸§éƒ½è®¾ç½®å®ƒ[/b]," +"该实体的线速度,å•ä½ä¸ºåƒç´ æ¯ç§’。å¯ä»¥å¶å°”使用,但是[b]ä¸è¦æ¯ä¸€å¸§éƒ½åŽ»è®¾ç½®[/b]," "å› ä¸ºç‰©ç†å¯èƒ½åœ¨å¦ä¸€ä¸ªçº¿ç¨‹ä¸è¿è¡Œï¼Œå¹¶ä¸”以ä¸åŒçš„间隔。使用 [method " "_integrate_forces] ä½œä¸ºä½ çš„è¿›ç¨‹å¾ªçŽ¯ï¼Œä»¥ç²¾ç¡®æŽ§åˆ¶ç‰©ä½“çŠ¶æ€ã€‚" @@ -67067,20 +67177,20 @@ msgstr "" #: doc/classes/RigidBody2D.xml msgid "Static mode. The body behaves like a [StaticBody2D] and does not move." -msgstr "陿€æ¨¡å¼ã€‚物体的行为就åƒä¸€ä¸ª[StaticBody2D],ä¸ä¼šç§»åŠ¨ã€‚" +msgstr "陿€æ¨¡å¼ã€‚该物体的行为与 [StaticBody2D] 类似,ä¸ä¼šç§»åŠ¨ã€‚" #: doc/classes/RigidBody2D.xml msgid "" "Character mode. Similar to [constant MODE_RIGID], but the body can not " "rotate." -msgstr "角色模å¼ã€‚与 [constant MODE_RIGID] 类似,但主体ä¸èƒ½æ—‹è½¬ã€‚" +msgstr "角色模å¼ã€‚与 [constant MODE_RIGID] 类似,但该实体ä¸èƒ½æ—‹è½¬ã€‚" #: doc/classes/RigidBody2D.xml msgid "" "Kinematic mode. The body behaves like a [KinematicBody2D], and must be moved " "by code." msgstr "" -"è¿åЍ妿¨¡å¼ã€‚这个物体的行为就åƒä¸€ä¸ª [KinematicBody2D]ï¼Œå¿…é¡»é€šè¿‡ä»£ç æ¥ç§»åŠ¨ã€‚" +"è¿åЍ妿¨¡å¼ã€‚该物体的行为就åƒä¸Ž [KinematicBody2D] ç±»ä¼¼ï¼Œå¿…é¡»é€šè¿‡ä»£ç æ¥ç§»åŠ¨ã€‚" #: doc/classes/RigidBody2D.xml msgid "" @@ -67104,7 +67214,7 @@ msgstr "使用形状投射å¯ç”¨è¿žç»ç¢°æ’žæ£€æµ‹ã€‚这是最慢的 CCD 方法ï #: doc/classes/Room.xml msgid "Room node, used to group objects together locally for [Portal] culling." -msgstr "Room 节点,用于在本地将对象组åˆåœ¨ä¸€èµ·ä»¥è¿›è¡Œ [Portal] 剔除。" +msgstr "房间节点,用于在本地将对象组åˆåœ¨ä¸€èµ·ä»¥è¿›è¡Œ [Portal] 剔除。" #: doc/classes/Room.xml msgid "" @@ -67245,7 +67355,7 @@ msgid "" "before unloading a level, when transitioning from level to level, or " "returning to a main menu." msgstr "" -"该方法会从 [b]portal graph[/b] æ¸…é™¤æ‰€æœ‰è½¬æ¢æ•°æ®ã€‚在å¸è½½å…³å¡ã€ä»Žå…³å¡è½¬æ¢åˆ°å…³å¡" +"该方法会清除 [b]room graph[/b] 䏿‰€æœ‰çš„è½¬æ¢æ•°æ®ã€‚在å¸è½½å…³å¡ã€ä»Žå…³å¡è½¬æ¢åˆ°å…³å¡" "或返回主èœå•时使用æ¤é€‰é¡¹ã€‚" #: doc/classes/RoomManager.xml @@ -67345,7 +67455,7 @@ msgstr "" "å»ºè®®æ‚¨ä»…å°†å¯¹è±¡æ”¾ç½®åœ¨å¸Œæœ›ç•™åœ¨è¿™äº›ç©ºé—´å†…çš„ç©ºé—´ä¸ - å³ [code]portal mode[/code]" "是 [code]STATIC[/code] 或 [code]DYNAMIC[/code](ä¸ç©¿è¶Š Portal)。" "[code]GLOBAL[/code] å’Œ [code]ROAMING[/code] å¯¹è±¡æœ€å¥½æ”¾ç½®åœ¨åœºæ™¯æ ‘çš„å¦ä¸€éƒ¨åˆ†ï¼Œ" -"以é¿å…混淆。有关portal模å¼çš„完整说明,请å‚阅 [CullInstance]。" +"以é¿å…混淆。有关 portal 模å¼çš„完整说明,请å‚阅 [CullInstance]。" #: doc/classes/RoomManager.xml msgid "" @@ -68461,7 +68571,6 @@ msgid "" msgstr "通过脚本进行通用动画的轻é‡çº§å¯¹è±¡ï¼Œä½¿ç”¨ [Tweener]。" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -68543,21 +68652,21 @@ msgstr "" "建 [SceneTreeTween]。手动创建的 [SceneTreeTween](å³ä½¿ç”¨ [code]Tween.new()[/" "code]ï¼‰æ˜¯æ— æ•ˆçš„ï¼Œä¸èƒ½ç”¨äºŽå¯¹å€¼è¿›è¡Œè¡¥é—´ï¼Œä½†ä½ å¯ä»¥ç”¨ [method interpolate_value] " "æ¥æ‰‹åЍæ’值。\n" -"[SceneTreeTween] 动画是由 [Tweener] åºåˆ—æž„æˆçš„,默认串行执行。å‘该 " -"[SceneTreeTween] è¿½åŠ [Tweener] å³å¯åˆ›å»ºåºåˆ—。使用 [Tweener] æ¥åšåŠ¨ç”»å°±å«åšè¡¥" -"间(Tweening)。示例补间åºåˆ—æ˜¯ç±»ä¼¼è¿™æ ·çš„ï¼š\n" +"è¡¥é—´åŠ¨ç”»æ˜¯é€šè¿‡å‘ [SceneTreeTween] å¯¹è±¡ä¸æ·»åŠ [Tweener] åˆ›å»ºçš„ï¼Œæ·»åŠ çš„æ–¹æ³•æœ‰ " +"[method tween_property]ã€[method tween_interval]ã€[method tween_callback]ã€" +"[method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"这个åºåˆ—会让 [code]$Sprite[/code] å˜çº¢ï¼Œç„¶åŽç¼©å°ï¼Œæœ€åŽè°ƒç”¨ [method Node." -"queue_free] æ¥ç§»é™¤ç²¾çµã€‚更多用法信æ¯è¯·å‚阅 [method tween_property]ã€[method " -"tween_interval]ã€[method tween_callback]ã€[method tween_method] 方法。\n" +"这个åºåˆ—会让 [code]$Sprite[/code] å˜çº¢ï¼Œç„¶åŽç¼©å°ï¼Œæœ€åŽå†è°ƒç”¨ [method Node." +"queue_free] æ¥é‡Šæ”¾è¯¥ç²¾çµã€‚[Tweener] 默认是一个接一个执行的。这个行为å¯ä»¥é€šè¿‡ " +"[method parallel] å’Œ [method set_parallel] 更改。\n" "使用 [code]tween_*[/code] 方法创建 [Tweener] åŽï¼Œå¯ä»¥ä½¿ç”¨é“¾å¼æ–¹æ³•调用æ¥è°ƒæ•´" "该 [Tweener] çš„å±žæ€§ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ æƒ³è¦åœ¨ä¸Šé¢çš„例åä¸è®¾ç½®ä¸åŒçš„è¿‡æ¸¡ç±»åž‹ï¼Œé‚£ä¹ˆä½ " -"å¯ä»¥ï¼š\n" +"å¯ä»¥ä½¿ç”¨ [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -68566,8 +68675,9 @@ msgstr "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"[SceneTreeTween] 的大部分方法都å¯ä»¥ç”¨è¿™ç§æ–¹æ³•进行链å¼è°ƒç”¨ã€‚在这个示例ä¸ï¼Œæˆ‘们" -"对该 [SceneTreeTween] 进行了绑定,并设置了默认的过渡:\n" +"[SceneTreeTween] 的大部分方法都å¯ä»¥ç”¨è¿™ç§æ–¹æ³•进行链å¼è°ƒç”¨ã€‚在下é¢çš„示例ä¸ï¼Œæˆ‘" +"们将该 [SceneTreeTween] 绑定到了执行脚本的节点,并为其 [Tweener] 设置了默认的" +"过渡:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -68579,7 +68689,7 @@ msgstr "" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "上é¢çš„示例ä¸ï¼Œè¯¥èŠ‚ç‚¹çš„æ‰€æœ‰åèŠ‚ç‚¹éƒ½ä¼šä¾æ¬¡è¢«ç§»åŠ¨åˆ° (0, 0)。\n" "一些 [Tweener] 会用到过渡和缓动。å‰è€…æŽ¥å— [enum Tween.TransitionType] 常é‡ï¼Œ" @@ -68633,7 +68743,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " "seconds. This is mostly useful for manual control when the [SceneTreeTween] " @@ -68648,14 +68757,14 @@ msgid "" msgstr "" "使用给定的增é‡ç§’æ•° [code]delta[/code] 处ç†è¯¥ [SceneTreeTween]。最常è§çš„用法是" "在该 [SceneTreeTween] æš‚åœæ—¶å¯¹å…¶è¿›è¡Œæ‰‹åŠ¨æŽ§åˆ¶ã€‚ä¹Ÿå¯ç”¨äºŽç«‹å³åœæ¢è¯¥ " -"[SceneTreeTween] 的动画,使用比完整长度更大的 [code]delta[/code] å³å¯ã€‚\n" +"[SceneTreeTween] 的动画,将 [code]delta[/code] 设得比完整长度更大å³å¯ã€‚\n" "如果该 [SceneTreeTween] ä»ç„¶æœ‰æœªå®Œæˆçš„ [Tweener],则返回 [code]true[/" "code]。\n" -"[b]注æ„:[/b]该 [SceneTreeTween] 在完æˆåŽä¼šå¤±æ•ˆï¼Œä½†ä½ å¯ä»¥åœ¨ step åŽè°ƒç”¨ " -"[method stop] 将其ä¿ç•™å¹¶é‡ç½®ã€‚" +"[b]注æ„:[/b]该 [SceneTreeTween] 完æˆåŠ¨ç”»åŽï¼Œä¼šåœ¨ä¸‹ä¸€ä¸ªå¤„ç†å¸§ä¸å¤±æ•ˆã€‚ä½ å¯ä»¥åœ¨" +"执行 [method custom_step] åŽè°ƒç”¨ [method stop] 将该 [SceneTreeTween] ä¿ç•™å¹¶é‡" +"置。" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." "e. the time since it started, not counting pauses etc.). The time is " @@ -68716,13 +68825,14 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" "返回该 [SceneTreeTween] æ˜¯å¦æœ‰æ•ˆã€‚有效的 [SceneTreeTween] æ˜¯ç”±åœºæ™¯æ ‘åŒ…å«çš„ " "[SceneTreeTween]ï¼ˆå³ [method SceneTree.get_processed_tweens] 返回的数组ä¸åŒ…å«" "这个 [SceneTreeTween])。[SceneTreeTween] 失效的情况有:补间完æˆã€è¢«é”€æ¯ã€ä½¿" -"用 [code]Tween.new()[/code] åˆ›å»ºã€‚æ— æ•ˆçš„ [SceneTreeTween] ä¸èƒ½è¿½åŠ " -"[Tweener]ï¼Œå› ä¸ºæ— æ³•è¿›è¡ŒåŠ¨ç”»ã€‚ä¸è¿‡ [method interpolate_value] 还是å¯ä»¥ä½¿ç”¨çš„。" +"用 [code]SceneTreeTween.new()[/code] åˆ›å»ºã€‚æ— æ•ˆçš„ [SceneTreeTween] ä¸èƒ½è¿½åŠ " +"[Tweener]。" #: doc/classes/SceneTreeTween.xml msgid "Aborts all tweening operations and invalidates the [SceneTreeTween]." @@ -68773,24 +68883,25 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" "è¿™åªè¯¥è¡¥é—´åºåˆ—çš„é‡å¤æ¬¡æ•°ï¼Œå³ [code]set_loops(2)[/code] 会让动画执行两次。\n" "调用这个方法时如果ä¸å¸¦å‚数,那么该 [SceneTreeTween] ä¼šæ— é™æ‰§è¡Œï¼Œç›´åˆ°è¢« " -"[method kill] 销æ¯ã€ç»‘å®šèŠ‚ç‚¹è¢«é‡Šæ”¾ã€æˆ–è€…æ‰€æœ‰è¿›è¡ŒåŠ¨ç”»çš„å¯¹è±¡éƒ½è¢«é‡Šæ”¾ï¼ˆæ— æ³•å†è¿›" -"行任何动画)。\n" -"[b]è¦å‘Šï¼š[/b]ä½¿ç”¨æ— é™å¾ªçŽ¯æ—¶è¯·ä¸€å®šè¦åŠ å…¥ä¸€äº›æ—¶é•¿/延迟。0 时长的循环动画(例如" -"å•个ä¸å¸¦å»¶è¿Ÿçš„ [CallbackTweener] æˆ–è€…èŠ‚ç‚¹æ— æ•ˆçš„ [PropertyTweener]ï¼‰å’Œæ— é™ " -"[code]while[/code] å¾ªçŽ¯æ˜¯ä¸€æ ·çš„ï¼Œä¼šå¯¼è‡´æ¸¸æˆå†»ç»“。如果 [SceneTreeTween] 的生命" -"期ä¾èµ–于æŸä¸ªèŠ‚ç‚¹ï¼Œè¯·ä¸€å®šä½¿ç”¨ [method bind_node]。" +"[method kill] 销æ¯ã€è¯¥ [SceneTreeTween] ç»‘å®šçš„èŠ‚ç‚¹è¢«é‡Šæ”¾ã€æˆ–者所有进行动画的" +"å¯¹è±¡éƒ½è¢«é‡Šæ”¾ï¼ˆæ— æ³•å†è¿›è¡Œä»»ä½•动画)。\n" +"[b]è¦å‘Šï¼š[/b]ä½¿ç”¨æ— é™å¾ªçŽ¯æ—¶è¯·ä¸€å®šè¦åŠ å…¥ä¸€äº›æ—¶é•¿/å»¶è¿Ÿã€‚ä¸ºäº†é˜²æ¢æ¸¸æˆå†»ç»“,0 æ—¶" +"长的循环动画(例如å•个ä¸å¸¦å»¶è¿Ÿçš„ [CallbackTweener])会在循环若干次åŽåœæ¢ï¼Œé€ " +"æˆå‡ºä¹Žé¢„料的结果。如果 [SceneTreeTween] 的生命期ä¾èµ–于æŸä¸ªèŠ‚ç‚¹ï¼Œè¯·ä¸€å®šä½¿ç”¨ " +"[method bind_node]。" #: doc/classes/SceneTreeTween.xml msgid "" @@ -68874,7 +68985,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " "delays in the tween animation, as an alternative to using the delay in other " @@ -68971,7 +69081,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " @@ -69005,7 +69114,7 @@ msgstr "" "åˆ›å»ºå¹¶è¿½åŠ ä¸€ä¸ª [PropertyTweener]。这个方法会将 [code]object[/code] 对象的 " "[code]property[/code] 属性在åˆå§‹å€¼å’Œæœ€ç»ˆå€¼ [code]final_val[/code] 之间进行补" "间,æŒç»æ—¶é—´ä¸º [code]duration[/code] 秒。åˆå§‹å€¼é»˜è®¤ä¸ºè¯¥ [PropertyTweener] å¯" -"动时的值。例如:\n" +"动时该属性的值。例如:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -69027,7 +69136,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " @@ -69038,12 +69146,11 @@ msgid "" msgstr "" "在该 [SceneTreeTween] å®Œæˆæ‰€æœ‰è¡¥é—´æ—¶è§¦å‘。该 [SceneTreeTween] è¢«è®¾ä¸ºæ— é™å¾ªçޝ" "æ—¶ä¸ä¼šè§¦å‘ï¼ˆè§ [method set_loops])。\n" -"[b]注æ„:[/b]触å‘这个信å·åŽï¼Œè¯¥ [SceneTreeTween] ä¼šè¢«ç§»é™¤ï¼ˆç½®ä¸ºæ— æ•ˆï¼‰ï¼Œä½†ä¸æ˜¯" -"ç«‹å³å‘生的,而是在下一个处ç†å¸§ä¸å‘生。在该信å·çš„回调ä¸è°ƒç”¨ [method stop] 会ä¿" -"留该 [SceneTreeTween]。" +"[b]注æ„:[/b]触å‘这个信å·åŽï¼Œè¯¥ [SceneTreeTween] 会在下一个处ç†å¸§ä¸è¢«ç§»é™¤ï¼ˆç½®" +"ä¸ºæ— æ•ˆï¼‰ã€‚åœ¨è¯¥ä¿¡å·çš„回调ä¸è°ƒç”¨ [method stop] å¯ä»¥é˜²æ¢è¯¥ [SceneTreeTween] 被移" +"除。" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " "loop index. This signal is not emitted after the final loop, use [signal " @@ -69053,7 +69160,6 @@ msgstr "" "会在最åŽä¸€æ¬¡å¾ªçޝåŽè§¦å‘ï¼Œè¿™ç§æƒ…况请使用 [signal finished] 代替。" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " @@ -69733,7 +69839,7 @@ msgstr "" #: doc/classes/Shape2D.xml msgid "The shape's custom solver bias." -msgstr "形状的自定义求解器å差。" +msgstr "形状的自定义求解器å置。" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -70671,11 +70777,37 @@ msgstr "" "视化和编辑手柄。" #: doc/classes/Spatial.xml +#, fuzzy +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" +"å±€éƒ¨å˜æ¢çš„æ—‹è½¬éƒ¨åˆ†ä»¥å¼§åº¦è¡¨ç¤ºï¼Œä»¥ YXZ-Euler 角的形å¼è¡¨ç¤ºï¼ˆX è§’ã€Y è§’ã€Z " +"角)。\n" +"[b]注æ„:[/b]åœ¨æ•°å¦æ„ä¹‰ä¸Šï¼Œæ—‹è½¬æ˜¯ä¸€ä¸ªçŸ©é˜µè€Œä¸æ˜¯ä¸€ä¸ªå‘é‡ã€‚这三个欧拉角是旋转矩" +"é˜µæ¬§æ‹‰è§’å‚æ•°åŒ–çš„ä¸‰ä¸ªç‹¬ç«‹å‚æ•°ï¼Œå˜å‚¨åœ¨ [Vector3] æ•°æ®ç»“æž„ä¸å¹¶ä¸æ˜¯å› 为旋转是一个" +"矢é‡ï¼Œè€Œæ˜¯å› 为 [Vector3] æ˜¯ä¸€ç§æ–¹ä¾¿å˜å‚¨ 3 个浮点数的数æ®ç»“æž„ã€‚å› æ¤ï¼Œå¯¹æ—‹è½¬â€œå‘" +"é‡â€åº”用仿射æ“作是没有æ„义的。" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "æ¤èŠ‚ç‚¹çš„ä¸–ç•Œç©ºé—´ï¼ˆå…¨å±€ï¼‰[Transform]。" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -73660,6 +73792,29 @@ msgid "" "\"Godot\"]]))\n" "[/codeblock]" msgstr "" +"æ ¼å¼åŒ–å—符串,将所有的 [code]placeholder[/code] 替æ¢ä¸º [code]values[/code] ä¸" +"çš„å…ƒç´ ã€‚\n" +"[code]values[/code] å¯ä»¥æ˜¯ [Dictionary] 或 [Array]。[code]placeholder[/code] " +"ä¸çš„下划线都会事先被替æ¢ä¸ºå¯¹åº”çš„é”®ã€‚æ•°ç»„å…ƒç´ ä½¿ç”¨å…¶ç´¢å¼•å·ä½œä¸ºé”®ã€‚\n" +"[codeblock]\n" +"# 输出:Waiting for Godot 是 Samuel Beckett çš„æˆå‰§ï¼ŒGodot 引擎由æ¤å¾—å。\n" +"var use_array_values = \"Waiting for {0} 是 {1} çš„æˆå‰§ï¼Œ{0} 引擎由æ¤å¾—" +"å。\"\n" +"print(use_array_values.format([\"Godot\", \"Samuel Beckett\"]))\n" +"\n" +"# 输出:第 42 å·ç”¨æˆ·æ˜¯ Godot。\n" +"print(\"第 {id} å·ç”¨æˆ·æ˜¯ {name}。\".format({\"id\": 42, \"name\": " +"\"Godot\"}))\n" +"[/codeblock]\n" +"[code]values[/code] 为数组时还会进行一些é¢å¤–的处ç†ã€‚如果 [code]placeholder[/" +"code] ä¸ä¸åŒ…å«ä¸‹åˆ’线,该数组ä¸çš„å…ƒç´ ä¼šä¾æ¬¡å¯¹å‡ºçŽ°çš„å ä½ç¬¦è¿›è¡Œæ›¿æ¢ï¼›å¦‚果数组元" +"ç´ æ˜¯ä¸€ä¸ªåŒ…å«ä¸¤ä¸ªå…ƒç´ 的数组,那么它就会被解释为键值对。\n" +"[codeblock]\n" +"# 输出:第 42 å·ç”¨æˆ·æ˜¯ Godot。\n" +"print(\"第 {} å·ç”¨æˆ·æ˜¯ {}。\".format([42, \"Godot\"], \"{}\"))\n" +"print(\"第 {id} å·ç”¨æˆ·æ˜¯ {name}。\".format([[\"id\", 42], [\"name\", " +"\"Godot\"]]))\n" +"[/codeblock]" #: doc/classes/String.xml msgid "If the string is a valid file path, returns the base directory name." @@ -73924,7 +74079,6 @@ msgstr "" "[/codeblock]" #: doc/classes/String.xml -#, fuzzy msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" @@ -73937,11 +74091,11 @@ msgid "" msgstr "" "如果该å—ç¬¦ä¸²åŒ…å«æœ‰æ•ˆçš„æ•´æ•°ï¼Œåˆ™è¿”回 [code]true[/code]\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # 输出“Trueâ€\n" -"print(\"14.6\".is_valid_int()) # 输出“Falseâ€\n" -"print(\"L\".is_valid_int()) # 输出“Falseâ€\n" -"print(\"+3\".is_valid_int()) # 输出“Trueâ€\n" -"print(\"-12\".is_valid_int()) # 输出“Trueâ€\n" +"print(\"7\".is_valid_integer()) # 输出“Trueâ€\n" +"print(\"14.6\".is_valid_integer()) # 输出“Falseâ€\n" +"print(\"L\".is_valid_integer()) # 输出“Falseâ€\n" +"print(\"+3\".is_valid_integer()) # 输出“Trueâ€\n" +"print(\"-12\".is_valid_integer()) # 输出“Trueâ€\n" "[/codeblock]" #: doc/classes/String.xml @@ -74483,6 +74637,10 @@ msgid "" "directly from creating a canvas item in the [VisualServer] with [method " "VisualServer.canvas_item_create]." msgstr "" +"使用由给定的 [RID] æ ‡è¯†çš„ç”»å¸ƒé¡¹ç»˜åˆ¶è¿™ä¸ªæ ·å¼ç›’。\n" +"[RID] 值既å¯ä»¥é€šè¿‡å¯¹çŽ°æœ‰çš„åŸºäºŽ [CanvasItem] 节点调用 [method CanvasItem." +"get_canvas_item] 获得,也å¯ä»¥é€šè¿‡ [method VisualServer.canvas_item_create] ç›´" +"接在 [VisualServer] 上创建画布项获得。" #: doc/classes/StyleBox.xml msgid "Returns the size of this [StyleBox] without the margins." @@ -76334,9 +76492,8 @@ msgid "If [code]true[/code], a right-click displays the context menu." msgstr "为 [code]true[/code] æ—¶å³é”®å•击会显示上下文èœå•。" #: doc/classes/TextEdit.xml -#, fuzzy msgid "If [code]true[/code], allow drag and drop of selected text." -msgstr "如果为 [code]true[/code],则å¯ä»¥é€‰æ‹©å’Œç¼–辑该值。" +msgstr "如果为 [code]true[/code],则å…许拖放选ä¸çš„æ–‡æœ¬ã€‚" #: doc/classes/TextEdit.xml msgid "" @@ -77018,7 +77175,7 @@ msgid "" msgstr "" "是 [Texture3D] å’Œ [TextureArray] 的基类。ä¸èƒ½ç›´æŽ¥ä½¿ç”¨ï¼Œä½†åŒ…å«è®¿é—®å’Œä½¿ç”¨ " "[Texture3D] å’Œ [TextureArray] 的所有必è¦åŠŸèƒ½ã€‚æ•°æ®æ˜¯ä»¥æ¯å±‚为å•ä½è®¾ç½®çš„。对于 " -"[Texture3D],层指定了深度或 Z-index,它们å¯ä»¥è¢«è§†ä¸ºä¸€å †äºŒç»´åˆ‡ç‰‡ã€‚åŒæ ·åœ°ï¼Œå¯¹" +"[Texture3D],层指定了深度或 Z-index,它们å¯ä»¥è¢«è§†ä¸ºä¸€å † 2D åˆ‡ç‰‡ã€‚åŒæ ·åœ°ï¼Œå¯¹" "于 [TextureArray],层指定了数组层。" #: doc/classes/TextureLayered.xml @@ -77065,7 +77222,7 @@ msgstr "" msgid "" "Sets the data for the specified layer. Data takes the form of a 2-" "dimensional [Image] resource." -msgstr "设置指定图层的数æ®ã€‚æ•°æ®çš„形弿˜¯äºŒç»´çš„[Image]资æºã€‚" +msgstr "设置指定图层的数æ®ã€‚æ•°æ®çš„形弿˜¯äºŒç»´çš„ [Image] 资æºã€‚" #: doc/classes/TextureLayered.xml msgid "Returns a dictionary with all the data used by this texture." @@ -78398,7 +78555,7 @@ msgstr "" #: doc/classes/TileMap.xml msgid "The assigned [TileSet]." -msgstr "指定的[TileSet]图å—集。" +msgstr "指定的 [TileSet] 图å—集。" #: doc/classes/TileMap.xml msgid "Emitted when a tilemap setting has changed." @@ -78735,7 +78892,7 @@ msgstr "返回图å—çš„ [enum TileMode]。" #: doc/classes/TileSet.xml msgid "Returns the tile's Z index (drawing layer)." -msgstr "返回图å—çš„Z索引,å³ç»˜åˆ¶å±‚。" +msgstr "返回图å—çš„ Z 索引(绘制层)。" #: doc/classes/TileSet.xml msgid "Sets a light occluder for the tile." @@ -78807,7 +78964,7 @@ msgstr "å¯ç”¨å›¾å—形状上的å•å‘碰撞。" #: doc/classes/TileSet.xml msgid "Sets a [Transform2D] on a tile's shape." -msgstr "在图å—的形状上设置[Transform2D]。" +msgstr "在图å—的形状上设置 [Transform2D]。" #: doc/classes/TileSet.xml msgid "Sets an array of shapes for the tile, enabling collision." @@ -78823,7 +78980,7 @@ msgstr "设置图å—的纹ç†å移。" #: doc/classes/TileSet.xml msgid "Sets the tile's [enum TileMode]." -msgstr "设置图å—çš„[enum TileMode]。" +msgstr "设置图å—çš„ [enum TileMode]。" #: doc/classes/TileSet.xml msgid "Sets the tile's drawing index." @@ -79060,7 +79217,7 @@ msgid "" "[code]name[/code]. The [code]bias[/code] value is the offset from UTC in " "minutes, since not all time zones are multiples of an hour from UTC." msgstr "" -"以å—典的形å¼è¿”å›žå½“å‰æ—¶åŒºï¼ŒåŒ…å«çš„键为:[code]bias[/code](å倚)和 " +"以å—典的形å¼è¿”å›žå½“å‰æ—¶åŒºï¼ŒåŒ…å«çš„键为:[code]bias[/code](å置)和 " "[code]name[/code](å称)。[code]bias[/code] 的值是从 UTC çš„åç§»é‡ï¼Œå•ä½ä¸º" "åˆ†ï¼Œå› ä¸ºå¹¶ä¸æ˜¯æ‰€æœ‰æ—¶åŒºä¸Ž UTC 的时间差都是整数å€å°æ—¶ã€‚" @@ -79431,7 +79588,7 @@ msgid "" msgstr "" "如果为 [code]true[/code],åªè¦æŒ‰ä¸‹çš„æ‰‹æŒ‡è¿›å‡ºæŒ‰é’®ï¼Œå°±ä¼šå‘出 [signal pressed] " "å’Œ[signal released] ]ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" -"[b]注æ„:[/b]è¿™æ˜¯ä¸€ç§ \"pass-by\" çš„æŒ‰åŽ‹æ¨¡å¼ ï¼Œè€Œä¸æ˜¯ \"bypass\"。" +"[b]注æ„:[/b]这是一ç§â€œpass-byâ€çš„æŒ‰åŽ‹æ¨¡å¼ ï¼Œè€Œä¸æ˜¯â€œbypassâ€ã€‚" #: doc/classes/TouchScreenButton.xml msgid "The button's texture for the pressed state." @@ -79888,7 +80045,6 @@ msgid "Control to show a tree of items." msgstr "ä»¥æ ‘çŠ¶å½¢å¼æ˜¾ç¤ºé¡¹ç›®çš„æŽ§ä»¶ã€‚" #: doc/classes/Tree.xml -#, fuzzy msgid "" "This shows a tree of items that can be selected, expanded and collapsed. The " "tree can have multiple columns with custom controls like text editing, " @@ -79925,8 +80081,8 @@ msgid "" msgstr "" "这展示了一个å¯ä»¥é€‰æ‹©ã€å±•开和折å çš„é¡¹ç›®æ ‘ã€‚è¯¥æ ‘å¯ä»¥æœ‰å¤šåˆ—的自定义控件,如文本" "ç¼–è¾‘ã€æŒ‰é’®å’Œå¼¹å‡ºçª—å£ã€‚它对于结构化显示和互动很有用。\n" -"æ ‘é€šè¿‡ä»£ç 建立,使用[TreeItem]å¯¹è±¡æ¥æž„建结构。它们有一个å•ç‹¬æ ¹èŠ‚ç‚¹ï¼Œä½†å¦‚æžœæ·»" -"åŠ ä¸€ä¸ªè™šæ‹Ÿçš„éšè—æ ¹èŠ‚ç‚¹ï¼Œå°±å¯ä»¥æ¨¡æ‹Ÿå¤šä¸ªæ ¹ã€‚\n" +"æ ‘é€šè¿‡ä»£ç 建立,使用 [TreeItem] å¯¹è±¡æ¥æž„建结构。它们有一个å•ç‹¬æ ¹èŠ‚ç‚¹ï¼Œä½†å¦‚æžœ" +"æ·»åŠ ä¸€ä¸ªè™šæ‹Ÿçš„éšè—æ ¹èŠ‚ç‚¹ï¼Œå°±å¯ä»¥æ¨¡æ‹Ÿå¤šä¸ªæ ¹ã€‚\n" "[codeblock]\n" "func _ready():\n" " var tree = Tree.new()\n" @@ -79937,9 +80093,17 @@ msgstr "" " var subchild1 = tree.create_item(child1)\n" " subchild1.set_text(0, \"Subchild1\")\n" "[/codeblock]\n" -"è¦é历一个[Tree]对象ä¸çš„æ‰€æœ‰[TreeItem]对象,在通过[method get_root]èŽ·å¾—æ ¹ä¹‹" -"åŽï¼Œä½¿ç”¨[method TreeItem.get_next]å’Œ[method TreeItem.get_children]æ–¹æ³•ã€‚ä½ å¯" -"以对一个[TreeItem]使用[method Object.free]æ¥æŠŠå®ƒä»Ž[Tree]ä¸ç§»é™¤ã€‚" +"è¦é历一个 [Tree] 对象ä¸çš„æ‰€æœ‰ [TreeItem] 对象,在通过 [method get_root] 获得" +"æ ¹ä¹‹åŽï¼Œä½¿ç”¨ [method TreeItem.get_next] å’Œ [method TreeItem.get_children] æ–¹" +"æ³•ã€‚ä½ å¯ä»¥å¯¹ä¸€ä¸ª [TreeItem] 使用 [method Object.free] æ¥æŠŠå®ƒä»Ž [Tree] ä¸ç§»" +"除。\n" +"[b]å¢žé‡æœç´¢ï¼š[/b]与 [ItemList] å’Œ [PopupMenu] 类似,[Tree] 也支æŒåœ¨èšç„¦æŽ§ä»¶æ—¶" +"在列表ä¸è¿›è¡Œæœç´¢ã€‚按下与æŸä¸ªæ¡ç›®åç§°é¦–å—æ¯ä¸€è‡´çš„æŒ‰é”®ï¼Œå°±ä¼šé€‰ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„" +"第一个æ¡ç›®ã€‚在æ¤ä¹‹åŽï¼Œè¿›è¡Œå¢žé‡æœç´¢çš„办法有两ç§ï¼š1)在超时å‰å†æ¬¡æŒ‰ä¸‹åŒä¸€ä¸ªæŒ‰" +"键,选ä¸ä»¥è¯¥å—æ¯å¼€å¤´çš„下一个æ¡ç›®ã€‚2ï¼‰åœ¨è¶…æ—¶å‰æŒ‰ä¸‹å‰©ä½™å—æ¯å¯¹åº”的按键,直接匹é…" +"并选䏿‰€éœ€çš„æ¡ç›®ã€‚è¿™ä¸¤ä¸ªåŠ¨ä½œéƒ½ä¼šåœ¨æœ€åŽä¸€æ¬¡æŒ‰é”®è¶…æ—¶åŽé‡ç½®å›žåˆ—è¡¨é¡¶ç«¯ã€‚ä½ å¯ä»¥é€š" +"过 [member ProjectSettings.gui/timers/incremental_search_max_interval_msec] " +"修改超时时长。" #: doc/classes/Tree.xml msgid "Clears the tree. This removes all items." @@ -80009,7 +80173,7 @@ msgid "" "Returns the rectangle for custom popups. Helper to create custom cell " "controls that display a popup. See [method TreeItem.set_cell_mode]." msgstr "" -"返回自定义弹出窗å£çš„矩形。帮助创建显示弹出å¼çš„自定义å•å…ƒæ ¼æŽ§ä»¶ã€‚å‚阅[method " +"返回自定义弹出窗å£çš„矩形。帮助创建显示弹出å¼çš„自定义å•å…ƒæ ¼æŽ§ä»¶ã€‚è§ [method " "TreeItem.set_cell_mode]。" #: doc/classes/Tree.xml @@ -80022,10 +80186,10 @@ msgid "" "To get the item which the returned drop section is relative to, use [method " "get_item_at_position]." msgstr "" -"返回ä½äºŽ[code]position[/code]的放置部分,如果没有项目,则返回-100。\n" -"在 \"项目上方\"ã€\"项目之上\"å’Œ \"项目下方\"的放置部分将分别返回-1ã€0或1çš„" -"值。请å‚阅[enum DropModeFlags]以了解æ¯ä¸ªæ”¾ç½®éƒ¨åˆ†çš„æè¿°ã€‚\n" -"è¦èŽ·å¾—è¿”å›žçš„æ”¾ç½®éƒ¨åˆ†ç›¸å¯¹é¡¹ï¼Œè¯·ä½¿ç”¨[method get_item_at_position]。" +"返回ä½äºŽ [code]position[/code] 的放置部分,如果没有项目,则返回 -100。\n" +"在“项目上方â€â€œé¡¹ç›®ä¹‹ä¸Šâ€å’Œâ€œé¡¹ç›®ä¸‹æ–¹â€çš„æ”¾ç½®éƒ¨åˆ†å°†åˆ†åˆ«è¿”回 -1ã€0 或 1 的值。请å‚" +"阅 [enum DropModeFlags] 以了解æ¯ä¸ªæ”¾ç½®éƒ¨åˆ†çš„æè¿°ã€‚\n" +"è¦èŽ·å¾—è¿”å›žçš„æ”¾ç½®éƒ¨åˆ†ç›¸å¯¹é¡¹ï¼Œè¯·ä½¿ç”¨ [method get_item_at_position]。" #: doc/classes/Tree.xml msgid "" @@ -82385,7 +82549,7 @@ msgstr "[VBoxContainer] çš„å…ƒç´ ä¹‹é—´çš„åž‚ç›´ç©ºé—´ã€‚" #: doc/classes/Vector2.xml msgid "Vector used for 2D math." -msgstr "用于二维数å¦çš„å‘é‡ã€‚" +msgstr "用于 2D æ•°å¦çš„å‘é‡ã€‚" #: doc/classes/Vector2.xml msgid "" @@ -82995,11 +83159,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -83106,8 +83270,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " @@ -83855,7 +84019,6 @@ msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "阴影图集上第四象é™çš„细分é‡ã€‚" #: doc/classes/Viewport.xml -#, fuzzy msgid "" "The shadow atlas' resolution (used for omni and spot lights). The value will " "be rounded up to the nearest power of 2.\n" @@ -83865,8 +84028,9 @@ msgid "" "manually (typically at least [code]256[/code])." msgstr "" "阴影图集的分辨率(用于全å‘光和èšå…‰ï¼‰ã€‚该值将四èˆäº”入到最接近的 2 的幂。\n" -"[b]注æ„:[/b]如果设置为 0,阴影将ä¸å¯è§ã€‚由于用户创建的视区默认值为 0ï¼Œå› æ¤å¿…" -"须手动将æ¤å€¼è®¾ç½®ä¸ºå¤§äºŽ 0。" +"[b]注æ„:[/b]如果设置为 [code]0[/code],点阴影和方å‘阴影[i]都[/i]å°†ä¸å¯è§ã€‚ç”±" +"于用户创建的视区默认值为 [code]0[/code]ï¼Œå› æ¤å¿…须手动将æ¤å€¼è®¾ç½®ä¸ºå¤§äºŽ " +"[code]0[/code](一般至少是 [code]256[/code])。" #: doc/classes/Viewport.xml msgid "" @@ -83896,7 +84060,7 @@ msgstr "如果为 [code]true[/code],尺寸é‡å†™ä¹Ÿä¼šå½±å“拉伸。" msgid "" "If [code]true[/code], the viewport should render its background as " "transparent." -msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†çª—åº”ä½¿å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" +msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†åŒºåº”ä½¿å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" #: doc/classes/Viewport.xml msgid "" @@ -83905,6 +84069,9 @@ msgid "" "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." msgstr "" +"视区的渲染模å¼ã€‚\n" +"[b]注æ„:[/b]如果设为 [constant USAGE_2D] 或 [constant " +"USAGE_2D_NO_SAMPLING],则å¯ç”¨ [member hdr] ä¸ä¼šç”Ÿæ•ˆï¼Œå› 为 2D 䏿”¯æŒ HDR。" #: doc/classes/Viewport.xml msgid "" @@ -89237,7 +89404,7 @@ msgstr "ç”±å…个é¢ç»„æˆçš„纹ç†ï¼Œå¯ä»¥åœ¨ç€è‰²å™¨ä¸ä½¿ç”¨ [code]vec3[/co #: doc/classes/VisualServer.xml msgid "An array of 2-dimensional textures." -msgstr "一组二维纹ç†ã€‚" +msgstr "二维纹ç†çš„æ•°ç»„。" #: doc/classes/VisualServer.xml msgid "A 3-dimensional texture with width, height, and depth." @@ -89473,17 +89640,17 @@ msgstr "第三次拆分所å ç”¨çš„é˜´å½±å›¾é›†çš„æ¯”ä¾‹ã€‚ç¬¬å››ä¸ªæ‹†åˆ†å æ® msgid "" "Normal bias used to offset shadow lookup by object normal. Can be used to " "fix self-shadowing artifacts." -msgstr "法线å移,用于抵消物体法线的阴影查找。å¯ä»¥ç”¨æ¥ä¿®å¤è‡ªé˜´å½±çš„伪影。" +msgstr "法线å置,用于抵消物体法线的阴影查找。å¯ä»¥ç”¨æ¥ä¿®å¤è‡ªé˜´å½±çš„伪影。" #: doc/classes/VisualServer.xml msgid "Bias the shadow lookup to fix self-shadowing artifacts." -msgstr "对阴影查找进行å移,以修å¤è‡ªæˆ‘阴影的å‡è±¡ã€‚" +msgstr "对阴影查找进行å置,以修å¤è‡ªæˆ‘阴影的å‡è±¡ã€‚" #: doc/classes/VisualServer.xml msgid "" "Increases bias on further splits to fix self-shadowing that only occurs far " "away from the camera." -msgstr "å¢žåŠ å¯¹è¿›ä¸€æ¥åˆ†å‰²çš„å差,以修å¤ä»…在远离相机的地方å‘生的自身阴影。" +msgstr "å¢žåŠ å¯¹è¿›ä¸€æ¥åˆ†å‰²çš„å置,以修å¤ä»…在远离相机的地方å‘生的自身阴影。" #: doc/classes/VisualServer.xml msgid "Represents the size of the [enum LightParam] enum." @@ -89971,7 +90138,7 @@ msgid "" "Use a specified canvas layer as the background. This can be useful for " "instantiating a 2D scene in a 3D world." msgstr "" -"使用一个指定的画布层作为背景。这对在三维世界ä¸å®žä¾‹åŒ–一个二维场景很有用。" +"使用一个指定的画布层作为背景。这对在 3D 世界ä¸å®žä¾‹åŒ–一个 2D 场景很有用。" #: doc/classes/VisualServer.xml msgid "" @@ -93917,7 +94084,7 @@ msgid "" "current and potential collisions. When using multi-threaded physics, access " "is limited to [code]_physics_process(delta)[/code] in the main thread." msgstr "" -"直接访问世界物ç†äºŒç»´ç©ºé—´çжæ€ã€‚用于查询当å‰å’Œæ½œåœ¨çš„ç¢°æ’žã€‚ä½¿ç”¨å¤šçº¿ç¨‹ç‰©ç†æ—¶ï¼Œè®¿" +"ç›´æŽ¥è®¿é—®ä¸–ç•Œç‰©ç† 2D 空间状æ€ã€‚用于查询当å‰å’Œæ½œåœ¨çš„ç¢°æ’žã€‚ä½¿ç”¨å¤šçº¿ç¨‹ç‰©ç†æ—¶ï¼Œè®¿" "问仅é™äºŽä¸»çº¿ç¨‹ä¸çš„ [code]_physics_process(delta)[/code]。" #: doc/classes/World2D.xml diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index 63312338fc..cd8d5c0eb5 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -10080,7 +10080,13 @@ msgid "If [code]true[/code], audio plays when added to scene tree." msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml -msgid "Bus on which this audio is playing." +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer.xml @@ -10245,7 +10251,13 @@ msgid "" msgstr "" #: doc/classes/AudioStreamPlayer3D.xml -msgid "The bus on which this audio is playing." +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." msgstr "" #: doc/classes/AudioStreamPlayer3D.xml @@ -28566,13 +28578,14 @@ msgstr "" #: doc/classes/HTTPRequest.xml msgid "" -"If set to a value greater than [code]0.0[/code], the HTTP request will time " -"out after [code]timeout[/code] seconds have passed and the request is not " -"[i]completed[/i] yet. For small HTTP requests such as REST API usage, set " -"[member timeout] to a value greater than [code]0.0[/code] to prevent the " -"application from getting stuck if the request fails to get a response in a " -"timely manner. For file downloads, leave this to [code]0.0[/code] to prevent " -"the download from failing if it takes too much time." +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." msgstr "" #: doc/classes/HTTPRequest.xml @@ -29988,9 +30001,9 @@ msgid "" "freehand lines is required, input accumulation should generally be disabled " "while the user is drawing the line to get results that closely follow the " "actual input.\n" -"[b]Note:[/b] Input accumulation is [i]disabled[/i] by default for backward " -"compatibility reasons. It is however recommended to enable it for games " -"which don't require very reactive input, as this will decrease CPU usage." +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." msgstr "" #: doc/classes/Input.xml @@ -30564,10 +30577,13 @@ msgstr "" msgid "" "Contains mouse and pen motion information. Supports relative, absolute " "positions and speed. See [method Node._input].\n" -"[b]Note:[/b] By default, this event can be emitted multiple times per frame " -"rendered, allowing for precise input reporting, at the expense of CPU usage. " -"You can set [member Input.use_accumulated_input] to [code]true[/code] to let " -"multiple events merge into a single emitted event per frame.\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" "[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " "implementing [url=https://en.wikipedia.org/wiki/" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " @@ -30580,6 +30596,12 @@ msgstr "" #: doc/classes/InputEventMouseMotion.xml msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" "Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" "code] to [code]1.0[/code]." msgstr "" @@ -45518,6 +45540,13 @@ msgstr "" msgid "Changes the byte at the given index." msgstr "" +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + #: doc/classes/PoolByteArray.xml msgid "" "Returns the slice of the [PoolByteArray] between indices (inclusive) as a " @@ -54447,7 +54476,8 @@ msgid "" "SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " "[SceneTreeTween] might become invalid when it has finished tweening, is " "killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " -"[SceneTreeTween]s can't have [Tweener]s appended." +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54487,15 +54517,16 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [Tween] run infinitely, " -"until either it is killed with [method kill], the [Tween]'s bound node is " -"freed, or all the animated objects have been freed (which makes further " -"animation impossible).\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " "infinite loops. To prevent the game freezing, 0-duration looped animations " "(e.g. a single [CallbackTweener] with no delay) are stopped after a small " -"number of loops, which may produce unexpected results. If a [Tween]'s " -"lifetime depends on some node, always use [method bind_node]." +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55972,11 +56003,30 @@ msgid "" msgstr "" #: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml msgid "World space (global) [Transform] of this node." msgstr "" #: doc/classes/Spatial.xml msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" "[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " @@ -66021,11 +66071,11 @@ msgstr "" #: doc/classes/VehicleBody.xml msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " -"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.\n" +"sped 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " "you will need to add logic for this if you wish to simulate gears.\n" "A negative value will result in the vehicle reversing." @@ -66105,8 +66155,8 @@ msgstr "" #: doc/classes/VehicleWheel.xml msgid "" -"Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is 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.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 989d0de496..eee303a2ca 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1313,10 +1313,10 @@ void RasterizerSceneGLES3::camera_effects_set_dof_blur(RID p_camera_effects, boo void RasterizerSceneGLES3::camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) { } -void RasterizerSceneGLES3::shadows_quality_set(RS::ShadowQuality p_quality) { +void RasterizerSceneGLES3::positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { } -void RasterizerSceneGLES3::directional_shadow_quality_set(RS::ShadowQuality p_quality) { +void RasterizerSceneGLES3::directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { } RID RasterizerSceneGLES3::light_instance_create(RID p_light) { diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 53b76011fe..4222743cec 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -855,8 +855,8 @@ public: void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) override; void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) override; - void shadows_quality_set(RS::ShadowQuality p_quality) override; - void directional_shadow_quality_set(RS::ShadowQuality p_quality) override; + void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; + void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; RID light_instance_create(RID p_light) override; void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override; diff --git a/drivers/gles3/storage/texture_storage.h b/drivers/gles3/storage/texture_storage.h index de887f9184..b5d5641086 100644 --- a/drivers/gles3/storage/texture_storage.h +++ b/drivers/gles3/storage/texture_storage.h @@ -546,6 +546,16 @@ public: void render_target_copy_to_back_buffer(RID p_render_target, const Rect2i &p_region, bool p_gen_mipmaps); void render_target_clear_back_buffer(RID p_render_target, const Rect2i &p_region, const Color &p_color); void render_target_gen_back_buffer_mipmaps(RID p_render_target, const Rect2i &p_region); + virtual void render_target_set_vrs_mode(RID p_render_target, RS::ViewportVRSMode p_mode) override{}; + virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override{}; + + void bind_framebuffer(GLuint framebuffer) { + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + } + + void bind_framebuffer_system() { + glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo); + } String get_framebuffer_error(GLenum p_status); }; diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 54f80cfc76..739d51a2c9 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -107,7 +107,7 @@ RenderingDeviceVulkan::Buffer *RenderingDeviceVulkan::_get_buffer_from_owner(RID return buffer; } -static void update_external_dependency_for_store(VkSubpassDependency &dependency, bool is_sampled, bool is_storage, bool is_depth) { +static void update_external_dependency_for_store(VkSubpassDependency2KHR &dependency, bool is_sampled, bool is_storage, bool is_depth) { // Transitioning from write to read, protect the shaders that may use this next // Allow for copies/image layout transitions dependency.dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; @@ -1759,6 +1759,10 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T image_create_info.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; } + if (p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) { + image_create_info.usage |= VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR; + } + if (p_format.usage_bits & TEXTURE_USAGE_CAN_UPDATE_BIT) { image_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; } @@ -3363,17 +3367,24 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; // From Section 7.1 of Vulkan API Spec v1.1.148 + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | // From Section 7.1 of Vulkan API Spec v1.1.148 + VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR; VkPipelineStageFlags reading_stages = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT; - VkSubpassDependency dependencies[2] = { { VK_SUBPASS_EXTERNAL, 0, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 0, default_access_mask, 0 }, - { 0, VK_SUBPASS_EXTERNAL, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, default_access_mask, 0, 0 } }; - VkSubpassDependency &dependency_from_external = dependencies[0]; - VkSubpassDependency &dependency_to_external = dependencies[1]; + VkSubpassDependency2KHR dependencies[2] = { + { VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, nullptr, VK_SUBPASS_EXTERNAL, 0, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 0, default_access_mask, 0, 0 }, + { VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, nullptr, 0, VK_SUBPASS_EXTERNAL, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, default_access_mask, 0, 0, 0 } + }; + VkSubpassDependency2KHR &dependency_from_external = dependencies[0]; + VkSubpassDependency2KHR &dependency_to_external = dependencies[1]; LocalVector<int32_t> attachment_last_pass; attachment_last_pass.resize(p_attachments.size()); - Vector<VkAttachmentDescription> attachments; + // These are only used if we use multiview but we need to define them in scope. + const uint32_t view_mask = (1 << p_view_count) - 1; + const uint32_t correlation_mask = (1 << p_view_count) - 1; + + Vector<VkAttachmentDescription2KHR> attachments; Vector<int> attachment_remap; for (int i = 0; i < p_attachments.size(); i++) { @@ -3384,10 +3395,12 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF ERR_FAIL_INDEX_V(p_attachments[i].format, DATA_FORMAT_MAX, VK_NULL_HANDLE); ERR_FAIL_INDEX_V(p_attachments[i].samples, TEXTURE_SAMPLES_MAX, VK_NULL_HANDLE); - ERR_FAIL_COND_V_MSG(!(p_attachments[i].usage_flags & (TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | TEXTURE_USAGE_INPUT_ATTACHMENT_BIT)), + ERR_FAIL_COND_V_MSG(!(p_attachments[i].usage_flags & (TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | TEXTURE_USAGE_INPUT_ATTACHMENT_BIT | TEXTURE_USAGE_VRS_ATTACHMENT_BIT)), VK_NULL_HANDLE, "Texture format for index (" + itos(i) + ") requires an attachment (color, depth, input or stencil) bit set."); - VkAttachmentDescription description = {}; + VkAttachmentDescription2KHR description = {}; + description.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR; + description.pNext = nullptr; description.flags = 0; description.format = vulkan_formats[p_attachments[i].format]; description.samples = rasterization_sample_count[p_attachments[i].samples]; @@ -3396,83 +3409,95 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF bool is_storage = p_attachments[i].usage_flags & TEXTURE_USAGE_STORAGE_BIT; bool is_depth = p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - // For each UNDEFINED, assume the prior use was a *read*, as we'd be discarding the output of a write - // Also, each UNDEFINED will do an immediate layout transition (write), s.t. we must ensure execution synchronization vs. - // the read. If this is a performance issue, one could track the actual last accessor of each resource, adding only that - // stage - - switch (is_depth ? p_initial_depth_action : p_initial_action) { - case INITIAL_ACTION_CLEAR_REGION: - case INITIAL_ACTION_CLEAR: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - dependency_from_external.srcStageMask |= reading_stages; - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - dependency_from_external.srcStageMask |= reading_stages; - } - } break; - case INITIAL_ACTION_KEEP: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - dependency_from_external.srcStageMask |= reading_stages; - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - dependency_from_external.srcStageMask |= reading_stages; - } - } break; - case INITIAL_ACTION_DROP: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - dependency_from_external.srcStageMask |= reading_stages; - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - dependency_from_external.srcStageMask |= reading_stages; - } - } break; - case INITIAL_ACTION_CLEAR_REGION_CONTINUE: - case INITIAL_ACTION_CONTINUE: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - description.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - description.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - dependency_from_external.srcStageMask |= reading_stages; + // We can setup a framebuffer where we write to our VRS texture to set it up. + // We make the assumption here that if our texture is actually used as our VRS attachment, + // it is used as such for each subpass. This is fairly certain seeing the restrictions on subpasses. + bool is_vrs = p_attachments[i].usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT && i == p_passes[0].vrs_attachment; + + if (is_vrs) { + // For VRS we only read, there is no writing to this texture + description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + description.initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + } else { + // For each UNDEFINED, assume the prior use was a *read*, as we'd be discarding the output of a write + // Also, each UNDEFINED will do an immediate layout transition (write), s.t. we must ensure execution synchronization vs. + // the read. If this is a performance issue, one could track the actual last accessor of each resource, adding only that + // stage + + switch (is_depth ? p_initial_depth_action : p_initial_action) { + case INITIAL_ACTION_CLEAR_REGION: + case INITIAL_ACTION_CLEAR: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + dependency_from_external.srcStageMask |= reading_stages; + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + dependency_from_external.srcStageMask |= reading_stages; + } + } break; + case INITIAL_ACTION_KEEP: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + dependency_from_external.srcStageMask |= reading_stages; + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + dependency_from_external.srcStageMask |= reading_stages; + } + } break; + case INITIAL_ACTION_DROP: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + dependency_from_external.srcStageMask |= reading_stages; + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + dependency_from_external.srcStageMask |= reading_stages; + } + } break; + case INITIAL_ACTION_CLEAR_REGION_CONTINUE: + case INITIAL_ACTION_CONTINUE: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + description.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + description.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + dependency_from_external.srcStageMask |= reading_stages; + } + } break; + default: { + ERR_FAIL_V(VK_NULL_HANDLE); //should never reach here } - } break; - default: { - ERR_FAIL_V(VK_NULL_HANDLE); //should never reach here } } @@ -3486,6 +3511,10 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF if (p_passes[last_pass].depth_attachment == i) { used_last = true; } + } else if (is_vrs) { + if (p_passes[last_pass].vrs_attachment == i) { + used_last = true; + } } else { if (p_passes[last_pass].resolve_attachments.size()) { //if using resolve attachments, check resolve attachments @@ -3527,58 +3556,69 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF } } - switch (is_depth ? final_depth_action : final_action) { - case FINAL_ACTION_READ: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - update_external_dependency_for_store(dependency_to_external, is_sampled, is_storage, false); - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; - description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - update_external_dependency_for_store(dependency_to_external, is_sampled, is_storage, true); - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - // TODO: What does this mean about the next usage (and thus appropriate dependency masks - } - } break; - case FINAL_ACTION_DISCARD: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - } - } break; - case FINAL_ACTION_CONTINUE: { - if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - description.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { - description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; - description.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - } else { - description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there - } + if (is_vrs) { + // We don't change our VRS texture during this process - } break; - default: { - ERR_FAIL_V(VK_NULL_HANDLE); //should never reach here + description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + // TODO do we need to update our external dependency ? + // update_external_dependency_for_store(dependency_to_external, is_sampled, is_storage, false); + } else { + switch (is_depth ? final_depth_action : final_action) { + case FINAL_ACTION_READ: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + update_external_dependency_for_store(dependency_to_external, is_sampled, is_storage, false); + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; + description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + update_external_dependency_for_store(dependency_to_external, is_sampled, is_storage, true); + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + // TODO: What does this mean about the next usage (and thus appropriate dependency masks + } + } break; + case FINAL_ACTION_DISCARD: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + } else { + description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + } + } break; + case FINAL_ACTION_CONTINUE: { + if (p_attachments[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + } else if (p_attachments[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; + description.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + } else { + description.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + description.finalLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + } + + } break; + default: { + ERR_FAIL_V(VK_NULL_HANDLE); //should never reach here + } } } @@ -3587,12 +3627,14 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF attachments.push_back(description); } - LocalVector<VkSubpassDescription> subpasses; - LocalVector<LocalVector<VkAttachmentReference>> color_reference_array; - LocalVector<LocalVector<VkAttachmentReference>> input_reference_array; - LocalVector<LocalVector<VkAttachmentReference>> resolve_reference_array; + LocalVector<VkSubpassDescription2KHR> subpasses; + LocalVector<LocalVector<VkAttachmentReference2KHR>> color_reference_array; + LocalVector<LocalVector<VkAttachmentReference2KHR>> input_reference_array; + LocalVector<LocalVector<VkAttachmentReference2KHR>> resolve_reference_array; LocalVector<LocalVector<uint32_t>> preserve_reference_array; - LocalVector<VkAttachmentReference> depth_reference_array; + LocalVector<VkAttachmentReference2KHR> depth_reference_array; + LocalVector<VkAttachmentReference2KHR> vrs_reference_array; + LocalVector<VkFragmentShadingRateAttachmentInfoKHR> vrs_attachment_info_array; subpasses.resize(p_passes.size()); color_reference_array.resize(p_passes.size()); @@ -3600,20 +3642,25 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF resolve_reference_array.resize(p_passes.size()); preserve_reference_array.resize(p_passes.size()); depth_reference_array.resize(p_passes.size()); + vrs_reference_array.resize(p_passes.size()); + vrs_attachment_info_array.resize(p_passes.size()); - LocalVector<VkSubpassDependency> subpass_dependencies; + LocalVector<VkSubpassDependency2KHR> subpass_dependencies; for (int i = 0; i < p_passes.size(); i++) { const FramebufferPass *pass = &p_passes[i]; - LocalVector<VkAttachmentReference> &color_references = color_reference_array[i]; + LocalVector<VkAttachmentReference2KHR> &color_references = color_reference_array[i]; TextureSamples texture_samples = TEXTURE_SAMPLES_1; bool is_multisample_first = true; + void *subpass_nextptr = nullptr; for (int j = 0; j < pass->color_attachments.size(); j++) { int32_t attachment = pass->color_attachments[j]; - VkAttachmentReference reference; + VkAttachmentReference2KHR reference; + reference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; + reference.pNext = nullptr; if (attachment == FramebufferPass::ATTACHMENT_UNUSED) { reference.attachment = VK_ATTACHMENT_UNUSED; reference.layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -3632,14 +3679,17 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachment_last_pass[attachment] = i; } + reference.aspectMask = 0; color_references.push_back(reference); } - LocalVector<VkAttachmentReference> &input_references = input_reference_array[i]; + LocalVector<VkAttachmentReference2KHR> &input_references = input_reference_array[i]; for (int j = 0; j < pass->input_attachments.size(); j++) { int32_t attachment = pass->input_attachments[j]; - VkAttachmentReference reference; + VkAttachmentReference2KHR reference; + reference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; + reference.pNext = nullptr; if (attachment == FramebufferPass::ATTACHMENT_UNUSED) { reference.attachment = VK_ATTACHMENT_UNUSED; reference.layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -3651,10 +3701,11 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF reference.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; attachment_last_pass[attachment] = i; } + reference.aspectMask = 0; // TODO we need to set this here, possibly VK_IMAGE_ASPECT_COLOR_BIT ?? input_references.push_back(reference); } - LocalVector<VkAttachmentReference> &resolve_references = resolve_reference_array[i]; + LocalVector<VkAttachmentReference2KHR> &resolve_references = resolve_reference_array[i]; if (pass->resolve_attachments.size() > 0) { ERR_FAIL_COND_V_MSG(pass->resolve_attachments.size() != pass->color_attachments.size(), VK_NULL_HANDLE, "The amount of resolve attachments (" + itos(pass->resolve_attachments.size()) + ") must match the number of color attachments (" + itos(pass->color_attachments.size()) + ")."); @@ -3662,7 +3713,9 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF } for (int j = 0; j < pass->resolve_attachments.size(); j++) { int32_t attachment = pass->resolve_attachments[j]; - VkAttachmentReference reference; + VkAttachmentReference2KHR reference; + reference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; + reference.pNext = nullptr; if (attachment == FramebufferPass::ATTACHMENT_UNUSED) { reference.attachment = VK_ATTACHMENT_UNUSED; reference.layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -3677,10 +3730,13 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; attachment_last_pass[attachment] = i; } + reference.aspectMask = 0; resolve_references.push_back(reference); } - VkAttachmentReference &depth_stencil_reference = depth_reference_array[i]; + VkAttachmentReference2KHR &depth_stencil_reference = depth_reference_array[i]; + depth_stencil_reference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; + depth_stencil_reference.pNext = nullptr; if (pass->depth_attachment != FramebufferPass::ATTACHMENT_UNUSED) { int32_t attachment = pass->depth_attachment; @@ -3689,6 +3745,7 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF ERR_FAIL_COND_V_MSG(attachment_last_pass[attachment] == i, VK_NULL_HANDLE, "Invalid framebuffer depth format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), it already was used for something else before in this pass."); depth_stencil_reference.attachment = attachment_remap[attachment]; depth_stencil_reference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + depth_stencil_reference.aspectMask = 0; attachment_last_pass[attachment] = i; if (is_multisample_first) { @@ -3703,6 +3760,32 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF depth_stencil_reference.layout = VK_IMAGE_LAYOUT_UNDEFINED; } + if (context->get_vrs_capabilities().attachment_vrs_supported && pass->vrs_attachment != FramebufferPass::ATTACHMENT_UNUSED) { + int32_t attachment = pass->vrs_attachment; + ERR_FAIL_INDEX_V_MSG(attachment, p_attachments.size(), VK_NULL_HANDLE, "Invalid framebuffer depth format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), depth attachment."); + ERR_FAIL_COND_V_MSG(!(p_attachments[attachment].usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT), VK_NULL_HANDLE, "Invalid framebuffer depth format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), it's marked as vrs, but it's not a vrs attachment."); + ERR_FAIL_COND_V_MSG(attachment_last_pass[attachment] == i, VK_NULL_HANDLE, "Invalid framebuffer vrs attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), it already was used for something else before in this pass."); + + VkAttachmentReference2KHR &vrs_reference = vrs_reference_array[i]; + vrs_reference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; + vrs_reference.pNext = nullptr; + vrs_reference.attachment = attachment_remap[attachment]; + vrs_reference.layout = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR; + vrs_reference.aspectMask = 0; + + Size2i texel_size = context->get_vrs_capabilities().max_texel_size; + + VkFragmentShadingRateAttachmentInfoKHR &vrs_attachment_info = vrs_attachment_info_array[i]; + vrs_attachment_info.sType = VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR; + vrs_attachment_info.pNext = nullptr; + vrs_attachment_info.pFragmentShadingRateAttachment = &vrs_reference; + vrs_attachment_info.shadingRateAttachmentTexelSize = { uint32_t(texel_size.x), uint32_t(texel_size.y) }; + + attachment_last_pass[attachment] = i; + + subpass_nextptr = &vrs_attachment_info; + } + LocalVector<uint32_t> &preserve_references = preserve_reference_array[i]; for (int j = 0; j < pass->preserve_attachments.size(); j++) { @@ -3719,9 +3802,12 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF } } - VkSubpassDescription &subpass = subpasses[i]; + VkSubpassDescription2KHR &subpass = subpasses[i]; + subpass.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR; + subpass.pNext = subpass_nextptr; subpass.flags = 0; subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.viewMask = view_mask; subpass.inputAttachmentCount = input_references.size(); if (input_references.size()) { subpass.pInputAttachments = input_references.ptr(); @@ -3758,7 +3844,9 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF } if (i > 0) { - VkSubpassDependency dependency; + VkSubpassDependency2KHR dependency; + dependency.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR; + dependency.pNext = nullptr; dependency.srcSubpass = i - 1; dependency.dstSubpass = i; dependency.srcStageMask = 0; @@ -3768,6 +3856,7 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + dependency.viewOffset = 0; subpass_dependencies.push_back(dependency); } /* @@ -3785,10 +3874,11 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF */ } - VkRenderPassCreateInfo render_pass_create_info; - render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + VkRenderPassCreateInfo2KHR render_pass_create_info; + render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR; render_pass_create_info.pNext = nullptr; render_pass_create_info.flags = 0; + render_pass_create_info.attachmentCount = attachments.size(); render_pass_create_info.pAttachments = attachments.ptr(); render_pass_create_info.subpassCount = subpasses.size(); @@ -3805,13 +3895,15 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF render_pass_create_info.pDependencies = nullptr; } - // These are only used if we use multiview but we need to define them in scope. - const uint32_t view_mask = (1 << p_view_count) - 1; - const uint32_t correlation_mask = (1 << p_view_count) - 1; + render_pass_create_info.correlatedViewMaskCount = 1; + render_pass_create_info.pCorrelatedViewMasks = &correlation_mask; + Vector<uint32_t> view_masks; VkRenderPassMultiviewCreateInfo render_pass_multiview_create_info; if (p_view_count > 1) { + // this may no longer be needed with the new settings already including this + const VulkanContext::MultiviewCapabilities capabilities = context->get_multiview_capabilities(); // For now this only works with multiview! @@ -3838,8 +3930,8 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF } VkRenderPass render_pass; - VkResult res = vkCreateRenderPass(device, &render_pass_create_info, nullptr, &render_pass); - ERR_FAIL_COND_V_MSG(res, VK_NULL_HANDLE, "vkCreateRenderPass failed with error " + itos(res) + "."); + VkResult res = context->vkCreateRenderPass2KHR(device, &render_pass_create_info, nullptr, &render_pass); + ERR_FAIL_COND_V_MSG(res, VK_NULL_HANDLE, "vkCreateRenderPass2KHR failed with error " + itos(res) + "."); return render_pass; } @@ -3900,7 +3992,9 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_c return E->get(); } - VkSubpassDescription subpass; + VkSubpassDescription2KHR subpass; + subpass.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR; + subpass.pNext = nullptr; subpass.flags = 0; subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass.inputAttachmentCount = 0; //unsupported for now @@ -3912,8 +4006,8 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_c subpass.preserveAttachmentCount = 0; subpass.pPreserveAttachments = nullptr; - VkRenderPassCreateInfo render_pass_create_info; - render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + VkRenderPassCreateInfo2KHR render_pass_create_info; + render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR; render_pass_create_info.pNext = nullptr; render_pass_create_info.flags = 0; render_pass_create_info.attachmentCount = 0; @@ -3924,9 +4018,9 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_c render_pass_create_info.pDependencies = nullptr; VkRenderPass render_pass; - VkResult res = vkCreateRenderPass(device, &render_pass_create_info, nullptr, &render_pass); + VkResult res = context->vkCreateRenderPass2KHR(device, &render_pass_create_info, nullptr, &render_pass); - ERR_FAIL_COND_V_MSG(res, 0, "vkCreateRenderPass for empty fb failed with error " + itos(res) + "."); + ERR_FAIL_COND_V_MSG(res, 0, "vkCreateRenderPass2KHR for empty fb failed with error " + itos(res) + "."); if (render_pass == VK_NULL_HANDLE) { //was likely invalid return INVALID_ID; @@ -3979,6 +4073,8 @@ RID RenderingDeviceVulkan::framebuffer_create(const Vector<RID> &p_texture_attac if (texture && texture->usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { pass.depth_attachment = i; + } else if (texture && texture->usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) { + pass.vrs_attachment = i; } else { pass.color_attachments.push_back(texture ? i : FramebufferPass::ATTACHMENT_UNUSED); } @@ -4009,6 +4105,10 @@ RID RenderingDeviceVulkan::framebuffer_create_multipass(const Vector<RID> &p_tex size.width = texture->width; size.height = texture->height; size_set = true; + } else if (texture->usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) { + // If this is not the first attachement we assume this is used as the VRS attachment + // in this case this texture will be 1/16th the size of the color attachement. + // So we skip the size check } else { ERR_FAIL_COND_V_MSG((uint32_t)size.width != texture->width || (uint32_t)size.height != texture->height, RID(), "All textures in a framebuffer should be the same size."); @@ -6557,11 +6657,28 @@ RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferForma dynamic_state_create_info.dynamicStateCount = dynamic_states.size(); dynamic_state_create_info.pDynamicStates = dynamic_states.ptr(); + void *graphics_pipeline_nextptr = nullptr; + + VkPipelineFragmentShadingRateStateCreateInfoKHR vrs_create_info; + if (context->get_vrs_capabilities().attachment_vrs_supported) { + // If VRS is used, this defines how the different VRS types are combined. + // combinerOps[0] decides how we use the output of pipeline and primitive (drawcall) VRS + // combinerOps[1] decides how we use the output of combinerOps[0] and our attachment VRS + + vrs_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR; + vrs_create_info.pNext = nullptr; + vrs_create_info.fragmentSize = { 4, 4 }; + vrs_create_info.combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // We don't use pipeline/primitive VRS so this really doesn't matter + vrs_create_info.combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR; // always use the outcome of attachment VRS if enabled + + graphics_pipeline_nextptr = &vrs_create_info; + } + //finally, pipeline create info VkGraphicsPipelineCreateInfo graphics_pipeline_create_info; graphics_pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - graphics_pipeline_create_info.pNext = nullptr; + graphics_pipeline_create_info.pNext = graphics_pipeline_nextptr; graphics_pipeline_create_info.flags = 0; Vector<VkPipelineShaderStageCreateInfo> pipeline_stages = shader->pipeline_stages; @@ -6726,7 +6843,7 @@ RID RenderingDeviceVulkan::compute_pipeline_create(RID p_shader, const Vector<Pi const PipelineSpecializationConstant &psc = p_specialization_constants[j]; if (psc.constant_id == sc.constant.constant_id) { ERR_FAIL_COND_V_MSG(psc.type != sc.constant.type, RID(), "Specialization constant provided for id (" + itos(sc.constant.constant_id) + ") is of the wrong type."); - data_ptr[i] = sc.constant.int_value; + data_ptr[i] = psc.int_value; break; } } @@ -6910,8 +7027,10 @@ Error RenderingDeviceVulkan::_draw_list_setup_framebuffer(Framebuffer *p_framebu Texture *texture = texture_owner.get_or_null(p_framebuffer->texture_ids[i]); if (texture) { attachments.push_back(texture->view); - ERR_FAIL_COND_V(texture->width != p_framebuffer->size.width, ERR_BUG); - ERR_FAIL_COND_V(texture->height != p_framebuffer->size.height, ERR_BUG); + if (!(texture->usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT)) { // VRS attachment will be a different size. + ERR_FAIL_COND_V(texture->width != p_framebuffer->size.width, ERR_BUG); + ERR_FAIL_COND_V(texture->height != p_framebuffer->size.height, ERR_BUG); + } } } framebuffer_create_info.attachmentCount = attachments.size(); @@ -7139,7 +7258,10 @@ RenderingDevice::DrawListID RenderingDeviceVulkan::draw_list_begin(RID p_framebu int color_count = 0; for (int i = 0; i < framebuffer->texture_ids.size(); i++) { Texture *texture = texture_owner.get_or_null(framebuffer->texture_ids[i]); - if (!texture || !(texture->usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { + // We only check for our VRS usage bit if this is not the first texture id. + // If it is the first we're likely populating our VRS texture. + // Bit dirty but.. + if (!texture || (!(texture->usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) && !(i != 0 && texture->usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT))) { color_count++; } } @@ -9000,17 +9122,6 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de { device_capabilities.version_major = p_context->get_vulkan_major(); device_capabilities.version_minor = p_context->get_vulkan_minor(); - - // get info about subgroups - VulkanContext::SubgroupCapabilities subgroup_capabilities = p_context->get_subgroup_capabilities(); - device_capabilities.subgroup_size = subgroup_capabilities.size; - device_capabilities.subgroup_in_shaders = subgroup_capabilities.supported_stages_flags_rd(); - device_capabilities.subgroup_operations = subgroup_capabilities.supported_operations_flags_rd(); - - // get info about further features - VulkanContext::MultiviewCapabilities multiview_capabilies = p_context->get_multiview_capabilities(); - device_capabilities.supports_multiview = multiview_capabilies.is_supported && multiview_capabilies.max_view_count > 1; - device_capabilities.supports_fsr_half_float = p_context->get_shader_capabilities().shader_float16_is_supported && p_context->get_storage_buffer_capabilities().storage_buffer_16_bit_access_is_supported; } context = p_context; @@ -9359,7 +9470,7 @@ String RenderingDeviceVulkan::get_captured_timestamp_name(uint32_t p_index) cons return frames[frame].timestamp_result_names[p_index]; } -uint64_t RenderingDeviceVulkan::limit_get(Limit p_limit) { +uint64_t RenderingDeviceVulkan::limit_get(Limit p_limit) const { switch (p_limit) { case LIMIT_MAX_BOUND_UNIFORM_SETS: return limits.maxBoundDescriptorSets; @@ -9429,7 +9540,18 @@ uint64_t RenderingDeviceVulkan::limit_get(Limit p_limit) { return limits.maxComputeWorkGroupSize[1]; case LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z: return limits.maxComputeWorkGroupSize[2]; - + case LIMIT_SUBGROUP_SIZE: { + VulkanContext::SubgroupCapabilities subgroup_capabilities = context->get_subgroup_capabilities(); + return subgroup_capabilities.size; + } + case LIMIT_SUBGROUP_IN_SHADERS: { + VulkanContext::SubgroupCapabilities subgroup_capabilities = context->get_subgroup_capabilities(); + return subgroup_capabilities.supported_stages_flags_rd(); + } + case LIMIT_SUBGROUP_OPERATIONS: { + VulkanContext::SubgroupCapabilities subgroup_capabilities = context->get_subgroup_capabilities(); + return subgroup_capabilities.supported_operations_flags_rd(); + } default: ERR_FAIL_V(0); } @@ -9529,6 +9651,25 @@ RenderingDevice *RenderingDeviceVulkan::create_local_device() { return rd; } +bool RenderingDeviceVulkan::has_feature(const Features p_feature) const { + switch (p_feature) { + case SUPPORTS_MULTIVIEW: { + VulkanContext::MultiviewCapabilities multiview_capabilies = context->get_multiview_capabilities(); + return multiview_capabilies.is_supported && multiview_capabilies.max_view_count > 1; + } break; + case SUPPORTS_FSR_HALF_FLOAT: { + return context->get_shader_capabilities().shader_float16_is_supported && context->get_storage_buffer_capabilities().storage_buffer_16_bit_access_is_supported; + } break; + case SUPPORTS_ATTACHMENT_VRS: { + VulkanContext::VRSCapabilities vrs_capabilities = context->get_vrs_capabilities(); + return vrs_capabilities.attachment_vrs_supported; + } break; + default: { + return false; + } + } +} + RenderingDeviceVulkan::RenderingDeviceVulkan() { device_capabilities.device_family = DEVICE_VULKAN; } diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index ec9e864370..7c8021251f 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -241,6 +241,7 @@ class RenderingDeviceVulkan : public RenderingDevice { Vector<AttachmentFormat> attachments; Vector<FramebufferPass> passes; uint32_t view_count = 1; + bool operator<(const FramebufferFormatKey &p_key) const { if (view_count != p_key.view_count) { return view_count < p_key.view_count; @@ -1203,7 +1204,7 @@ public: /**** Limits ****/ /****************/ - virtual uint64_t limit_get(Limit p_limit); + virtual uint64_t limit_get(Limit p_limit) const; virtual void prepare_screen_for_drawing(); void initialize(VulkanContext *p_context, bool p_local_device = false); @@ -1234,6 +1235,8 @@ public: virtual uint64_t get_driver_resource(DriverResource p_resource, RID p_rid = RID(), uint64_t p_index = 0); + virtual bool has_feature(const Features p_feature) const; + RenderingDeviceVulkan(); ~RenderingDeviceVulkan(); }; diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 2bf173a398..814cec2ec0 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -48,6 +48,18 @@ VulkanHooks *VulkanContext::vulkan_hooks = nullptr; +VkResult VulkanContext::vkCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) { + if (fpCreateRenderPass2KHR == nullptr) { + fpCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vkGetInstanceProcAddr(inst, "vkCreateRenderPass2KHR"); + } + + if (fpCreateRenderPass2KHR == nullptr) { + return VK_ERROR_EXTENSION_NOT_PRESENT; + } else { + return (fpCreateRenderPass2KHR)(device, pCreateInfo, pAllocator, pRenderPass); + } +} + VKAPI_ATTR VkBool32 VKAPI_CALL VulkanContext::_debug_messenger_callback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, @@ -215,13 +227,13 @@ VkBool32 VulkanContext::_check_layers(uint32_t check_count, const char *const *c Error VulkanContext::_get_preferred_validation_layers(uint32_t *count, const char *const **names) { static const LocalVector<LocalVector<const char *>> instance_validation_layers_alt{ - // Preferred set of validation layers + // Preferred set of validation layers. { "VK_LAYER_KHRONOS_validation" }, - // Alternative (deprecated, removed in SDK 1.1.126.0) set of validation layers + // Alternative (deprecated, removed in SDK 1.1.126.0) set of validation layers. { "VK_LAYER_LUNARG_standard_validation" }, - // Alternative (deprecated, removed in SDK 1.1.121.1) set of validation layers + // Alternative (deprecated, removed in SDK 1.1.121.1) set of validation layers. { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_GOOGLE_unique_objects" } }; @@ -269,7 +281,7 @@ typedef VkResult(VKAPI_PTR *_vkEnumerateInstanceVersion)(uint32_t *); Error VulkanContext::_obtain_vulkan_version() { // https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkApplicationInfo.html#_description - // for Vulkan 1.0 vkEnumerateInstanceVersion is not available, including not in the loader we compile against on Android. + // For Vulkan 1.0 vkEnumerateInstanceVersion is not available, including not in the loader we compile against on Android. _vkEnumerateInstanceVersion func = (_vkEnumerateInstanceVersion)vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion"); if (func != nullptr) { uint32_t api_version; @@ -279,15 +291,15 @@ Error VulkanContext::_obtain_vulkan_version() { vulkan_minor = VK_API_VERSION_MINOR(api_version); vulkan_patch = VK_API_VERSION_PATCH(api_version); } else { - // according to the documentation this shouldn't fail with anything except a memory allocation error - // in which case we're in deep trouble anyway + // According to the documentation this shouldn't fail with anything except a memory allocation error + // in which case we're in deep trouble anyway. ERR_FAIL_V(ERR_CANT_CREATE); } } else { print_line("vkEnumerateInstanceVersion not available, assuming Vulkan 1.0."); } - // we don't go above 1.2 + // We don't go above 1.2. if ((vulkan_major > 1) || (vulkan_major == 1 && vulkan_minor > 2)) { vulkan_major = 1; vulkan_minor = 2; @@ -303,7 +315,7 @@ Error VulkanContext::_initialize_extensions() { enabled_extension_count = 0; enabled_debug_utils = false; enabled_debug_report = false; - /* Look for instance extensions */ + // Look for instance extensions. VkBool32 surfaceExtFound = 0; VkBool32 platformSurfaceExtFound = 0; memset(extension_names, 0, sizeof(extension_names)); @@ -403,7 +415,7 @@ String VulkanContext::SubgroupCapabilities::supported_stages_desc() const { res += ", STAGE_COMPUTE"; } - /* these are not defined on Android GRMBL */ + // These are not defined on Android GRMBL. if (supportedStages & 0x00000100 /* VK_SHADER_STAGE_RAYGEN_BIT_KHR */) { res += ", STAGE_RAYGEN_KHR"; } @@ -429,7 +441,7 @@ String VulkanContext::SubgroupCapabilities::supported_stages_desc() const { res += ", STAGE_MESH_NV"; } - return res.substr(2); // remove first ", " + return res.substr(2); // Remove first ", " } uint32_t VulkanContext::SubgroupCapabilities::supported_operations_flags_rd() const { @@ -494,19 +506,22 @@ String VulkanContext::SubgroupCapabilities::supported_operations_desc() const { res += ", FEATURE_PARTITIONED_NV"; } - return res.substr(2); // remove first ", " + return res.substr(2); // Remove first ", " } Error VulkanContext::_check_capabilities() { // https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_multiview.html // https://www.khronos.org/blog/vulkan-subgroup-tutorial - // for Vulkan 1.0 vkGetPhysicalDeviceProperties2 is not available, including not in the loader we compile against on Android. + // For Vulkan 1.0 vkGetPhysicalDeviceProperties2 is not available, including not in the loader we compile against on Android. - // so we check if the functions are accessible by getting their function pointers and skipping if not - // (note that the desktop loader does a better job here but the android loader doesn't) + // So we check if the functions are accessible by getting their function pointers and skipping if not + // (note that the desktop loader does a better job here but the android loader doesn't.) - // assume not supported until proven otherwise + // Assume not supported until proven otherwise. + vrs_capabilities.pipeline_vrs_supported = false; + vrs_capabilities.primitive_vrs_supported = false; + vrs_capabilities.attachment_vrs_supported = false; multiview_capabilities.is_supported = false; multiview_capabilities.geometry_shader_is_supported = false; multiview_capabilities.tessellation_shader_is_supported = false; @@ -523,17 +538,25 @@ Error VulkanContext::_check_capabilities() { storage_buffer_capabilities.storage_push_constant_16_is_supported = false; storage_buffer_capabilities.storage_input_output_16 = false; - // check for extended features + // Check for extended features. PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2_func = (PFN_vkGetPhysicalDeviceFeatures2)vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceFeatures2"); if (vkGetPhysicalDeviceFeatures2_func == nullptr) { - // In Vulkan 1.0 might be accessible under its original extension name + // In Vulkan 1.0 might be accessible under its original extension name. vkGetPhysicalDeviceFeatures2_func = (PFN_vkGetPhysicalDeviceFeatures2)vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceFeatures2KHR"); } if (vkGetPhysicalDeviceFeatures2_func != nullptr) { - // check our extended features + // Check our extended features. + VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = { + /*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, + /*pNext*/ nullptr, + /*pipelineFragmentShadingRate*/ false, + /*primitiveFragmentShadingRate*/ false, + /*attachmentFragmentShadingRate*/ false, + }; + VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = { /*sType*/ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR, - /*pNext*/ nullptr, + /*pNext*/ &vrs_features, /*shaderFloat16*/ false, /*shaderInt8*/ false, }; @@ -561,6 +584,10 @@ Error VulkanContext::_check_capabilities() { vkGetPhysicalDeviceFeatures2_func(gpu, &device_features); + vrs_capabilities.pipeline_vrs_supported = vrs_features.pipelineFragmentShadingRate; + vrs_capabilities.primitive_vrs_supported = vrs_features.primitiveFragmentShadingRate; + vrs_capabilities.attachment_vrs_supported = vrs_features.attachmentFragmentShadingRate; + multiview_capabilities.is_supported = multiview_features.multiview; multiview_capabilities.geometry_shader_is_supported = multiview_features.multiviewGeometryShader; multiview_capabilities.tessellation_shader_is_supported = multiview_features.multiviewTessellationShader; @@ -574,31 +601,40 @@ Error VulkanContext::_check_capabilities() { storage_buffer_capabilities.storage_input_output_16 = storage_feature.storageInputOutput16; } - // check extended properties + // Check extended properties. PFN_vkGetPhysicalDeviceProperties2 device_properties_func = (PFN_vkGetPhysicalDeviceProperties2)vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceProperties2"); if (device_properties_func == nullptr) { - // In Vulkan 1.0 might be accessible under its original extension name + // In Vulkan 1.0 might be accessible under its original extension name. device_properties_func = (PFN_vkGetPhysicalDeviceProperties2)vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceProperties2KHR"); } if (device_properties_func != nullptr) { + VkPhysicalDeviceFragmentShadingRatePropertiesKHR vrsProperties; VkPhysicalDeviceMultiviewProperties multiviewProperties; VkPhysicalDeviceSubgroupProperties subgroupProperties; VkPhysicalDeviceProperties2 physicalDeviceProperties; + void *nextptr = nullptr; subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; - subgroupProperties.pNext = nullptr; - - physicalDeviceProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + subgroupProperties.pNext = nextptr; + nextptr = &subgroupProperties; if (multiview_capabilities.is_supported) { multiviewProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES; - multiviewProperties.pNext = &subgroupProperties; + multiviewProperties.pNext = nextptr; - physicalDeviceProperties.pNext = &multiviewProperties; - } else { - physicalDeviceProperties.pNext = &subgroupProperties; + nextptr = &multiviewProperties; } + if (vrs_capabilities.attachment_vrs_supported) { + vrsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR; + vrsProperties.pNext = nextptr; + + nextptr = &vrsProperties; + } + + physicalDeviceProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + physicalDeviceProperties.pNext = nextptr; + device_properties_func(gpu, &physicalDeviceProperties); subgroup_capabilities.size = subgroupProperties.subgroupSize; @@ -609,6 +645,28 @@ Error VulkanContext::_check_capabilities() { // - supportedOperations has VK_SUBGROUP_FEATURE_QUAD_BIT subgroup_capabilities.quadOperationsInAllStages = subgroupProperties.quadOperationsInAllStages; + if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported) { + print_verbose("- Vulkan Varying Shading Rates supported:"); + if (vrs_capabilities.pipeline_vrs_supported) { + print_verbose(" Pipeline fragment shading rate"); + } + if (vrs_capabilities.primitive_vrs_supported) { + print_verbose(" Primitive fragment shading rate"); + } + if (vrs_capabilities.attachment_vrs_supported) { + // TODO expose these somehow to the end user + vrs_capabilities.min_texel_size.x = vrsProperties.minFragmentShadingRateAttachmentTexelSize.width; + vrs_capabilities.min_texel_size.y = vrsProperties.minFragmentShadingRateAttachmentTexelSize.height; + vrs_capabilities.max_texel_size.x = vrsProperties.maxFragmentShadingRateAttachmentTexelSize.width; + vrs_capabilities.max_texel_size.y = vrsProperties.maxFragmentShadingRateAttachmentTexelSize.height; + + print_verbose(String(" Attachment fragment shading rate") + String(", min texel size: (") + itos(vrs_capabilities.min_texel_size.x) + String(", ") + itos(vrs_capabilities.min_texel_size.y) + String(")") + String(", max texel size: (") + itos(vrs_capabilities.max_texel_size.x) + String(", ") + itos(vrs_capabilities.max_texel_size.y) + String(")")); + } + + } else { + print_verbose("- Vulkan Varying Shading Rates not supported"); + } + if (multiview_capabilities.is_supported) { multiview_capabilities.max_view_count = multiviewProperties.maxMultiviewViewCount; multiview_capabilities.max_instance_count = multiviewProperties.maxMultiviewInstanceIndex; @@ -635,10 +693,10 @@ Error VulkanContext::_check_capabilities() { } Error VulkanContext::_create_instance() { - /* obtain version */ + // Obtain Vulkan version. _obtain_vulkan_version(); - /* initialise extensions */ + // Initialize extensions. { Error err = _initialize_extensions(); if (err != OK) { @@ -726,8 +784,7 @@ Error VulkanContext::_create_instance() { #endif if (enabled_debug_utils) { - // Setup VK_EXT_debug_utils function pointers always (we use them for - // debug labels and names). + // Setup VK_EXT_debug_utils function pointers always (we use them for debug labels and names). CreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(inst, "vkCreateDebugUtilsMessengerEXT"); DestroyDebugUtilsMessengerEXT = @@ -800,7 +857,7 @@ Error VulkanContext::_create_instance() { } Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { - /* Make initial call to query gpu_count, then second call for gpu info*/ + // Make initial call to query gpu_count, then second call for gpu info. uint32_t gpu_count = 0; VkResult err = vkEnumeratePhysicalDevices(inst, &gpu_count, nullptr); ERR_FAIL_COND_V(err, ERR_CANT_CREATE); @@ -836,7 +893,7 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { return ERR_CANT_CREATE; } - // not really needed but nice to print the correct entry + // Not really needed but nice to print the correct entry. for (uint32_t i = 0; i < gpu_count; ++i) { if (physical_devices[i] == gpu) { device_index = i; @@ -948,13 +1005,13 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { free(physical_devices); - /* Look for device extensions */ + // Look for device extensions. uint32_t device_extension_count = 0; VkBool32 swapchainExtFound = 0; enabled_extension_count = 0; memset(extension_names, 0, sizeof(extension_names)); - /* Get identifier properties */ + // Get identifier properties. vkGetPhysicalDeviceProperties(gpu, &gpu_props); device_name = gpu_props.deviceName; @@ -996,9 +1053,16 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { extension_names[enabled_extension_count++] = VK_KHR_SWAPCHAIN_EXTENSION_NAME; } if (!strcmp(VK_KHR_MULTIVIEW_EXTENSION_NAME, device_extensions[i].extensionName)) { - // if multiview is supported, enable it + // If multiview is supported, enable it. extension_names[enabled_extension_count++] = VK_KHR_MULTIVIEW_EXTENSION_NAME; } + if (!strcmp(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, device_extensions[i].extensionName)) { + // if shading rate image is supported, enable it + extension_names[enabled_extension_count++] = VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME; + } + if (!strcmp(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, device_extensions[i].extensionName)) { + extension_names[enabled_extension_count++] = VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME; + } if (enabled_extension_count >= MAX_EXTENSIONS) { free(device_extensions); ERR_FAIL_V_MSG(ERR_BUG, "Enabled extension count reaches MAX_EXTENSIONS, BUG"); @@ -1049,19 +1113,18 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { " extension.\n\nDo you have a compatible Vulkan installable client driver (ICD) installed?\n" "vkCreateInstance Failure"); - /* Call with nullptr data to get count */ + // Call with nullptr data to get count. vkGetPhysicalDeviceQueueFamilyProperties(gpu, &queue_family_count, nullptr); ERR_FAIL_COND_V(queue_family_count == 0, ERR_CANT_CREATE); queue_props = (VkQueueFamilyProperties *)malloc(queue_family_count * sizeof(VkQueueFamilyProperties)); vkGetPhysicalDeviceQueueFamilyProperties(gpu, &queue_family_count, queue_props); - // Query fine-grained feature support for this device. // If app has specific feature requirements it should check supported // features based on this query vkGetPhysicalDeviceFeatures(gpu, &physical_device_features); - physical_device_features.robustBufferAccess = false; //turn off robust buffer access, which can hamper performance on some hardware + physical_device_features.robustBufferAccess = false; // Turn off robust buffer access, which can hamper performance on some hardware. #define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ { \ @@ -1076,7 +1139,7 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) { GET_INSTANCE_PROC_ADDR(inst, GetPhysicalDeviceSurfacePresentModesKHR); GET_INSTANCE_PROC_ADDR(inst, GetSwapchainImagesKHR); - // get info about what our vulkan driver is capable off + // Gets capability info for current Vulkan driver. { Error res = _check_capabilities(); if (res != OK) { @@ -1110,11 +1173,23 @@ Error VulkanContext::_create_device() { }; nextptr = &shader_features; + VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features; + if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported) { + // insert into our chain to enable these features if they are available + vrs_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR; + vrs_features.pNext = nextptr; + vrs_features.pipelineFragmentShadingRate = vrs_capabilities.pipeline_vrs_supported; + vrs_features.primitiveFragmentShadingRate = vrs_capabilities.primitive_vrs_supported; + vrs_features.attachmentFragmentShadingRate = vrs_capabilities.attachment_vrs_supported; + + nextptr = &vrs_features; + } + VkPhysicalDeviceVulkan11Features vulkan11features; VkPhysicalDevice16BitStorageFeaturesKHR storage_feature; VkPhysicalDeviceMultiviewFeatures multiview_features; if (vulkan_major > 1 || vulkan_minor >= 2) { - // In Vulkan 1.2 and newer we use a newer struct to enable various features + // In Vulkan 1.2 and newer we use a newer struct to enable various features. vulkan11features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES; vulkan11features.pNext = nextptr; @@ -1132,7 +1207,7 @@ Error VulkanContext::_create_device() { vulkan11features.shaderDrawParameters = 0; nextptr = &vulkan11features; } else { - // On Vulkan 1.0 and 1.1 we use our older structs to initialise these features + // On Vulkan 1.0 and 1.1 we use our older structs to initialise these features. storage_feature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR; storage_feature.pNext = nextptr; storage_feature.storageBuffer16BitAccess = storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported; @@ -1161,7 +1236,7 @@ Error VulkanContext::_create_device() { /*ppEnabledLayerNames*/ nullptr, /*enabledExtensionCount*/ enabled_extension_count, /*ppEnabledExtensionNames*/ (const char *const *)extension_names, - /*pEnabledFeatures*/ &physical_device_features, // If specific features are required, pass them in here + /*pEnabledFeatures*/ &physical_device_features, // If specific features are required, pass them in here. }; if (separate_present_queue) { queues[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; @@ -1193,7 +1268,7 @@ Error VulkanContext::_initialize_queues(VkSurfaceKHR p_surface) { } // Search for a graphics and a present queue in the array of queue - // families, try to find one that supports both + // families, try to find one that supports both. uint32_t graphicsQueueFamilyIndex = UINT32_MAX; uint32_t presentQueueFamilyIndex = UINT32_MAX; for (uint32_t i = 0; i < queue_family_count; i++) { @@ -1223,7 +1298,7 @@ Error VulkanContext::_initialize_queues(VkSurfaceKHR p_surface) { free(supportsPresent); - // Generate error if could not find both a graphics and a present queue + // Generate error if could not find both a graphics and a present queue. ERR_FAIL_COND_V_MSG(graphicsQueueFamilyIndex == UINT32_MAX || presentQueueFamilyIndex == UINT32_MAX, ERR_CANT_CREATE, "Could not find both graphics and present queues\n"); @@ -1279,7 +1354,7 @@ Error VulkanContext::_initialize_queues(VkSurfaceKHR p_surface) { color_space = surfFormats[0].colorSpace; } else { // These should be ordered with the ones we want to use on top and fallback modes further down - // we want an 32bit RGBA unsigned normalised buffer or similar + // we want a 32bit RGBA unsigned normalised buffer or similar. const VkFormat allowed_formats[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM @@ -1291,7 +1366,7 @@ Error VulkanContext::_initialize_queues(VkSurfaceKHR p_surface) { ERR_FAIL_V_MSG(ERR_CANT_CREATE, "formatCount less than 1"); } - // Find the first format that we support + // Find the first format that we support. format = VK_FORMAT_UNDEFINED; for (uint32_t af = 0; af < allowed_formats_count && format == VK_FORMAT_UNDEFINED; af++) { for (uint32_t sf = 0; sf < formatCount && format == VK_FORMAT_UNDEFINED; sf++) { @@ -1323,7 +1398,7 @@ Error VulkanContext::_create_semaphores() { VkResult err; // Create semaphores to synchronize acquiring presentable buffers before - // rendering and waiting for drawing to be complete before presenting + // rendering and waiting for drawing to be complete before presenting. VkSemaphoreCreateInfo semaphoreCreateInfo = { /*sType*/ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, /*pNext*/ nullptr, @@ -1331,7 +1406,7 @@ Error VulkanContext::_create_semaphores() { }; // Create fences that we can use to throttle if we get too far - // ahead of the image presents + // ahead of the image presents. VkFenceCreateInfo fence_ci = { /*sType*/ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, /*pNext*/ nullptr, @@ -1351,7 +1426,7 @@ Error VulkanContext::_create_semaphores() { } frame_index = 0; - // Get Memory information and properties + // Get Memory information and properties. vkGetPhysicalDeviceMemoryProperties(gpu, &memory_properties); return OK; @@ -1426,7 +1501,7 @@ bool VulkanContext::window_is_valid_swapchain(DisplayServer::WindowID p_window) VkRenderPass VulkanContext::window_get_render_pass(DisplayServer::WindowID p_window) { ERR_FAIL_COND_V(!windows.has(p_window), VK_NULL_HANDLE); Window *w = &windows[p_window]; - //vulkan use of currentbuffer + // Vulkan use of currentbuffer. return w->render_pass; } @@ -1434,7 +1509,7 @@ VkFramebuffer VulkanContext::window_get_framebuffer(DisplayServer::WindowID p_wi ERR_FAIL_COND_V(!windows.has(p_window), VK_NULL_HANDLE); ERR_FAIL_COND_V(!buffers_prepared, VK_NULL_HANDLE); Window *w = &windows[p_window]; - //vulkan use of currentbuffer + // Vulkan use of currentbuffer. if (w->swapchain_image_resources != VK_NULL_HANDLE) { return w->swapchain_image_resources[w->current_buffer].framebuffer; } else { @@ -1459,7 +1534,7 @@ Error VulkanContext::_clean_up_swap_chain(Window *window) { } vkDeviceWaitIdle(device); - //this destroys images associated it seems + // This destroys images associated it seems. fpDestroySwapchainKHR(device, window->swapchain, nullptr); window->swapchain = VK_NULL_HANDLE; vkDestroyRenderPass(device, window->render_pass, nullptr); @@ -1485,7 +1560,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { _clean_up_swap_chain(window); } - // Check the surface capabilities and formats + // Check the surface capabilities and formats. VkSurfaceCapabilitiesKHR surfCapabilities; err = fpGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu, window->surface, &surfCapabilities); ERR_FAIL_COND_V(err, ERR_CANT_CREATE); @@ -1502,7 +1577,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { } VkExtent2D swapchainExtent; - // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF. + // Width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF. if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) { // If the surface size is undefined, the size is set to the size // of the images requested, which must fit within the minimum and @@ -1522,7 +1597,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { swapchainExtent.height = surfCapabilities.maxImageExtent.height; } } else { - // If the surface size is defined, the swap chain size must match + // If the surface size is defined, the swap chain size must match. swapchainExtent = surfCapabilities.currentExtent; window->width = surfCapabilities.currentExtent.width; window->height = surfCapabilities.currentExtent.height; @@ -1530,7 +1605,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { if (window->width == 0 || window->height == 0) { free(presentModes); - //likely window minimized, no swapchain created + // Likely window minimized, no swapchain created. return OK; } // The FIFO present mode is guaranteed by the spec to be supported @@ -1592,7 +1667,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { window->presentMode = requested_present_mode; } else { WARN_PRINT("Requested VSync mode is not available!"); - window->vsync_mode = DisplayServer::VSYNC_ENABLED; //Set to default + window->vsync_mode = DisplayServer::VSYNC_ENABLED; // Set to default. } print_verbose("Using present mode: " + String(string_VkPresentModeKHR(window->presentMode))); @@ -1601,13 +1676,13 @@ Error VulkanContext::_update_swap_chain(Window *window) { // Determine the number of VkImages to use in the swap chain. // Application desires to acquire 3 images at a time for triple - // buffering + // buffering. uint32_t desiredNumOfSwapchainImages = 3; if (desiredNumOfSwapchainImages < surfCapabilities.minImageCount) { desiredNumOfSwapchainImages = surfCapabilities.minImageCount; } // If maxImageCount is 0, we can ask for as many images as we want; - // otherwise we're limited to maxImageCount + // otherwise we're limited to maxImageCount. if ((surfCapabilities.maxImageCount > 0) && (desiredNumOfSwapchainImages > surfCapabilities.maxImageCount)) { // Application must settle for fewer images than desired: desiredNumOfSwapchainImages = surfCapabilities.maxImageCount; @@ -1620,7 +1695,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { preTransform = surfCapabilities.currentTransform; } - // Find a supported composite alpha mode - one of these is guaranteed to be set + // Find a supported composite alpha mode - one of these is guaranteed to be set. VkCompositeAlphaFlagBitsKHR compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[4] = { VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, @@ -1667,7 +1742,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { ERR_FAIL_COND_V(err, ERR_CANT_CREATE); if (swapchainImageCount == 0) { - //assign here for the first time. + // Assign here for the first time. swapchainImageCount = sp_image_count; } else { ERR_FAIL_COND_V(swapchainImageCount != sp_image_count, ERR_BUG); @@ -1725,7 +1800,9 @@ Error VulkanContext::_update_swap_chain(Window *window) { /******** FRAMEBUFFER ************/ { - const VkAttachmentDescription attachment = { + const VkAttachmentDescription2KHR attachment = { + /*sType*/ VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, + /*pNext*/ nullptr, /*flags*/ 0, /*format*/ format, /*samples*/ VK_SAMPLE_COUNT_1_BIT, @@ -1737,14 +1814,20 @@ Error VulkanContext::_update_swap_chain(Window *window) { /*finalLayout*/ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, }; - const VkAttachmentReference color_reference = { + const VkAttachmentReference2KHR color_reference = { + /*sType*/ VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, + /*pNext*/ nullptr, /*attachment*/ 0, /*layout*/ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + /*aspectMask*/ 0, }; - const VkSubpassDescription subpass = { + const VkSubpassDescription2KHR subpass = { + /*sType*/ VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, + /*pNext*/ nullptr, /*flags*/ 0, /*pipelineBindPoint*/ VK_PIPELINE_BIND_POINT_GRAPHICS, + /*viewMask*/ 1, /*inputAttachmentCount*/ 0, /*pInputAttachments*/ nullptr, /*colorAttachmentCount*/ 1, @@ -1754,8 +1837,10 @@ Error VulkanContext::_update_swap_chain(Window *window) { /*preserveAttachmentCount*/ 0, /*pPreserveAttachments*/ nullptr, }; - const VkRenderPassCreateInfo rp_info = { - /*sTyp*/ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + + uint32_t view_masks = 1; + const VkRenderPassCreateInfo2KHR rp_info = { + /*sType*/ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, /*pNext*/ nullptr, /*flags*/ 0, /*attachmentCount*/ 1, @@ -1764,9 +1849,11 @@ Error VulkanContext::_update_swap_chain(Window *window) { /*pSubpasses*/ &subpass, /*dependencyCount*/ 0, /*pDependencies*/ nullptr, + /*correlatedViewMaskCount*/ 1, + /*pCorrelatedViewMasks*/ &view_masks, }; - err = vkCreateRenderPass(device, &rp_info, nullptr, &window->render_pass); + err = vkCreateRenderPass2KHR(device, &rp_info, nullptr, &window->render_pass); ERR_FAIL_COND_V(err, ERR_CANT_CREATE); for (uint32_t i = 0; i < swapchainImageCount; i++) { @@ -1839,7 +1926,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { } } - //reset current buffer + // Reset current buffer. window->current_buffer = 0; return OK; @@ -1874,16 +1961,16 @@ void VulkanContext::append_command_buffer(VkCommandBuffer p_command_buffer) { } void VulkanContext::flush(bool p_flush_setup, bool p_flush_pending) { - // ensure everything else pending is executed + // Ensure everything else pending is executed. vkDeviceWaitIdle(device); - //flush the pending setup buffer + // Flush the pending setup buffer. bool setup_flushable = p_flush_setup && command_buffer_queue[0]; bool pending_flushable = p_flush_pending && command_buffer_count > 1; if (setup_flushable) { - //use a fence to wait for everything done + // Use a fence to wait for everything done. VkSubmitInfo submit_info; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.pNext = nullptr; @@ -1900,7 +1987,7 @@ void VulkanContext::flush(bool p_flush_setup, bool p_flush_pending) { } if (pending_flushable) { - //use a fence to wait for everything done + // Use a fence to wait for everything to finish. VkSubmitInfo submit_info; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; @@ -1928,7 +2015,7 @@ Error VulkanContext::prepare_buffers() { VkResult err; - // Ensure no more than FRAME_LAG renderings are outstanding + // Ensure no more than FRAME_LAG renderings are outstanding. vkWaitForFences(device, 1, &fences[frame_index], VK_TRUE, UINT64_MAX); vkResetFences(device, 1, &fences[frame_index]); @@ -1948,13 +2035,13 @@ Error VulkanContext::prepare_buffers() { w->image_acquired_semaphores[frame_index], VK_NULL_HANDLE, &w->current_buffer); if (err == VK_ERROR_OUT_OF_DATE_KHR) { - // swapchain is out of date (e.g. the window was resized) and + // Swapchain is out of date (e.g. the window was resized) and // must be recreated: print_verbose("Vulkan: Early out of date swapchain, recreating."); - //resize_notify(); + // resize_notify(); _update_swap_chain(w); } else if (err == VK_SUBOPTIMAL_KHR) { - // swapchain is not as optimal as it could be, but the platform's + // Swapchain is not as optimal as it could be, but the platform's // presentation engine will still present the image correctly. print_verbose("Vulkan: Early suboptimal swapchain."); break; @@ -2001,7 +2088,7 @@ Error VulkanContext::swap_buffers() { uint32_t commands_to_submit = 0; if (command_buffer_queue[0] == nullptr) { - //no setup command, but commands to submit, submit from the first and skip command + // No setup command, but commands to submit, submit from the first and skip command. if (command_buffer_count > 1) { commands_ptr = command_buffer_queue.ptr() + 1; commands_to_submit = command_buffer_count - 1; @@ -2044,7 +2131,7 @@ Error VulkanContext::swap_buffers() { if (separate_present_queue) { // If we are using separate queues, change image ownership to the // present queue before presenting, waiting for the draw complete - // semaphore and signalling the ownership released semaphore when finished + // semaphore and signalling the ownership released semaphore when finished. VkFence nullFence = VK_NULL_HANDLE; pipe_stage_flags[0] = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; submit_info.waitSemaphoreCount = 1; @@ -2071,7 +2158,7 @@ Error VulkanContext::swap_buffers() { } // If we are using separate queues, we have to wait for image ownership, - // otherwise wait for draw complete + // otherwise wait for draw complete. VkPresentInfoKHR present = { /*sType*/ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, /*pNext*/ nullptr, @@ -2176,12 +2263,12 @@ Error VulkanContext::swap_buffers() { frame_index %= FRAME_LAG; if (err == VK_ERROR_OUT_OF_DATE_KHR) { - // swapchain is out of date (e.g. the window was resized) and + // Swapchain is out of date (e.g. the window was resized) and // must be recreated: print_verbose("Vulkan: Swapchain is out of date, recreating."); resize_notify(); } else if (err == VK_SUBOPTIMAL_KHR) { - // swapchain is not as optimal as it could be, but the platform's + // Swapchain is not as optimal as it could be, but the platform's // presentation engine will still present the image correctly. print_verbose("Vulkan: Swapchain is suboptimal."); } else { @@ -2226,7 +2313,7 @@ VkPhysicalDeviceLimits VulkanContext::get_device_limits() const { RID VulkanContext::local_device_create() { LocalDevice ld; - { //create device + { // Create device. VkResult err; float queue_priorities[1] = { 0.0 }; VkDeviceQueueCreateInfo queues[2]; @@ -2247,13 +2334,13 @@ RID VulkanContext::local_device_create() { /*ppEnabledLayerNames */ nullptr, /*enabledExtensionCount */ enabled_extension_count, /*ppEnabledExtensionNames */ (const char *const *)extension_names, - /*pEnabledFeatures */ &physical_device_features, // If specific features are required, pass them in here + /*pEnabledFeatures */ &physical_device_features, // If specific features are required, pass them in here. }; err = vkCreateDevice(gpu, &sdevice, nullptr, &ld.device); ERR_FAIL_COND_V(err, RID()); } - { //create graphics queue + { // Create graphics queue. vkGetDeviceQueue(ld.device, graphics_queue_family_index, 0, &ld.queue); } diff --git a/drivers/vulkan/vulkan_context.h b/drivers/vulkan/vulkan_context.h index e96facfacb..b2eb43975f 100644 --- a/drivers/vulkan/vulkan_context.h +++ b/drivers/vulkan/vulkan_context.h @@ -69,6 +69,15 @@ public: uint32_t max_instance_count; }; + struct VRSCapabilities { + bool pipeline_vrs_supported; // We can specify our fragment rate on a pipeline level + bool primitive_vrs_supported; // We can specify our fragment rate on each drawcall + bool attachment_vrs_supported; // We can provide a density map attachment on our framebuffer + + Size2i min_texel_size; + Size2i max_texel_size; + }; + struct ShaderCapabilities { bool shader_float16_is_supported; bool shader_int8_is_supported; @@ -104,6 +113,7 @@ private: uint32_t vulkan_patch = 0; SubgroupCapabilities subgroup_capabilities; MultiviewCapabilities multiview_capabilities; + VRSCapabilities vrs_capabilities; ShaderCapabilities shader_capabilities; StorageBufferCapabilities storage_buffer_capabilities; @@ -206,6 +216,7 @@ private: PFN_vkQueuePresentKHR fpQueuePresentKHR = nullptr; PFN_vkGetRefreshCycleDurationGOOGLE fpGetRefreshCycleDurationGOOGLE = nullptr; PFN_vkGetPastPresentationTimingGOOGLE fpGetPastPresentationTimingGOOGLE = nullptr; + PFN_vkCreateRenderPass2KHR fpCreateRenderPass2KHR = nullptr; VkDebugUtilsMessengerEXT dbg_messenger = VK_NULL_HANDLE; VkDebugReportCallbackEXT dbg_debug_report = VK_NULL_HANDLE; @@ -256,10 +267,14 @@ protected: Error _get_preferred_validation_layers(uint32_t *count, const char *const **names); public: + // Extension calls + VkResult vkCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass); + uint32_t get_vulkan_major() const { return vulkan_major; }; uint32_t get_vulkan_minor() const { return vulkan_minor; }; SubgroupCapabilities get_subgroup_capabilities() const { return subgroup_capabilities; }; MultiviewCapabilities get_multiview_capabilities() const { return multiview_capabilities; }; + VRSCapabilities get_vrs_capabilities() const { return vrs_capabilities; }; ShaderCapabilities get_shader_capabilities() const { return shader_capabilities; }; StorageBufferCapabilities get_storage_buffer_capabilities() const { return storage_buffer_capabilities; }; diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 500a3df127..c5fd393746 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -3696,7 +3696,7 @@ void AnimationTrackEditor::commit_insert_queue() { insert_confirm_bezier->set_visible(all_bezier); insert_confirm_reset->set_visible(reset_allowed); - insert_confirm->get_ok_button()->set_text(TTR("Create")); + insert_confirm->set_ok_button_text(TTR("Create")); insert_confirm->popup_centered(); } else { _insert_track(reset_allowed && EDITOR_GET("editors/animation/default_create_reset_tracks"), all_bezier && EDITOR_GET("editors/animation/default_create_bezier_tracks")); @@ -3725,11 +3725,11 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) { } } -void AnimationTrackEditor::_insert_track(bool p_create_reset, bool p_create_beziers) { +void AnimationTrackEditor::_insert_track(bool p_reset_wanted, bool p_create_beziers) { undo_redo->create_action(TTR("Anim Insert")); Ref<Animation> reset_anim; - if (p_create_reset) { + if (p_reset_wanted) { reset_anim = _create_and_get_reset_animation(); } @@ -3739,7 +3739,7 @@ void AnimationTrackEditor::_insert_track(bool p_create_reset, bool p_create_bezi if (insert_data.front()->get().advance) { advance = true; } - next_tracks = _confirm_insert(insert_data.front()->get(), next_tracks, p_create_reset, reset_anim, p_create_beziers); + next_tracks = _confirm_insert(insert_data.front()->get(), next_tracks, p_reset_wanted, reset_anim, p_create_beziers); insert_data.pop_front(); } @@ -4207,9 +4207,42 @@ static Vector<String> _get_bezier_subindices_for_type(Variant::Type p_type, bool return subindices; } -AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_create_reset, Ref<Animation> p_reset_anim, bool p_create_beziers) { +AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_reset_wanted, Ref<Animation> p_reset_anim, bool p_create_beziers) { bool created = false; - if (p_id.track_idx < 0) { + + bool create_normal_track = p_id.track_idx < 0; + bool create_reset_track = p_reset_wanted && track_type_is_resettable(p_id.type); + + Animation::UpdateMode update_mode = Animation::UPDATE_DISCRETE; + if (create_normal_track || create_reset_track) { + if (p_id.type == Animation::TYPE_VALUE || p_id.type == Animation::TYPE_BEZIER) { + // Hack. + NodePath np; + animation->add_track(p_id.type); + animation->track_set_path(animation->get_track_count() - 1, p_id.path); + PropertyInfo h = _find_hint_for_track(animation->get_track_count() - 1, np); + animation->remove_track(animation->get_track_count() - 1); // Hack. + + if (h.type == Variant::FLOAT || + h.type == Variant::VECTOR2 || + h.type == Variant::RECT2 || + h.type == Variant::VECTOR3 || + h.type == Variant::AABB || + h.type == Variant::QUATERNION || + h.type == Variant::COLOR || + h.type == Variant::PLANE || + h.type == Variant::TRANSFORM2D || + h.type == Variant::TRANSFORM3D) { + update_mode = Animation::UPDATE_CONTINUOUS; + } + + if (h.usage & PROPERTY_USAGE_ANIMATE_AS_TRIGGER) { + update_mode = Animation::UPDATE_TRIGGER; + } + } + } + + if (create_normal_track) { if (p_create_beziers) { bool valid; Vector<String> subindices = _get_bezier_subindices_for_type(p_id.value.get_type(), &valid); @@ -4219,7 +4252,7 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD id.type = Animation::TYPE_BEZIER; id.value = p_id.value.get(subindices[i].substr(1, subindices[i].length())); id.path = String(p_id.path) + subindices[i]; - p_next_tracks = _confirm_insert(id, p_next_tracks, p_create_reset, p_reset_anim, false); + p_next_tracks = _confirm_insert(id, p_next_tracks, p_reset_wanted, p_reset_anim, false); } return p_next_tracks; @@ -4227,37 +4260,6 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } created = true; undo_redo->create_action(TTR("Anim Insert Track & Key")); - Animation::UpdateMode update_mode = Animation::UPDATE_DISCRETE; - - if (p_id.type == Animation::TYPE_VALUE || p_id.type == Animation::TYPE_BEZIER) { - // Wants a new track. - - { - // Hack. - NodePath np; - animation->add_track(p_id.type); - animation->track_set_path(animation->get_track_count() - 1, p_id.path); - PropertyInfo h = _find_hint_for_track(animation->get_track_count() - 1, np); - animation->remove_track(animation->get_track_count() - 1); // Hack. - - if (h.type == Variant::FLOAT || - h.type == Variant::VECTOR2 || - h.type == Variant::RECT2 || - h.type == Variant::VECTOR3 || - h.type == Variant::AABB || - h.type == Variant::QUATERNION || - h.type == Variant::COLOR || - h.type == Variant::PLANE || - h.type == Variant::TRANSFORM2D || - h.type == Variant::TRANSFORM3D) { - update_mode = Animation::UPDATE_CONTINUOUS; - } - - if (h.usage & PROPERTY_USAGE_ANIMATE_AS_TRIGGER) { - update_mode = Animation::UPDATE_TRIGGER; - } - } - } p_id.track_idx = p_next_tracks.normal; @@ -4320,8 +4322,7 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } } - if (p_create_reset && track_type_is_resettable(p_id.type)) { - bool create_reset_track = true; + if (create_reset_track) { Animation *reset_anim = p_reset_anim.ptr(); for (int i = 0; i < reset_anim->get_track_count(); i++) { if (reset_anim->track_get_path(i) == p_id.path) { @@ -4332,6 +4333,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD if (create_reset_track) { undo_redo->add_do_method(reset_anim, "add_track", p_id.type); undo_redo->add_do_method(reset_anim, "track_set_path", p_next_tracks.reset, p_id.path); + if (p_id.type == Animation::TYPE_VALUE) { + undo_redo->add_do_method(reset_anim, "value_track_set_update_mode", p_next_tracks.reset, update_mode); + } undo_redo->add_do_method(reset_anim, "track_insert_key", p_next_tracks.reset, 0.0f, value); undo_redo->add_undo_method(reset_anim, "remove_track", reset_anim->get_track_count()); p_next_tracks.reset++; @@ -6473,7 +6477,7 @@ AnimationTrackEditor::AnimationTrackEditor() { optimize_max_angle->set_step(0.1); optimize_max_angle->set_value(22); - optimize_dialog->get_ok_button()->set_text(TTR("Optimize")); + optimize_dialog->set_ok_button_text(TTR("Optimize")); optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_OPTIMIZE_ANIMATION_CONFIRM)); // @@ -6498,7 +6502,7 @@ AnimationTrackEditor::AnimationTrackEditor() { cleanup_vb->add_child(cleanup_all); cleanup_dialog->set_title(TTR("Clean-Up Animation(s) (NO UNDO!)")); - cleanup_dialog->get_ok_button()->set_text(TTR("Clean-Up")); + cleanup_dialog->set_ok_button_text(TTR("Clean-Up")); cleanup_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM)); @@ -6518,7 +6522,7 @@ AnimationTrackEditor::AnimationTrackEditor() { track_copy_dialog = memnew(ConfirmationDialog); add_child(track_copy_dialog); track_copy_dialog->set_title(TTR("Select Tracks to Copy")); - track_copy_dialog->get_ok_button()->set_text(TTR("Copy")); + track_copy_dialog->set_ok_button_text(TTR("Copy")); VBoxContainer *track_vbox = memnew(VBoxContainer); track_copy_dialog->add_child(track_vbox); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 55c3bd922a..dede2e9bbe 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -375,8 +375,8 @@ class AnimationTrackEditor : public VBoxContainer { reset = p_reset_anim ? p_reset_anim->get_track_count() : 0; } }; - TrackIndices _confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_create_reset, Ref<Animation> p_reset_anim, bool p_create_beziers); - void _insert_track(bool p_create_reset, bool p_create_beziers); + TrackIndices _confirm_insert(InsertData p_id, TrackIndices p_next_tracks, bool p_reset_wanted, Ref<Animation> p_reset_anim, bool p_create_beziers); + void _insert_track(bool p_reset_wanted, bool p_create_beziers); void _root_removed(); diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 50abe8bc36..3a0edf301d 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -332,7 +332,7 @@ void FindReplaceBar::_update_results_count() { if (results_count_to_current > results_count) { results_count_to_current = results_count_to_current - results_count; - } else if (results_count_to_current == 0) { + } else if (results_count_to_current <= 0) { results_count_to_current = results_count; } diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 74fea03fee..ce94edd583 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -494,8 +494,8 @@ ConnectDialog::ConnectDialog() { error = memnew(AcceptDialog); add_child(error); error->set_title(TTR("Cannot connect signal")); - error->get_ok_button()->set_text(TTR("Close")); - get_ok_button()->set_text(TTR("Connect")); + error->set_ok_button_text(TTR("Close")); + set_ok_button_text(TTR("Connect")); } ConnectDialog::~ConnectDialog() { diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 31c169a0fb..c41eeb520a 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -57,10 +57,10 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const St if (p_replace_mode) { set_title(vformat(TTR("Change %s Type"), base_type)); - get_ok_button()->set_text(TTR("Change")); + set_ok_button_text(TTR("Change")); } else { set_title(vformat(TTR("Create New %s"), base_type)); - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); } _load_favorites_and_history(); diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp index 023204b74a..bdab1cfecb 100644 --- a/editor/debugger/editor_debugger_tree.cpp +++ b/editor/debugger/editor_debugger_tree.cpp @@ -258,7 +258,7 @@ void EditorDebuggerTree::_item_menu_id_pressed(int p_option) { ResourceSaver::get_recognized_extensions(sd, &extensions); file_dialog->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file_dialog->add_filter("*." + extensions[i], extensions[i].to_upper()); } file_dialog->popup_file_dialog(); diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 9a1b2b5ff5..aa03b7e252 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -575,7 +575,7 @@ void DependencyRemoveDialog::_bind_methods() { } DependencyRemoveDialog::DependencyRemoveDialog() { - get_ok_button()->set_text(TTR("Remove")); + set_ok_button_text(TTR("Remove")); VBoxContainer *vb = memnew(VBoxContainer); add_child(vb); @@ -641,8 +641,8 @@ DependencyErrorDialog::DependencyErrorDialog() { files->set_v_size_flags(Control::SIZE_EXPAND_FILL); set_min_size(Size2(500, 220) * EDSCALE); - get_ok_button()->set_text(TTR("Open Anyway")); - get_cancel_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Open Anyway")); + set_cancel_button_text(TTR("Close")); text = memnew(Label); vb->add_child(text); @@ -780,7 +780,7 @@ void OrphanResourcesDialog::_bind_methods() { OrphanResourcesDialog::OrphanResourcesDialog() { set_title(TTR("Orphan Resource Explorer")); delete_confirm = memnew(ConfirmationDialog); - get_ok_button()->set_text(TTR("Delete")); + set_ok_button_text(TTR("Delete")); add_child(delete_confirm); dep_edit = memnew(DependencyEditor); add_child(dep_edit); diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp index ef29448854..3d4bee4b4e 100644 --- a/editor/editor_asset_installer.cpp +++ b/editor/editor_asset_installer.cpp @@ -355,7 +355,7 @@ EditorAssetInstaller::EditorAssetInstaller() { error = memnew(AcceptDialog); add_child(error); - get_ok_button()->set_text(TTR("Install")); + set_ok_button_text(TTR("Install")); set_title(TTR("Asset Installer")); set_hide_on_ok(true); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index fd121e73ab..fa365c4368 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -1332,7 +1332,7 @@ EditorAudioBuses::EditorAudioBuses() { List<String> ext; ResourceLoader::get_recognized_extensions_for_type("AudioBusLayout", &ext); for (const String &E : ext) { - file_dialog->add_filter(vformat("*.%s; %s", E, TTR("Audio Bus Layout"))); + file_dialog->add_filter("*." + E, TTR("Audio Bus Layout")); } add_child(file_dialog); file_dialog->connect("file_selected", callable_mp(this, &EditorAudioBuses::_file_dialog_callback)); diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp index 8494991892..4cbc0cf25d 100644 --- a/editor/editor_dir_dialog.cpp +++ b/editor/editor_dir_dialog.cpp @@ -211,5 +211,5 @@ EditorDirDialog::EditorDirDialog() { mkdirerr->set_text(TTR("Could not create folder.")); add_child(mkdirerr); - get_ok_button()->set_text(TTR("Choose")); + set_ok_button_text(TTR("Choose")); } diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index f8fc28c31c..9e2d56b2b9 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -983,7 +983,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() { add_child(new_profile_dialog); new_profile_dialog->connect("confirmed", callable_mp(this, &EditorFeatureProfileManager::_create_new_profile)); new_profile_dialog->register_text_enter(new_profile_name); - new_profile_dialog->get_ok_button()->set_text(TTR("Create")); + new_profile_dialog->set_ok_button_text(TTR("Create")); erase_profile_dialog = memnew(ConfirmationDialog); add_child(erase_profile_dialog); @@ -993,7 +993,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() { import_profiles = memnew(EditorFileDialog); add_child(import_profiles); import_profiles->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES); - import_profiles->add_filter("*.profile; " + TTR("Godot Feature Profile")); + import_profiles->add_filter("*.profile", TTR("Godot Feature Profile")); import_profiles->connect("files_selected", callable_mp(this, &EditorFeatureProfileManager::_import_profiles)); import_profiles->set_title(TTR("Import Profile(s)")); import_profiles->set_access(EditorFileDialog::ACCESS_FILESYSTEM); @@ -1001,7 +1001,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() { export_profile = memnew(EditorFileDialog); add_child(export_profile); export_profile->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); - export_profile->add_filter("*.profile; " + TTR("Godot Feature Profile")); + export_profile->add_filter("*.profile", TTR("Godot Feature Profile")); export_profile->connect("file_selected", callable_mp(this, &EditorFeatureProfileManager::_export_profile)); export_profile->set_title(TTR("Export Profile")); export_profile->set_access(EditorFileDialog::ACCESS_FILESYSTEM); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index af1345b205..9f446ab38f 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -227,10 +227,10 @@ void EditorFileDialog::update_dir() { switch (mode) { case FILE_MODE_OPEN_FILE: case FILE_MODE_OPEN_FILES: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); break; case FILE_MODE_OPEN_DIR: - get_ok_button()->set_text(TTR("Select Current Folder")); + set_ok_button_text(TTR("Select Current Folder")); break; case FILE_MODE_OPEN_ANY: case FILE_MODE_SAVE_FILE: @@ -507,7 +507,7 @@ void EditorFileDialog::_item_selected(int p_item) { file->set_text(d["name"]); _request_single_thumbnail(get_current_dir().plus_file(get_current_file())); } else if (mode == FILE_MODE_OPEN_DIR) { - get_ok_button()->set_text(TTR("Select This Folder")); + set_ok_button_text(TTR("Select This Folder")); } get_ok_button()->set_disabled(_is_open_should_be_disabled()); @@ -540,13 +540,13 @@ void EditorFileDialog::_items_clear_selection(const Vector2 &p_pos, MouseButton switch (mode) { case FILE_MODE_OPEN_FILE: case FILE_MODE_OPEN_FILES: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); get_ok_button()->set_disabled(!item_list->is_anything_selected()); break; case FILE_MODE_OPEN_DIR: get_ok_button()->set_disabled(false); - get_ok_button()->set_text(TTR("Select Current Folder")); + set_ok_button_text(TTR("Select Current Folder")); break; case FILE_MODE_OPEN_ANY: @@ -976,8 +976,12 @@ void EditorFileDialog::clear_filters() { invalidate(); } -void EditorFileDialog::add_filter(const String &p_filter) { - filters.push_back(p_filter); +void EditorFileDialog::add_filter(const String &p_filter, const String &p_description) { + if (p_description.is_empty()) { + filters.push_back(p_filter); + } else { + filters.push_back(vformat("%s ; %s", p_filter, p_description)); + } update_filters(); invalidate(); } @@ -1033,27 +1037,27 @@ void EditorFileDialog::set_file_mode(FileMode p_mode) { mode = p_mode; switch (mode) { case FILE_MODE_OPEN_FILE: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); set_title(TTR("Open a File")); can_create_dir = false; break; case FILE_MODE_OPEN_FILES: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); set_title(TTR("Open File(s)")); can_create_dir = false; break; case FILE_MODE_OPEN_DIR: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); set_title(TTR("Open a Directory")); can_create_dir = true; break; case FILE_MODE_OPEN_ANY: - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); set_title(TTR("Open a File or Directory")); can_create_dir = true; break; case FILE_MODE_SAVE_FILE: - get_ok_button()->set_text(TTR("Save")); + set_ok_button_text(TTR("Save")); set_title(TTR("Save a File")); can_create_dir = true; break; @@ -1481,7 +1485,7 @@ void EditorFileDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_cancel_pressed"), &EditorFileDialog::_cancel_pressed); ClassDB::bind_method(D_METHOD("clear_filters"), &EditorFileDialog::clear_filters); - ClassDB::bind_method(D_METHOD("add_filter", "filter"), &EditorFileDialog::add_filter); + ClassDB::bind_method(D_METHOD("add_filter", "filter", "description"), &EditorFileDialog::add_filter, DEFVAL("")); ClassDB::bind_method(D_METHOD("get_current_dir"), &EditorFileDialog::get_current_dir); ClassDB::bind_method(D_METHOD("get_current_file"), &EditorFileDialog::get_current_file); ClassDB::bind_method(D_METHOD("get_current_path"), &EditorFileDialog::get_current_path); diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index 5f2e29b690..51629f2682 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -212,7 +212,7 @@ protected: public: void popup_file_dialog(); void clear_filters(); - void add_filter(const String &p_filter); + void add_filter(const String &p_filter, const String &p_description = ""); void set_enable_multiple_selection(bool p_enable); Vector<String> get_selected_files() const; diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index a674451d1e..68141dd4a3 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -1718,6 +1718,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { List<String> tag_stack; bool code_tag = false; + bool codeblock_tag = false; int pos = 0; while (pos < bbcode.length()) { @@ -1729,7 +1730,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { if (brk_pos > pos) { String text = bbcode.substr(pos, brk_pos - pos); - if (!code_tag) { + if (!code_tag && !codeblock_tag) { text = text.replace("\n", "\n\n"); } p_rt->add_text(text); @@ -1743,7 +1744,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { if (brk_end == -1) { String text = bbcode.substr(brk_pos, bbcode.length() - brk_pos); - if (!code_tag) { + if (!code_tag && !codeblock_tag) { text = text.replace("\n", "\n\n"); } p_rt->add_text(text); @@ -1767,12 +1768,20 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { if (tag != "/img") { p_rt->pop(); if (code_tag) { + // Pop both color and background color. + p_rt->pop(); + p_rt->pop(); + } else if (codeblock_tag) { + // Pop color, cell and table. + p_rt->pop(); + p_rt->pop(); p_rt->pop(); } } code_tag = false; + codeblock_tag = false; - } else if (code_tag) { + } else if (code_tag || codeblock_tag) { p_rt->add_text("["); pos = brk_pos + 1; @@ -1781,24 +1790,32 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { const String link_tag = tag.substr(0, tag_end); const String link_target = tag.substr(tag_end + 1, tag.length()).lstrip(" "); + // Use monospace font with translucent colored background color to make clickable references + // easier to distinguish from inline code and other text. p_rt->push_font(doc_code_font); p_rt->push_color(link_color); + p_rt->push_bgcolor(code_color * Color(1, 1, 1, 0.15)); p_rt->push_meta("@" + link_tag + " " + link_target); p_rt->add_text(link_target + (tag.begins_with("method ") ? "()" : "")); p_rt->pop(); p_rt->pop(); p_rt->pop(); + p_rt->pop(); pos = brk_end + 1; } else if (doc->class_list.has(tag)) { // Class reference tag such as [Node2D] or [SceneTree]. + // Use monospace font with translucent colored background color to make clickable references + // easier to distinguish from inline code and other text. p_rt->push_font(doc_code_font); p_rt->push_color(link_color); + p_rt->push_bgcolor(code_color * Color(1, 1, 1, 0.15)); p_rt->push_meta("#" + tag); p_rt->add_text(tag); p_rt->pop(); p_rt->pop(); p_rt->pop(); + p_rt->pop(); pos = brk_end + 1; } else if (tag == "b") { @@ -1811,16 +1828,31 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { p_rt->push_font(doc_italic_font); pos = brk_end + 1; tag_stack.push_front(tag); - } else if (tag == "code" || tag == "codeblock") { - // Use monospace font. + } else if (tag == "code") { + // Use monospace font with translucent background color to make code easier to distinguish from other text. p_rt->push_font(doc_code_font); + p_rt->push_bgcolor(Color(0.5, 0.5, 0.5, 0.15)); p_rt->push_color(code_color); code_tag = true; pos = brk_end + 1; tag_stack.push_front(tag); + } else if (tag == "codeblock") { + // Use monospace font with translucent background color to make code easier to distinguish from other text. + // Use a single-column table with cell row background color instead of `[bgcolor]`. + // This makes the background color highlight cover the entire block, rather than individual lines. + p_rt->push_font(doc_code_font); + p_rt->push_table(1); + p_rt->push_cell(); + p_rt->set_cell_row_background_color(Color(0.5, 0.5, 0.5, 0.15), Color(0.5, 0.5, 0.5, 0.15)); + p_rt->set_cell_padding(Rect2(10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE)); + p_rt->push_color(code_color); + codeblock_tag = true; + pos = brk_end + 1; + tag_stack.push_front(tag); } else if (tag == "kbd") { - // Use keyboard font with custom color. + // Use keyboard font with custom color and background color. p_rt->push_font(doc_kbd_font); + p_rt->push_bgcolor(Color(0.5, 0.5, 0.5, 0.15)); p_rt->push_color(kbd_color); code_tag = true; // Though not strictly a code tag, logic is similar. pos = brk_end + 1; diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index f454ba2c41..c48b443a0b 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -185,7 +185,7 @@ EditorHelpSearch::EditorHelpSearch() { set_title(TTR("Search Help")); get_ok_button()->set_disabled(true); - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); // Split search and results area. VBoxContainer *vbox = memnew(VBoxContainer); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index dc47719f0a..1711b23547 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -39,6 +39,7 @@ #include "editor/editor_property_name_processor.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/plugins/script_editor_plugin.h" #include "multi_node_edit.h" #include "scene/gui/center_container.h" #include "scene/property_utils.h" @@ -410,6 +411,10 @@ StringName EditorProperty::get_edited_property() const { return property; } +void EditorProperty::set_doc_path(const String &p_doc_path) { + doc_path = p_doc_path; +} + void EditorProperty::update_property() { GDVIRTUAL_CALL(_update_property); } @@ -906,6 +911,10 @@ void EditorProperty::menu_option(int p_option) { emit_signal(SNAME("property_pinned"), property, !pinned); update(); } break; + case MENU_OPEN_DOCUMENTATION: { + ScriptEditor::get_singleton()->goto_help(doc_path); + EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT); + } break; } } @@ -985,20 +994,25 @@ void EditorProperty::_update_popup() { add_child(menu); menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option)); } - menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property"), MENU_COPY_PROPERTY); - menu->add_shortcut(ED_GET_SHORTCUT("property_editor/paste_property"), MENU_PASTE_PROPERTY); - menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property_path"), MENU_COPY_PROPERTY_PATH); + menu->add_icon_shortcut(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/copy_property"), MENU_COPY_PROPERTY); + menu->add_icon_shortcut(get_theme_icon(SNAME("ActionPaste"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/paste_property"), MENU_PASTE_PROPERTY); + menu->add_icon_shortcut(get_theme_icon(SNAME("CopyNodePath"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/copy_property_path"), MENU_COPY_PROPERTY_PATH); menu->set_item_disabled(MENU_PASTE_PROPERTY, is_read_only()); if (!pin_hidden) { menu->add_separator(); if (can_pin) { - menu->add_check_item(TTR("Pin value"), MENU_PIN_VALUE); + menu->add_icon_check_item(get_theme_icon(SNAME("Pin"), SNAME("EditorIcons")), TTR("Pin Value"), MENU_PIN_VALUE); menu->set_item_checked(menu->get_item_index(MENU_PIN_VALUE), pinned); - menu->set_item_tooltip(menu->get_item_index(MENU_PIN_VALUE), TTR("Pinning a value forces it to be saved even if it's equal to the default.")); } else { - menu->add_check_item(vformat(TTR("Pin value [Disabled because '%s' is editor-only]"), property), MENU_PIN_VALUE); + menu->add_icon_check_item(get_theme_icon(SNAME("Pin"), SNAME("EditorIcons")), vformat(TTR("Pin Value [Disabled because '%s' is editor-only]"), property), MENU_PIN_VALUE); menu->set_item_disabled(menu->get_item_index(MENU_PIN_VALUE), true); } + menu->set_item_tooltip(menu->get_item_index(MENU_PIN_VALUE), TTR("Pinning a value forces it to be saved even if it's equal to the default.")); + } + + if (!doc_path.is_empty()) { + menu->add_separator(); + menu->add_icon_item(get_theme_icon(SNAME("Help"), SNAME("EditorIcons")), TTR("Open Documentation"), MENU_OPEN_DOCUMENTATION); } } @@ -2844,7 +2858,7 @@ void EditorInspector::update_tree() { restart_request_props.insert(p.name); } - String doc_hint; + PropertyDocInfo doc_info; if (use_doc_hints) { // Build the doc hint, to use as tooltip. @@ -2856,16 +2870,15 @@ void EditorInspector::update_tree() { } StringName propname = property_prefix + p.name; - String descr; bool found = false; // Search for the property description in the cache. - HashMap<StringName, HashMap<StringName, String>>::Iterator E = descr_cache.find(classname); + HashMap<StringName, HashMap<StringName, PropertyDocInfo>>::Iterator E = doc_info_cache.find(classname); if (E) { - HashMap<StringName, String>::Iterator F = E->value.find(propname); + HashMap<StringName, PropertyDocInfo>::Iterator F = E->value.find(propname); if (F) { found = true; - descr = F->value; + doc_info = F->value; } } @@ -2873,10 +2886,11 @@ void EditorInspector::update_tree() { // Build the property description String and add it to the cache. DocTools *dd = EditorHelp::get_doc_data(); HashMap<String, DocData::ClassDoc>::Iterator F = dd->class_list.find(classname); - while (F && descr.is_empty()) { + while (F && doc_info.description.is_empty()) { for (int i = 0; i < F->value.properties.size(); i++) { if (F->value.properties[i].name == propname.operator String()) { - descr = DTR(F->value.properties[i].description); + doc_info.description = DTR(F->value.properties[i].description); + doc_info.path = "class_property:" + F->value.name + ":" + F->value.properties[i].name; break; } } @@ -2885,7 +2899,8 @@ void EditorInspector::update_tree() { if (slices.size() == 2 && slices[0].begins_with("theme_override_")) { for (int i = 0; i < F->value.theme_properties.size(); i++) { if (F->value.theme_properties[i].name == slices[1]) { - descr = DTR(F->value.theme_properties[i].description); + doc_info.description = DTR(F->value.theme_properties[i].description); + doc_info.path = "class_theme_item:" + F->value.name + ":" + F->value.theme_properties[i].name; break; } } @@ -2897,10 +2912,9 @@ void EditorInspector::update_tree() { break; } } - descr_cache[classname][propname] = descr; - } - doc_hint = descr; + doc_info_cache[classname][propname] = doc_info; + } } Vector<EditorInspectorPlugin::AddedEditor> editors; @@ -2983,11 +2997,12 @@ void EditorInspector::update_tree() { ep->connect("multiple_properties_changed", callable_mp(this, &EditorInspector::_multiple_properties_changed)); ep->connect("resource_selected", callable_mp(this, &EditorInspector::_resource_selected), varray(), CONNECT_DEFERRED); ep->connect("object_id_selected", callable_mp(this, &EditorInspector::_object_id_selected), varray(), CONNECT_DEFERRED); - if (!doc_hint.is_empty()) { - ep->set_tooltip(property_prefix + p.name + "::" + doc_hint); + if (!doc_info.description.is_empty()) { + ep->set_tooltip(property_prefix + p.name + "::" + doc_info.description); } else { ep->set_tooltip(property_prefix + p.name); } + ep->set_doc_path(doc_info.path); ep->update_property(); ep->_update_pin_flags(); ep->update_revert_and_pin_status(); @@ -3473,7 +3488,7 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { void EditorInspector::_property_selected(const String &p_path, int p_focusable) { property_selected = p_path; property_focusable = p_focusable; - //deselect the others + // Deselect the others. for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) { if (F.key == property_selected) { continue; @@ -3781,7 +3796,7 @@ void EditorInspector::_show_add_meta_dialog() { add_meta_type->add_icon_item(get_theme_icon(type, "EditorIcons"), type, i); } hbc->add_child(add_meta_type); - add_meta_dialog->get_ok_button()->set_text(TTR("Add")); + add_meta_dialog->set_ok_button_text(TTR("Add")); add_child(add_meta_dialog); add_meta_dialog->register_text_enter(add_meta_name); add_meta_dialog->connect("confirmed", callable_mp(this, &EditorInspector::_add_meta_confirm)); diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index d70d06c48b..9542f102cb 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -62,6 +62,7 @@ public: MENU_PASTE_PROPERTY, MENU_COPY_PROPERTY_PATH, MENU_PIN_VALUE, + MENU_OPEN_DOCUMENTATION, }; private: @@ -71,6 +72,7 @@ private: Object *object = nullptr; StringName property; String property_path; + String doc_path; int property_usage; @@ -148,6 +150,8 @@ public: Object *get_edited_object(); StringName get_edited_property() const; + void set_doc_path(const String &p_doc_path); + virtual void update_property(); void update_revert_and_pin_status(); @@ -439,7 +443,7 @@ class EditorInspector : public ScrollContainer { VBoxContainer *main_vbox = nullptr; - //map use to cache the instantiated editors + // Map used to cache the instantiated editors. HashMap<StringName, List<EditorProperty *>> editor_property_map; List<EditorInspectorSection *> sections; HashSet<StringName> pending; @@ -473,7 +477,12 @@ class EditorInspector : public ScrollContainer { int property_focusable; int update_scroll_request; - HashMap<StringName, HashMap<StringName, String>> descr_cache; + struct PropertyDocInfo { + String description; + String path; + }; + + HashMap<StringName, HashMap<StringName, PropertyDocInfo>> doc_info_cache; HashMap<StringName, String> class_descr_cache; HashSet<StringName> restart_request_props; diff --git a/editor/editor_locale_dialog.cpp b/editor/editor_locale_dialog.cpp index abef0dc353..cd8150d235 100644 --- a/editor/editor_locale_dialog.cpp +++ b/editor/editor_locale_dialog.cpp @@ -552,5 +552,5 @@ EditorLocaleDialog::EditorLocaleDialog() { add_child(vb); _update_tree(); - get_ok_button()->set_text(TTR("Select")); + set_ok_button_text(TTR("Select")); } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 64665833df..d9cdefbca7 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -512,10 +512,10 @@ void EditorNode::_update_from_settings() { uint32_t directional_shadow_16_bits = GLOBAL_GET("rendering/shadows/directional_shadow/16_bits"); RS::get_singleton()->directional_shadow_atlas_set_size(directional_shadow_size, directional_shadow_16_bits); - RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/shadows/soft_shadow_quality"))); - RS::get_singleton()->shadows_quality_set(shadows_quality); - RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_quality"))); - RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality); + RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/positional_shadow/soft_shadow_filter_quality"))); + RS::get_singleton()->positional_soft_shadow_filter_set_quality(shadows_quality); + RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_filter_quality"))); + RS::get_singleton()->directional_soft_shadow_filter_set_quality(directional_shadow_quality); float probe_update_speed = GLOBAL_GET("rendering/lightmapping/probe_capture/update_speed"); RS::get_singleton()->lightmap_set_probe_capture_update_speed(probe_update_speed); RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/global_illumination/sdfgi/frames_to_converge"))); @@ -1259,7 +1259,7 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String // This serves no purpose and confused people. continue; } - file->add_filter("*." + E + " ; " + E.to_upper()); + file->add_filter("*." + E, E.to_upper()); preferred.push_back(E); } // Lowest priority extension. @@ -2471,7 +2471,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions); file->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file->add_filter("*." + extensions[i], extensions[i].to_upper()); } Node *scene = editor_data.get_edited_scene_root(); @@ -2541,10 +2541,10 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { if (scene_root) { String scene_filename = scene_root->get_scene_file_path(); if (p_option == FILE_CLOSE_ALL_AND_RELOAD_CURRENT_PROJECT) { - save_confirmation->get_ok_button()->set_text(TTR("Save & Reload")); + save_confirmation->set_ok_button_text(TTR("Save & Reload")); save_confirmation->set_text(vformat(TTR("Save changes to '%s' before reloading?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); } else { - save_confirmation->get_ok_button()->set_text(TTR("Save & Quit")); + save_confirmation->set_ok_button_text(TTR("Save & Quit")); save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); } save_confirmation->popup_centered(); @@ -2617,7 +2617,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { ResourceSaver::get_recognized_extensions(sd, &extensions); file->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file->add_filter("*." + extensions[i], extensions[i].to_upper()); } if (!scene->get_scene_file_path().is_empty()) { @@ -2660,7 +2660,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case FILE_EXTERNAL_OPEN_SCENE: { if (unsaved_cache && !p_confirmed) { - confirmation->get_ok_button()->set_text(TTR("Open")); + confirmation->set_ok_button_text(TTR("Open")); confirmation->set_text(TTR("Current scene not saved. Open anyway?")); confirmation->popup_centered(); break; @@ -2716,7 +2716,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } if (unsaved_cache && !p_confirmed) { - confirmation->get_ok_button()->set_text(TTR("Reload Saved Scene")); + confirmation->set_ok_button_text(TTR("Reload Saved Scene")); confirmation->set_text( TTR("The current scene has unsaved changes.\nReload the saved scene anyway? This action cannot be undone.")); confirmation->popup_centered(); @@ -2838,10 +2838,10 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { i = _next_unsaved_scene(true, ++i); } if (p_option == RELOAD_CURRENT_PROJECT) { - save_confirmation->get_ok_button()->set_text(TTR("Save & Reload")); + save_confirmation->set_ok_button_text(TTR("Save & Reload")); save_confirmation->set_text(TTR("Save changes to the following scene(s) before reloading?") + unsaved_scenes); } else { - save_confirmation->get_ok_button()->set_text(TTR("Save & Quit")); + save_confirmation->set_ok_button_text(TTR("Save & Quit")); save_confirmation->set_text((p_option == FILE_QUIT ? TTR("Save changes to the following scene(s) before quitting?") : TTR("Save changes to the following scene(s) before opening Project Manager?")) + unsaved_scenes); } save_confirmation->popup_centered(); @@ -2903,7 +2903,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions); file->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file->add_filter("*." + extensions[i], extensions[i].to_upper()); } Node *scene = editor_data.get_edited_scene_root(); @@ -4272,14 +4272,14 @@ Error EditorNode::export_preset(const String &p_preset, const String &p_path, bo void EditorNode::show_accept(const String &p_text, const String &p_title) { current_menu_option = -1; - accept->get_ok_button()->set_text(p_title); + accept->set_ok_button_text(p_title); accept->set_text(p_text); accept->popup_centered(); } void EditorNode::show_save_accept(const String &p_text, const String &p_title) { current_menu_option = -1; - save_accept->get_ok_button()->set_text(p_title); + save_accept->set_ok_button_text(p_title); save_accept->set_text(p_text); save_accept->popup_centered(); } @@ -4589,8 +4589,14 @@ void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String &p names += name; } + String config_key = "dock_" + itos(i + 1); + + if (p_layout->has_section_key(p_section, config_key)) { + p_layout->erase_section_key(p_section, config_key); + } + if (!names.is_empty()) { - p_layout->set_value(p_section, "dock_" + itos(i + 1), names); + p_layout->set_value(p_section, config_key, names); } } @@ -4957,8 +4963,8 @@ void EditorNode::_immediate_dialog_confirmed() { bool EditorNode::immediate_confirmation_dialog(const String &p_text, const String &p_ok_text, const String &p_cancel_text) { ConfirmationDialog *cd = memnew(ConfirmationDialog); cd->set_text(p_text); - cd->get_ok_button()->set_text(p_ok_text); - cd->get_cancel_button()->set_text(p_cancel_text); + cd->set_ok_button_text(p_ok_text); + cd->set_cancel_button_text(p_cancel_text); cd->connect("confirmed", callable_mp(singleton, &EditorNode::_immediate_dialog_confirmed)); singleton->gui_base->add_child(cd); @@ -5020,14 +5026,14 @@ void EditorNode::_layout_menu_option(int p_id) { case SETTINGS_LAYOUT_SAVE: { current_menu_option = p_id; layout_dialog->set_title(TTR("Save Layout")); - layout_dialog->get_ok_button()->set_text(TTR("Save")); + layout_dialog->set_ok_button_text(TTR("Save")); layout_dialog->popup_centered(); layout_dialog->set_name_line_enabled(true); } break; case SETTINGS_LAYOUT_DELETE: { current_menu_option = p_id; layout_dialog->set_title(TTR("Delete Layout")); - layout_dialog->get_ok_button()->set_text(TTR("Delete")); + layout_dialog->set_ok_button_text(TTR("Delete")); layout_dialog->popup_centered(); layout_dialog->set_name_line_enabled(false); } break; @@ -5069,7 +5075,7 @@ void EditorNode::_scene_tab_closed(int p_tab, int option) { ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(p_tab) != 0; if (unsaved) { - save_confirmation->get_ok_button()->set_text(TTR("Save & Close")); + save_confirmation->set_ok_button_text(TTR("Save & Close")); save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), !scene->get_scene_file_path().is_empty() ? scene->get_scene_file_path() : "unsaved scene")); save_confirmation->popup_centered(); } else { @@ -6113,7 +6119,9 @@ EditorNode::EditorNode() { EDITOR_DEF_RST("interface/inspector/default_property_name_style", EditorPropertyNameProcessor::STYLE_CAPITALIZED); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "interface/inspector/default_property_name_style", PROPERTY_HINT_ENUM, "Raw,Capitalized,Localized")); EDITOR_DEF_RST("interface/inspector/default_float_step", 0.001); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::FLOAT, "interface/inspector/default_float_step", PROPERTY_HINT_RANGE, "0,1,0")); + // The lowest value is equal to the minimum float step for 32-bit floats. + // The step must be set manually, as changing this setting should not change the step here. + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::FLOAT, "interface/inspector/default_float_step", PROPERTY_HINT_RANGE, "0.0000001,1,0.0000001")); EDITOR_DEF_RST("interface/inspector/disable_folding", false); EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true); EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false); @@ -6769,7 +6777,7 @@ EditorNode::EditorNode() { video_restart_dialog = memnew(ConfirmationDialog); video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor.")); - video_restart_dialog->get_ok_button()->set_text(TTR("Save & Restart")); + video_restart_dialog->set_ok_button_text(TTR("Save & Restart")); video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SET_RENDERING_DRIVER_SAVE_AND_RESTART)); gui_base->add_child(video_restart_dialog); @@ -6938,7 +6946,7 @@ EditorNode::EditorNode() { 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_button()->set_text(TTR("Manage Templates")); + custom_build_manage_templates->set_ok_button_text(TTR("Manage Templates")); custom_build_manage_templates->add_button(TTR("Install from file"))->connect("pressed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE)); custom_build_manage_templates->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_MANAGE_EXPORT_TEMPLATES)); gui_base->add_child(custom_build_manage_templates); @@ -6953,13 +6961,13 @@ EditorNode::EditorNode() { install_android_build_template = memnew(ConfirmationDialog); install_android_build_template->set_text(TTR("This will set up your project for custom Android builds by installing the source template to \"res://android/build\".\nYou can then apply modifications and build your own custom APK on export (adding modules, changing the AndroidManifest.xml, etc.).\nNote that in order to make custom builds instead of using pre-built APKs, the \"Use Custom Build\" option should be enabled in the Android export preset.")); - install_android_build_template->get_ok_button()->set_text(TTR("Install")); + install_android_build_template->set_ok_button_text(TTR("Install")); install_android_build_template->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current)); gui_base->add_child(install_android_build_template); remove_android_build_template = memnew(ConfirmationDialog); remove_android_build_template->set_text(TTR("The Android build template is already installed in this project and it won't be overwritten.\nRemove the \"res://android/build\" directory manually before attempting this operation again.")); - remove_android_build_template->get_ok_button()->set_text(TTR("Show in File Manager")); + remove_android_build_template->set_ok_button_text(TTR("Show in File Manager")); remove_android_build_template->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(FILE_EXPLORE_ANDROID_BUILD_TEMPLATES)); gui_base->add_child(remove_android_build_template); @@ -6970,7 +6978,7 @@ EditorNode::EditorNode() { file_templates->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); file_templates->set_access(EditorFileDialog::ACCESS_FILESYSTEM); file_templates->clear_filters(); - file_templates->add_filter("*.tpz ; " + TTR("Template Package")); + file_templates->add_filter("*.tpz", TTR("Template Package")); file = memnew(EditorFileDialog); gui_base->add_child(file); @@ -7034,7 +7042,7 @@ EditorNode::EditorNode() { disk_changed->connect("confirmed", callable_mp(this, &EditorNode::_reload_modified_scenes)); disk_changed->connect("confirmed", callable_mp(this, &EditorNode::_reload_project_settings)); - disk_changed->get_ok_button()->set_text(TTR("Reload")); + disk_changed->set_ok_button_text(TTR("Reload")); disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); disk_changed->connect("custom_action", callable_mp(this, &EditorNode::_resave_scenes)); @@ -7065,63 +7073,66 @@ EditorNode::EditorNode() { // More visually meaningful to have this later. raise_bottom_panel_item(AnimationPlayerEditor::get_singleton()); - add_editor_plugin(memnew(ReplicationEditorPlugin)); add_editor_plugin(VersionControlEditorPlugin::get_singleton()); - add_editor_plugin(memnew(ShaderEditorPlugin)); - add_editor_plugin(memnew(ShaderFileEditorPlugin)); + // This list is alphabetized, and plugins that depend on Node2D are in their own section below. + add_editor_plugin(memnew(AnimationTreeEditorPlugin)); + add_editor_plugin(memnew(AudioBusesEditorPlugin(audio_bus_editor))); + add_editor_plugin(memnew(AudioStreamEditorPlugin)); + add_editor_plugin(memnew(AudioStreamRandomizerEditorPlugin)); + add_editor_plugin(memnew(BitMapEditorPlugin)); + add_editor_plugin(memnew(BoneMapEditorPlugin)); add_editor_plugin(memnew(Camera3DEditorPlugin)); - add_editor_plugin(memnew(ThemeEditorPlugin)); - add_editor_plugin(memnew(MultiMeshEditorPlugin)); + add_editor_plugin(memnew(ControlEditorPlugin)); + add_editor_plugin(memnew(CPUParticles3DEditorPlugin)); + add_editor_plugin(memnew(CurveEditorPlugin)); + add_editor_plugin(memnew(FontEditorPlugin)); + add_editor_plugin(memnew(GPUParticles3DEditorPlugin)); + add_editor_plugin(memnew(GPUParticlesCollisionSDF3DEditorPlugin)); + add_editor_plugin(memnew(GradientEditorPlugin)); + add_editor_plugin(memnew(GradientTexture2DEditorPlugin)); + add_editor_plugin(memnew(InputEventEditorPlugin)); + add_editor_plugin(memnew(LightmapGIEditorPlugin)); + add_editor_plugin(memnew(MaterialEditorPlugin)); + add_editor_plugin(memnew(MeshEditorPlugin)); add_editor_plugin(memnew(MeshInstance3DEditorPlugin)); - add_editor_plugin(memnew(AnimationTreeEditorPlugin)); add_editor_plugin(memnew(MeshLibraryEditorPlugin)); - add_editor_plugin(memnew(StyleBoxEditorPlugin)); - add_editor_plugin(memnew(Sprite2DEditorPlugin)); - add_editor_plugin(memnew(Skeleton2DEditorPlugin)); - add_editor_plugin(memnew(GPUParticles2DEditorPlugin)); - add_editor_plugin(memnew(GPUParticles3DEditorPlugin)); - add_editor_plugin(memnew(CPUParticles2DEditorPlugin)); - add_editor_plugin(memnew(CPUParticles3DEditorPlugin)); - add_editor_plugin(memnew(ResourcePreloaderEditorPlugin)); + add_editor_plugin(memnew(MultiMeshEditorPlugin)); + add_editor_plugin(memnew(OccluderInstance3DEditorPlugin)); + add_editor_plugin(memnew(Path3DEditorPlugin)); + add_editor_plugin(memnew(PhysicalBone3DEditorPlugin)); add_editor_plugin(memnew(Polygon3DEditorPlugin)); - add_editor_plugin(memnew(CollisionPolygon2DEditorPlugin)); - add_editor_plugin(memnew(TilesEditorPlugin)); + add_editor_plugin(memnew(ReplicationEditorPlugin)); + add_editor_plugin(memnew(ResourcePreloaderEditorPlugin)); + add_editor_plugin(memnew(ShaderEditorPlugin)); + add_editor_plugin(memnew(ShaderFileEditorPlugin)); + add_editor_plugin(memnew(Skeleton3DEditorPlugin)); + add_editor_plugin(memnew(SkeletonIK3DEditorPlugin)); add_editor_plugin(memnew(SpriteFramesEditorPlugin)); + add_editor_plugin(memnew(StyleBoxEditorPlugin)); + add_editor_plugin(memnew(SubViewportPreviewEditorPlugin)); + add_editor_plugin(memnew(Texture3DEditorPlugin)); + add_editor_plugin(memnew(TextureEditorPlugin)); + add_editor_plugin(memnew(TextureLayeredEditorPlugin)); add_editor_plugin(memnew(TextureRegionEditorPlugin)); + add_editor_plugin(memnew(ThemeEditorPlugin)); add_editor_plugin(memnew(VoxelGIEditorPlugin)); - add_editor_plugin(memnew(LightmapGIEditorPlugin)); - add_editor_plugin(memnew(OccluderInstance3DEditorPlugin)); - add_editor_plugin(memnew(Path2DEditorPlugin)); - add_editor_plugin(memnew(Path3DEditorPlugin)); - add_editor_plugin(memnew(Line2DEditorPlugin)); - add_editor_plugin(memnew(Polygon2DEditorPlugin)); + + // 2D + add_editor_plugin(memnew(CollisionPolygon2DEditorPlugin)); + add_editor_plugin(memnew(CollisionShape2DEditorPlugin)); + add_editor_plugin(memnew(CPUParticles2DEditorPlugin)); + add_editor_plugin(memnew(GPUParticles2DEditorPlugin)); add_editor_plugin(memnew(LightOccluder2DEditorPlugin)); + add_editor_plugin(memnew(Line2DEditorPlugin)); add_editor_plugin(memnew(NavigationPolygonEditorPlugin)); - add_editor_plugin(memnew(GradientEditorPlugin)); - add_editor_plugin(memnew(CollisionShape2DEditorPlugin)); - add_editor_plugin(memnew(CurveEditorPlugin)); - add_editor_plugin(memnew(FontEditorPlugin)); - add_editor_plugin(memnew(TextureEditorPlugin)); - add_editor_plugin(memnew(TextureLayeredEditorPlugin)); - add_editor_plugin(memnew(Texture3DEditorPlugin)); - add_editor_plugin(memnew(AudioStreamEditorPlugin)); - add_editor_plugin(memnew(AudioStreamRandomizerEditorPlugin)); - add_editor_plugin(memnew(AudioBusesEditorPlugin(audio_bus_editor))); - add_editor_plugin(memnew(Skeleton3DEditorPlugin)); - add_editor_plugin(memnew(SkeletonIK3DEditorPlugin)); - add_editor_plugin(memnew(PhysicalBone3DEditorPlugin)); - add_editor_plugin(memnew(MeshEditorPlugin)); - add_editor_plugin(memnew(MaterialEditorPlugin)); - add_editor_plugin(memnew(GPUParticlesCollisionSDF3DEditorPlugin)); - add_editor_plugin(memnew(InputEventEditorPlugin)); - add_editor_plugin(memnew(SubViewportPreviewEditorPlugin)); - add_editor_plugin(memnew(ControlEditorPlugin)); - add_editor_plugin(memnew(GradientTexture2DEditorPlugin)); - add_editor_plugin(memnew(BitMapEditorPlugin)); + add_editor_plugin(memnew(Path2DEditorPlugin)); + add_editor_plugin(memnew(Polygon2DEditorPlugin)); add_editor_plugin(memnew(RayCast2DEditorPlugin)); - add_editor_plugin(memnew(BoneMapEditorPlugin)); + add_editor_plugin(memnew(Skeleton2DEditorPlugin)); + add_editor_plugin(memnew(Sprite2DEditorPlugin)); + add_editor_plugin(memnew(TilesEditorPlugin)); for (int i = 0; i < EditorPlugins::get_plugin_count(); i++) { add_editor_plugin(EditorPlugins::create(i)); @@ -7208,7 +7219,7 @@ EditorNode::EditorNode() { set_process(true); open_imported = memnew(ConfirmationDialog); - open_imported->get_ok_button()->set_text(TTR("Open Anyway")); + open_imported->set_ok_button_text(TTR("Open Anyway")); new_inherited_button = open_imported->add_button(TTR("New Inherited"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "inherit"); open_imported->connect("confirmed", callable_mp(this, &EditorNode::_open_imported)); open_imported->connect("custom_action", callable_mp(this, &EditorNode::_inherit_imported)); @@ -7249,7 +7260,7 @@ EditorNode::EditorNode() { pick_main_scene = memnew(ConfirmationDialog); gui_base->add_child(pick_main_scene); - pick_main_scene->get_ok_button()->set_text(TTR("Select")); + pick_main_scene->set_ok_button_text(TTR("Select")); pick_main_scene->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_PICK_MAIN_SCENE)); select_current_scene_button = pick_main_scene->add_button(TTR("Select Current"), true, "select_current"); pick_main_scene->connect("custom_action", callable_mp(this, &EditorNode::_pick_main_scene_custom_action)); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index d06d22ae5b..aaa518362c 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -836,7 +836,7 @@ EditorPropertyLayersGrid::EditorPropertyLayersGrid() { rename_dialog->add_child(rename_dialog_vb); rename_dialog_text = memnew(LineEdit); rename_dialog_vb->add_margin_child(TTR("Name:"), rename_dialog_text); - rename_dialog->get_ok_button()->set_text(TTR("Rename")); + rename_dialog->set_ok_button_text(TTR("Rename")); add_child(rename_dialog); rename_dialog->register_text_enter(rename_dialog_text); rename_dialog->connect("confirmed", callable_mp(this, &EditorPropertyLayersGrid::_rename_operation_confirm)); diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index f1a3fe0c57..0b9004bbc4 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -211,7 +211,14 @@ void EditorPropertyArray::update_property() { String array_type_name = Variant::get_type_name(array_type); if (array_type == Variant::ARRAY && subtype != Variant::NIL) { - array_type_name = vformat("%s[%s]", array_type_name, Variant::get_type_name(subtype)); + String type_name; + if (subtype == Variant::OBJECT && subtype_hint == PROPERTY_HINT_RESOURCE_TYPE) { + type_name = subtype_hint_string; + } else { + type_name = Variant::get_type_name(subtype); + } + + array_type_name = vformat("%s[%s]", array_type_name, type_name); } if (array.get_type() == Variant::NIL) { diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 16ebecb8be..2e78b58e11 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -254,7 +254,7 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { file_dialog->clear_filters(); for (const String &E : valid_extensions) { - file_dialog->add_filter("*." + E + " ; " + E.to_upper()); + file_dialog->add_filter("*." + E, E.to_upper()); } file_dialog->popup_file_dialog(); diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp index 3eb7d7ffbd..08ff63551f 100644 --- a/editor/editor_settings_dialog.cpp +++ b/editor/editor_settings_dialog.cpp @@ -772,7 +772,7 @@ EditorSettingsDialog::EditorSettingsDialog() { timer->set_one_shot(true); add_child(timer); EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &EditorSettingsDialog::_settings_changed)); - get_ok_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Close")); } EditorSettingsDialog::~EditorSettingsDialog() { diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 4ca2e1fdbf..af9c918360 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -810,7 +810,7 @@ void ExportTemplateManager::_bind_methods() { ExportTemplateManager::ExportTemplateManager() { set_title(TTR("Export Template Manager")); set_hide_on_ok(false); - get_ok_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Close")); // Downloadable export templates are only available for stable and official alpha/beta/RC builds // (which always have a number following their status, e.g. "alpha1"). @@ -990,7 +990,7 @@ ExportTemplateManager::ExportTemplateManager() { install_file_dialog->set_title(TTR("Select Template File")); install_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); install_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); - install_file_dialog->add_filter("*.tpz ; " + TTR("Godot Export Templates")); + install_file_dialog->add_filter("*.tpz", TTR("Godot Export Templates")); install_file_dialog->connect("file_selected", callable_mp(this, &ExportTemplateManager::_install_file_selected), varray(false)); add_child(install_file_dialog); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 2d6ec0c63a..fe6e6044a4 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -3145,7 +3145,7 @@ FileSystemDock::FileSystemDock() { add_child(remove_dialog); move_dialog = memnew(EditorDirDialog); - move_dialog->get_ok_button()->set_text(TTR("Move")); + move_dialog->set_ok_button_text(TTR("Move")); add_child(move_dialog); move_dialog->connect("dir_selected", callable_mp(this, &FileSystemDock::_move_operation_confirm), make_binds(false)); @@ -3155,13 +3155,13 @@ FileSystemDock::FileSystemDock() { rename_dialog_text = memnew(LineEdit); rename_dialog_vb->add_margin_child(TTR("Name:"), rename_dialog_text); - rename_dialog->get_ok_button()->set_text(TTR("Rename")); + rename_dialog->set_ok_button_text(TTR("Rename")); add_child(rename_dialog); rename_dialog->register_text_enter(rename_dialog_text); rename_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_rename_operation_confirm)); overwrite_dialog = memnew(ConfirmationDialog); - overwrite_dialog->get_ok_button()->set_text(TTR("Overwrite")); + overwrite_dialog->set_ok_button_text(TTR("Overwrite")); add_child(overwrite_dialog); overwrite_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_move_with_overwrite)); @@ -3171,7 +3171,7 @@ FileSystemDock::FileSystemDock() { duplicate_dialog_text = memnew(LineEdit); duplicate_dialog_vb->add_margin_child(TTR("Name:"), duplicate_dialog_text); - duplicate_dialog->get_ok_button()->set_text(TTR("Duplicate")); + duplicate_dialog->set_ok_button_text(TTR("Duplicate")); add_child(duplicate_dialog); duplicate_dialog->register_text_enter(duplicate_dialog_text); duplicate_dialog->connect("confirmed", callable_mp(this, &FileSystemDock::_duplicate_operation_confirm)); diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index 5dc81f623d..bca8c95574 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -568,7 +568,7 @@ GroupDialog::GroupDialog() { error = memnew(ConfirmationDialog); add_child(error); - error->get_ok_button()->set_text(TTR("Close")); + error->set_ok_button_text(TTR("Close")); _add_group_text_changed(""); } diff --git a/editor/icons/CopyNodePath.svg b/editor/icons/CopyNodePath.svg index 1adec4ade3..12d03843e0 100644 --- a/editor/icons/CopyNodePath.svg +++ b/editor/icons/CopyNodePath.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><circle cx="3" cy="1048.4"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10zm3 5-2 4h2l2-4zm4 0-2 4h2l2-4z" fill-opacity=".78431" transform="translate(0 1036.4)"/></g></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(0 -1036.4)"><circle cx="3" cy="1048.4"/><path d="m2 1c-.55226.0001-.99994.4477-1 1v12c.0000552.5523.44774.9999 1 1h12c.55226-.0001.99994-.4477 1-1v-8l-5-5zm1 2h6v3c0 .554.44599 1 1 1h3v6h-10zm3 5-2 4h2l2-4zm4 0-2 4h2l2-4z" transform="translate(0 1036.4)"/></g></svg> diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index fa261496f0..ee13a1a9c1 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -1363,6 +1363,6 @@ DynamicFontImportSettings::DynamicFontImportSettings() { import_settings_data.instantiate(); import_settings_data->owner = this; - get_ok_button()->set_text(TTR("Reimport")); - get_cancel_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Reimport")); + set_cancel_button_text(TTR("Close")); } diff --git a/editor/import/post_import_plugin_skeleton_renamer.cpp b/editor/import/post_import_plugin_skeleton_renamer.cpp index b0c4bc8c30..bf84348ac3 100644 --- a/editor/import/post_import_plugin_skeleton_renamer.cpp +++ b/editor/import/post_import_plugin_skeleton_renamer.cpp @@ -39,6 +39,8 @@ void PostImportPluginSkeletonRenamer::get_internal_import_options(InternalImportCategory p_category, List<ResourceImporter::ImportOption> *r_options) { if (p_category == INTERNAL_IMPORT_CATEGORY_SKELETON_3D_NODE) { r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "retarget/bone_renamer/rename_bones"), true)); + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "retarget/bone_renamer/unique_node/make_unique"), true)); + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::STRING, "retarget/bone_renamer/unique_node/skeleton_name"), "GeneralSkeleton")); } } @@ -137,6 +139,38 @@ void PostImportPluginSkeletonRenamer::internal_process(InternalImportCategory p_ nd->callp("_notify_skeleton_bones_renamed", argptrs, argcount, ce); } } + + // Make unique skeleton. + if (bool(p_options["retarget/bone_renamer/unique_node/make_unique"])) { + String unique_name = String(p_options["retarget/bone_renamer/unique_node/skeleton_name"]); + ERR_FAIL_COND_MSG(unique_name == String(), "Skeleton unique name cannot be empty."); + + TypedArray<Node> nodes = p_base_scene->find_children("*", "AnimationPlayer"); + while (nodes.size()) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(nodes.pop_back()); + List<StringName> anims; + ap->get_animation_list(&anims); + for (const StringName &name : anims) { + Ref<Animation> anim = ap->get_animation(name); + int track_len = anim->get_track_count(); + for (int i = 0; i < track_len; i++) { + if (anim->track_get_path(i).get_subname_count() != 1 || !(anim->track_get_type(i) == Animation::TYPE_POSITION_3D || anim->track_get_type(i) == Animation::TYPE_ROTATION_3D || anim->track_get_type(i) == Animation::TYPE_SCALE_3D)) { + continue; + } + String track_path = String(anim->track_get_path(i).get_concatenated_names()); + Node *node = (ap->get_node(ap->get_root()))->get_node(NodePath(track_path)); + if (node) { + Skeleton3D *track_skeleton = Object::cast_to<Skeleton3D>(node); + if (track_skeleton && track_skeleton == skeleton) { + anim->track_set_path(i, String("%") + unique_name + String(":") + anim->track_get_path(i).get_concatenated_subnames()); + } + } + } + } + } + skeleton->set_name(unique_name); + skeleton->set_unique_name_in_owner(true); + } } } diff --git a/editor/import/post_import_plugin_skeleton_rest_fixer.cpp b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp new file mode 100644 index 0000000000..8b0d8c8729 --- /dev/null +++ b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp @@ -0,0 +1,418 @@ +/*************************************************************************/ +/* post_import_plugin_skeleton_rest_fixer.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "post_import_plugin_skeleton_rest_fixer.h" + +#include "editor/import/scene_import_settings.h" +#include "scene/3d/importer_mesh_instance_3d.h" +#include "scene/3d/skeleton_3d.h" +#include "scene/animation/animation_player.h" +#include "scene/resources/animation.h" +#include "scene/resources/bone_map.h" + +void PostImportPluginSkeletonRestFixer::get_internal_import_options(InternalImportCategory p_category, List<ResourceImporter::ImportOption> *r_options) { + if (p_category == INTERNAL_IMPORT_CATEGORY_SKELETON_3D_NODE) { + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "retarget/rest_fixer/overwrite_axis"), true)); + + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "retarget/rest_fixer/fix_silhouette/enable"), false)); + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::FLOAT, "retarget/rest_fixer/fix_silhouette/threshold"), 15)); + + // TODO: PostImportPlugin need to be implemented such as validate_option(PropertyInfo &property, const Dictionary &p_options). + // get_internal_option_visibility() is not sufficient because it can only retrieve options implemented in the core and can only read option values. + // r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::ARRAY, "retarget/rest_fixer/filter", PROPERTY_HINT_ARRAY_TYPE, vformat("%s/%s:%s", Variant::STRING_NAME, PROPERTY_HINT_ENUM, "Hips,Spine,Chest")), Array())); + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::ARRAY, "retarget/rest_fixer/fix_silhouette/filter", PROPERTY_HINT_ARRAY_TYPE, "StringName"), Array())); + } +} + +void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory p_category, Node *p_base_scene, Node *p_node, Ref<Resource> p_resource, const Dictionary &p_options) { + if (p_category == INTERNAL_IMPORT_CATEGORY_SKELETON_3D_NODE) { + // Prepare objects. + Object *map = p_options["retarget/bone_map"].get_validated_object(); + if (!map) { + return; + } + BoneMap *bone_map = Object::cast_to<BoneMap>(map); + Ref<SkeletonProfile> profile = bone_map->get_profile(); + if (!profile.is_valid()) { + return; + } + Skeleton3D *src_skeleton = Object::cast_to<Skeleton3D>(p_node); + if (!src_skeleton) { + return; + } + bool is_renamed = bool(p_options["retarget/bone_renamer/rename_bones"]); + Array filter = p_options["retarget/rest_fixer/fix_silhouette/filter"]; + bool is_rest_changed = false; + + // Build profile skeleton. + Skeleton3D *prof_skeleton = memnew(Skeleton3D); + { + int prof_bone_len = profile->get_bone_size(); + // Add single bones. + for (int i = 0; i < prof_bone_len; i++) { + prof_skeleton->add_bone(profile->get_bone_name(i)); + prof_skeleton->set_bone_rest(i, profile->get_reference_pose(i)); + } + // Set parents. + for (int i = 0; i < prof_bone_len; i++) { + int parent = profile->find_bone(profile->get_bone_parent(i)); + if (parent >= 0) { + prof_skeleton->set_bone_parent(i, parent); + } + } + } + + // Complement Rotation track for compatibility between defference rests. + { + TypedArray<Node> nodes = p_base_scene->find_children("*", "AnimationPlayer"); + while (nodes.size()) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(nodes.pop_back()); + List<StringName> anims; + ap->get_animation_list(&anims); + for (const StringName &name : anims) { + Ref<Animation> anim = ap->get_animation(name); + int track_len = anim->get_track_count(); + + // Detect does the animetion have skeleton's TRS track. + String track_path; + bool found_skeleton = false; + for (int i = 0; i < track_len; i++) { + if (anim->track_get_path(i).get_subname_count() != 1 || !(anim->track_get_type(i) == Animation::TYPE_POSITION_3D || anim->track_get_type(i) == Animation::TYPE_ROTATION_3D || anim->track_get_type(i) == Animation::TYPE_SCALE_3D)) { + continue; + } + track_path = String(anim->track_get_path(i).get_concatenated_names()); + Node *node = (ap->get_node(ap->get_root()))->get_node(NodePath(track_path)); + if (node) { + Skeleton3D *track_skeleton = Object::cast_to<Skeleton3D>(node); + if (track_skeleton && track_skeleton == src_skeleton) { + found_skeleton = true; + break; + } + } + } + + if (found_skeleton) { + // Search and insert rot track if it doesn't exist. + for (int prof_idx = 0; prof_idx < prof_skeleton->get_bone_count(); prof_idx++) { + String bone_name = is_renamed ? prof_skeleton->get_bone_name(prof_idx) : String(bone_map->get_skeleton_bone_name(prof_skeleton->get_bone_name(prof_idx))); + if (bone_name == String()) { + continue; + } + int src_idx = src_skeleton->find_bone(bone_name); + if (src_idx == -1) { + continue; + } + String insert_path = track_path + ":" + bone_name; + int rot_track = anim->find_track(insert_path, Animation::TYPE_ROTATION_3D); + if (rot_track == -1) { + int track = anim->add_track(Animation::TYPE_ROTATION_3D); + anim->track_set_path(track, insert_path); + anim->rotation_track_insert_key(track, 0, src_skeleton->get_bone_rest(src_idx).basis.get_rotation_quaternion()); + } + } + } + } + } + } + + // Fix silhouette. + Vector<Transform3D> silhouette_diff; // Transform values to be ignored when overwrite axis. + silhouette_diff.resize(src_skeleton->get_bone_count()); + Transform3D *silhouette_diff_w = silhouette_diff.ptrw(); + if (bool(p_options["retarget/rest_fixer/fix_silhouette/enable"])) { + LocalVector<Transform3D> old_skeleton_global_rest; + for (int i = 0; i < src_skeleton->get_bone_count(); i++) { + old_skeleton_global_rest.push_back(src_skeleton->get_bone_global_rest(i)); + } + + Vector<int> bones_to_process = prof_skeleton->get_parentless_bones(); + while (bones_to_process.size() > 0) { + int prof_idx = bones_to_process[0]; + bones_to_process.erase(prof_idx); + Vector<int> prof_children = prof_skeleton->get_bone_children(prof_idx); + for (int i = 0; i < prof_children.size(); i++) { + bones_to_process.push_back(prof_children[i]); + } + + // Calc virtual/looking direction with origins. + bool is_filtered = false; + for (int i = 0; i < filter.size(); i++) { + if (String(filter[i]) == prof_skeleton->get_bone_name(prof_idx)) { + is_filtered = true; + break; + } + } + if (is_filtered) { + continue; + } + + int src_idx = src_skeleton->find_bone(is_renamed ? prof_skeleton->get_bone_name(prof_idx) : String(bone_map->get_skeleton_bone_name(prof_skeleton->get_bone_name(prof_idx)))); + if (src_idx < 0 || profile->get_tail_direction(prof_idx) == SkeletonProfile::TAIL_DIRECTION_END) { + continue; + } + Vector3 prof_tail; + Vector3 src_tail; + if (profile->get_tail_direction(prof_idx) == SkeletonProfile::TAIL_DIRECTION_AVERAGE_CHILDREN) { + PackedInt32Array prof_bone_children = prof_skeleton->get_bone_children(prof_idx); + int children_size = prof_bone_children.size(); + if (children_size == 0) { + continue; + } + bool exist_all_children = true; + for (int i = 0; i < children_size; i++) { + int prof_child_idx = prof_bone_children[i]; + int src_child_idx = src_skeleton->find_bone(is_renamed ? prof_skeleton->get_bone_name(prof_child_idx) : String(bone_map->get_skeleton_bone_name(prof_skeleton->get_bone_name(prof_child_idx)))); + if (src_child_idx < 0) { + exist_all_children = false; + break; + } + prof_tail = prof_tail + prof_skeleton->get_bone_global_rest(prof_child_idx).origin; + src_tail = src_tail + src_skeleton->get_bone_global_rest(src_child_idx).origin; + } + if (!exist_all_children) { + continue; + } + prof_tail = prof_tail / children_size; + src_tail = src_tail / children_size; + } + if (profile->get_tail_direction(prof_idx) == SkeletonProfile::TAIL_DIRECTION_SPECIFIC_CHILD) { + int prof_tail_idx = prof_skeleton->find_bone(profile->get_bone_tail(prof_idx)); + if (prof_tail_idx < 0) { + continue; + } + int src_tail_idx = src_skeleton->find_bone(is_renamed ? prof_skeleton->get_bone_name(prof_tail_idx) : String(bone_map->get_skeleton_bone_name(prof_skeleton->get_bone_name(prof_tail_idx)))); + if (src_tail_idx < 0) { + continue; + } + prof_tail = prof_skeleton->get_bone_global_rest(prof_tail_idx).origin; + src_tail = src_skeleton->get_bone_global_rest(src_tail_idx).origin; + } + + Vector3 prof_head = prof_skeleton->get_bone_global_rest(prof_idx).origin; + Vector3 src_head = src_skeleton->get_bone_global_rest(src_idx).origin; + + Vector3 prof_dir = prof_tail - prof_head; + Vector3 src_dir = src_tail - src_head; + + // Rotate rest. + if (Math::abs(Math::rad2deg(src_dir.angle_to(prof_dir))) > float(p_options["retarget/rest_fixer/fix_silhouette/threshold"])) { + // Get rotation difference. + Vector3 up_vec; // Need to rotate other than roll axis. + switch (Vector3(abs(src_dir.x), abs(src_dir.y), abs(src_dir.z)).min_axis_index()) { + case Vector3::AXIS_X: { + up_vec = Vector3(1, 0, 0); + } break; + case Vector3::AXIS_Y: { + up_vec = Vector3(0, 1, 0); + } break; + case Vector3::AXIS_Z: { + up_vec = Vector3(0, 0, 1); + } break; + } + Basis src_b; + src_b = src_b.looking_at(src_dir, up_vec); + Basis prof_b; + prof_b = src_b.looking_at(prof_dir, up_vec); + if (prof_b.is_equal_approx(Basis())) { + continue; // May not need to rotate. + } + Basis diff_b = prof_b * src_b.inverse(); + + // Apply rotation difference as global transform to skeleton. + Basis src_pg; + int src_parent = src_skeleton->get_bone_parent(src_idx); + if (src_parent >= 0) { + src_pg = src_skeleton->get_bone_global_rest(src_parent).basis; + } + Transform3D fixed_rest = Transform3D(src_pg.inverse() * diff_b * src_pg * src_skeleton->get_bone_rest(src_idx).basis, src_skeleton->get_bone_rest(src_idx).origin); + src_skeleton->set_bone_rest(src_idx, fixed_rest); + } + } + + // For skin modification in overwrite rest. + for (int i = 0; i < src_skeleton->get_bone_count(); i++) { + silhouette_diff_w[i] = old_skeleton_global_rest[i] * src_skeleton->get_bone_global_rest(i).inverse(); + } + + is_rest_changed = true; + } + + // Overwrite axis. + if (bool(p_options["retarget/rest_fixer/overwrite_axis"])) { + LocalVector<Transform3D> old_skeleton_rest; + LocalVector<Transform3D> old_skeleton_global_rest; + for (int i = 0; i < src_skeleton->get_bone_count(); i++) { + old_skeleton_rest.push_back(src_skeleton->get_bone_rest(i)); + old_skeleton_global_rest.push_back(src_skeleton->get_bone_global_rest(i)); + } + + Vector<Basis> diffs; + diffs.resize(src_skeleton->get_bone_count()); + Basis *diffs_w = diffs.ptrw(); + + Vector<int> bones_to_process = src_skeleton->get_parentless_bones(); + while (bones_to_process.size() > 0) { + int src_idx = bones_to_process[0]; + bones_to_process.erase(src_idx); + Vector<int> src_children = src_skeleton->get_bone_children(src_idx); + for (int i = 0; i < src_children.size(); i++) { + bones_to_process.push_back(src_children[i]); + } + + Basis tgt_rot; + StringName src_bone_name = is_renamed ? StringName(src_skeleton->get_bone_name(src_idx)) : bone_map->find_profile_bone_name(src_skeleton->get_bone_name(src_idx)); + if (src_bone_name != StringName()) { + Basis src_pg; + int src_parent_idx = src_skeleton->get_bone_parent(src_idx); + if (src_parent_idx >= 0) { + src_pg = src_skeleton->get_bone_global_rest(src_parent_idx).basis; + } + + int prof_idx = profile->find_bone(src_bone_name); + if (prof_idx >= 0) { + tgt_rot = src_pg.inverse() * prof_skeleton->get_bone_global_rest(prof_idx).basis; // Mapped bone uses reference pose. + } + /* + // If there is rest-relative animation, this logic may be work fine, but currently not so... + } else { + // tgt_rot = src_pg.inverse() * old_skeleton_global_rest[src_idx].basis; // Non-Mapped bone keeps global rest. + } + */ + } + + if (src_skeleton->get_bone_parent(src_idx) >= 0) { + diffs_w[src_idx] = tgt_rot.inverse() * diffs[src_skeleton->get_bone_parent(src_idx)] * src_skeleton->get_bone_rest(src_idx).basis; + } else { + diffs_w[src_idx] = tgt_rot.inverse() * src_skeleton->get_bone_rest(src_idx).basis; + } + + Basis diff; + if (src_skeleton->get_bone_parent(src_idx) >= 0) { + diff = diffs[src_skeleton->get_bone_parent(src_idx)]; + } + src_skeleton->set_bone_rest(src_idx, Transform3D(tgt_rot, diff.xform(src_skeleton->get_bone_rest(src_idx).origin))); + } + + // Fix skin. + { + TypedArray<Node> nodes = p_base_scene->find_children("*", "ImporterMeshInstance3D"); + while (nodes.size()) { + ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(nodes.pop_back()); + Ref<Skin> skin = mi->get_skin(); + if (skin.is_valid()) { + Node *node = mi->get_node(mi->get_skeleton_path()); + if (node) { + Skeleton3D *mesh_skeleton = Object::cast_to<Skeleton3D>(node); + if (mesh_skeleton && node == src_skeleton) { + int skin_len = skin->get_bind_count(); + for (int i = 0; i < skin_len; i++) { + StringName bn = skin->get_bind_name(i); + int bone_idx = src_skeleton->find_bone(bn); + if (bone_idx >= 0) { + Transform3D new_rest = silhouette_diff[i] * src_skeleton->get_bone_global_rest(bone_idx); + skin->set_bind_pose(i, new_rest.inverse()); + } + } + } + } + } + } + } + + // Fix animation. + { + TypedArray<Node> nodes = p_base_scene->find_children("*", "AnimationPlayer"); + while (nodes.size()) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(nodes.pop_back()); + List<StringName> anims; + ap->get_animation_list(&anims); + for (const StringName &name : anims) { + Ref<Animation> anim = ap->get_animation(name); + int track_len = anim->get_track_count(); + for (int i = 0; i < track_len; i++) { + if (anim->track_get_path(i).get_subname_count() != 1 || anim->track_get_type(i) != Animation::TYPE_ROTATION_3D) { + continue; + } + + if (anim->track_is_compressed(i)) { + continue; // TODO: Adopt to compressed track. + } + + String track_path = String(anim->track_get_path(i).get_concatenated_names()); + Node *node = (ap->get_node(ap->get_root()))->get_node(NodePath(track_path)); + if (node) { + Skeleton3D *track_skeleton = Object::cast_to<Skeleton3D>(node); + if (track_skeleton && track_skeleton == src_skeleton) { + StringName bn = anim->track_get_path(i).get_subname(0); + if (bn) { + int bone_idx = src_skeleton->find_bone(bn); + + Quaternion old_rest = old_skeleton_rest[bone_idx].basis.get_rotation_quaternion(); + Quaternion new_rest = src_skeleton->get_bone_rest(bone_idx).basis.get_rotation_quaternion(); + Quaternion old_pg; + Quaternion new_pg; + int parent_idx = src_skeleton->get_bone_parent(bone_idx); + if (parent_idx >= 0) { + old_pg = old_skeleton_global_rest[parent_idx].basis.get_rotation_quaternion(); + new_pg = src_skeleton->get_bone_global_rest(parent_idx).basis.get_rotation_quaternion(); + } + + int key_len = anim->track_get_key_count(i); + for (int j = 0; j < key_len; j++) { + Quaternion qt = static_cast<Quaternion>(anim->track_get_key_value(i, j)); + anim->track_set_key_value(i, j, new_pg.inverse() * old_pg * qt * old_rest.inverse() * old_pg.inverse() * new_pg * new_rest); + } + } + } + } + } + } + } + } + + is_rest_changed = true; + } + + // Init skeleton pose to new rest. + if (is_rest_changed) { + for (int i = 0; i < src_skeleton->get_bone_count(); i++) { + Transform3D fixed_rest = src_skeleton->get_bone_rest(i); + src_skeleton->set_bone_pose_position(i, fixed_rest.origin); + src_skeleton->set_bone_pose_rotation(i, fixed_rest.basis.get_rotation_quaternion()); + src_skeleton->set_bone_pose_scale(i, fixed_rest.basis.get_scale()); + } + } + + memdelete(prof_skeleton); + } +} + +PostImportPluginSkeletonRestFixer::PostImportPluginSkeletonRestFixer() { +} diff --git a/editor/import/post_import_plugin_skeleton_rest_fixer.h b/editor/import/post_import_plugin_skeleton_rest_fixer.h new file mode 100644 index 0000000000..11e9d08e88 --- /dev/null +++ b/editor/import/post_import_plugin_skeleton_rest_fixer.h @@ -0,0 +1,46 @@ +/*************************************************************************/ +/* post_import_plugin_skeleton_rest_fixer.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef POST_IMPORT_PLUGIN_SKELETON_REST_FIXER_H +#define POST_IMPORT_PLUGIN_SKELETON_REST_FIXER_H + +#include "resource_importer_scene.h" + +class PostImportPluginSkeletonRestFixer : public EditorScenePostImportPlugin { + GDCLASS(PostImportPluginSkeletonRestFixer, EditorScenePostImportPlugin); + +public: + virtual void get_internal_import_options(InternalImportCategory p_category, List<ResourceImporter::ImportOption> *r_options) override; + virtual void internal_process(InternalImportCategory p_category, Node *p_base_scene, Node *p_node, Ref<Resource> p_resource, const Dictionary &p_options) override; + + PostImportPluginSkeletonRestFixer(); +}; + +#endif // POST_IMPORT_PLUGIN_SKELETON_REST_FIXER_H diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp index b682407307..0e2967dc42 100644 --- a/editor/import/scene_import_settings.cpp +++ b/editor/import/scene_import_settings.cpp @@ -1059,7 +1059,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) { } external_paths->set_title(TTR("Extract Materials to Resource Files")); - external_paths->get_ok_button()->set_text(TTR("Extract")); + external_paths->set_ok_button_text(TTR("Extract")); } break; case ACTION_CHOOSE_MESH_SAVE_PATHS: { for (const KeyValue<String, MeshData> &E : mesh_map) { @@ -1112,7 +1112,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) { } external_paths->set_title(TTR("Set paths to save meshes as resource files on Reimport")); - external_paths->get_ok_button()->set_text(TTR("Set Paths")); + external_paths->set_ok_button_text(TTR("Set Paths")); } break; case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { for (const KeyValue<String, AnimationData> &E : animation_map) { @@ -1158,7 +1158,7 @@ void SceneImportSettings::_save_dir_callback(const String &p_path) { } external_paths->set_title(TTR("Set paths to save animations as resource files on Reimport")); - external_paths->get_ok_button()->set_text(TTR("Set Paths")); + external_paths->set_ok_button_text(TTR("Set Paths")); } break; } @@ -1347,8 +1347,8 @@ SceneImportSettings::SceneImportSettings() { scene_import_settings_data = memnew(SceneImportSettingsData); - get_ok_button()->set_text(TTR("Reimport")); - get_cancel_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Reimport")); + set_cancel_button_text(TTR("Close")); external_paths = memnew(ConfirmationDialog); add_child(external_paths); @@ -1382,8 +1382,8 @@ SceneImportSettings::SceneImportSettings() { item_save_path = memnew(EditorFileDialog); item_save_path->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); - item_save_path->add_filter("*.tres; " + TTR("Text Resource")); - item_save_path->add_filter("*.res; " + TTR("Binary Resource")); + item_save_path->add_filter("*.tres", TTR("Text Resource")); + item_save_path->add_filter("*.res", TTR("Binary Resource")); add_child(item_save_path); item_save_path->connect("file_selected", callable_mp(this, &SceneImportSettings::_save_path_changed)); diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 6bb71ff491..f9e5885f9d 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -671,7 +671,7 @@ ImportDock::ImportDock() { advanced->connect("pressed", callable_mp(this, &ImportDock::_advanced_options)); reimport_confirm = memnew(ConfirmationDialog); - reimport_confirm->get_ok_button()->set_text(TTR("Save Scenes, Re-Import, and Restart")); + reimport_confirm->set_ok_button_text(TTR("Save Scenes, Re-Import, and Restart")); content->add_child(reimport_confirm); reimport_confirm->connect("confirmed", callable_mp(this, &ImportDock::_reimport_and_restart)); diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp index ad92911810..a509cf3d8f 100644 --- a/editor/inspector_dock.cpp +++ b/editor/inspector_dock.cpp @@ -219,12 +219,12 @@ void InspectorDock::_load_resource(const String &p_type) { load_resource_dialog->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - load_resource_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + load_resource_dialog->add_filter("*." + extensions[i], extensions[i].to_upper()); } const Vector<String> textfile_ext = ((String)(EditorSettings::get_singleton()->get("docks/filesystem/textfile_extensions"))).split(",", false); for (int i = 0; i < textfile_ext.size(); i++) { - load_resource_dialog->add_filter("*." + textfile_ext[i] + " ; " + textfile_ext[i].to_upper()); + load_resource_dialog->add_filter("*." + textfile_ext[i], textfile_ext[i].to_upper()); } load_resource_dialog->popup_file_dialog(); diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index 77e4905341..7061204832 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -200,7 +200,7 @@ void PluginConfigDialog::config(const String &p_config_path) { _on_required_text_changed(""); get_ok_button()->set_disabled(!_edit_mode); - get_ok_button()->set_text(_edit_mode ? TTR("Update") : TTR("Create")); + set_ok_button_text(_edit_mode ? TTR("Update") : TTR("Create")); } void PluginConfigDialog::_bind_methods() { diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index affe46aaae..a5ca55f6df 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -733,7 +733,7 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(bool p_wip_destructive) { create_resource = memnew(ConfirmationDialog); add_child(create_resource); - create_resource->get_ok_button()->set_text(TTR("Create")); + create_resource->set_ok_button_text(TTR("Create")); } void AbstractPolygon2DEditorPlugin::edit(Object *p_object) { diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index 248ba021ce..d397c6da67 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -314,6 +314,8 @@ void AnimationNodeBlendSpace1DEditor::_update_space() { max_value->set_value(blend_space->get_max_space()); min_value->set_value(blend_space->get_min_space()); + sync->set_pressed(blend_space->is_using_sync()); + label_value->set_text(blend_space->get_value_label()); snap_value->set_value(blend_space->get_snap()); @@ -329,13 +331,15 @@ void AnimationNodeBlendSpace1DEditor::_config_changed(double) { } updating = true; - undo_redo->create_action(TTR("Change BlendSpace1D Limits")); + undo_redo->create_action(TTR("Change BlendSpace1D Config")); undo_redo->add_do_method(blend_space.ptr(), "set_max_space", max_value->get_value()); undo_redo->add_undo_method(blend_space.ptr(), "set_max_space", blend_space->get_max_space()); undo_redo->add_do_method(blend_space.ptr(), "set_min_space", min_value->get_value()); undo_redo->add_undo_method(blend_space.ptr(), "set_min_space", blend_space->get_min_space()); undo_redo->add_do_method(blend_space.ptr(), "set_snap", snap_value->get_value()); undo_redo->add_undo_method(blend_space.ptr(), "set_snap", blend_space->get_snap()); + undo_redo->add_do_method(blend_space.ptr(), "set_use_sync", sync->is_pressed()); + undo_redo->add_undo_method(blend_space.ptr(), "set_use_sync", blend_space->is_using_sync()); undo_redo->add_do_method(this, "_update_space"); undo_redo->add_undo_method(this, "_update_space"); undo_redo->commit_action(); @@ -650,6 +654,12 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() { snap_value->set_step(0.01); snap_value->set_max(1000); + top_hb->add_child(memnew(VSeparator)); + top_hb->add_child(memnew(Label(TTR("Sync:")))); + sync = memnew(CheckBox); + top_hb->add_child(sync); + sync->connect("toggled", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_config_changed)); + edit_hb = memnew(HBoxContainer); top_hb->add_child(edit_hb); edit_hb->add_child(memnew(VSeparator)); diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h index 2f7dee65fc..3488b4bf30 100644 --- a/editor/plugins/animation_blend_space_1d_editor.h +++ b/editor/plugins/animation_blend_space_1d_editor.h @@ -61,6 +61,8 @@ class AnimationNodeBlendSpace1DEditor : public AnimationTreeNodeEditorPlugin { SpinBox *max_value = nullptr; SpinBox *min_value = nullptr; + CheckBox *sync = nullptr; + HBoxContainer *edit_hb = nullptr; SpinBox *edit_value = nullptr; Button *open_editor = nullptr; diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index dfde63ecb6..51aaa4f010 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -595,6 +595,7 @@ void AnimationNodeBlendSpace2DEditor::_update_space() { auto_triangles->set_pressed(blend_space->get_auto_triangles()); + sync->set_pressed(blend_space->is_using_sync()); interpolation->select(blend_space->get_blend_mode()); max_x_value->set_value(blend_space->get_max_space().x); @@ -620,13 +621,15 @@ void AnimationNodeBlendSpace2DEditor::_config_changed(double) { } updating = true; - undo_redo->create_action(TTR("Change BlendSpace2D Limits")); + undo_redo->create_action(TTR("Change BlendSpace2D Config")); undo_redo->add_do_method(blend_space.ptr(), "set_max_space", Vector2(max_x_value->get_value(), max_y_value->get_value())); undo_redo->add_undo_method(blend_space.ptr(), "set_max_space", blend_space->get_max_space()); undo_redo->add_do_method(blend_space.ptr(), "set_min_space", Vector2(min_x_value->get_value(), min_y_value->get_value())); undo_redo->add_undo_method(blend_space.ptr(), "set_min_space", blend_space->get_min_space()); undo_redo->add_do_method(blend_space.ptr(), "set_snap", Vector2(snap_x->get_value(), snap_y->get_value())); undo_redo->add_undo_method(blend_space.ptr(), "set_snap", blend_space->get_snap()); + undo_redo->add_do_method(blend_space.ptr(), "set_use_sync", sync->is_pressed()); + undo_redo->add_undo_method(blend_space.ptr(), "set_use_sync", blend_space->is_using_sync()); undo_redo->add_do_method(blend_space.ptr(), "set_blend_mode", interpolation->get_selected()); undo_redo->add_undo_method(blend_space.ptr(), "set_blend_mode", blend_space->get_blend_mode()); undo_redo->add_do_method(this, "_update_space"); @@ -899,6 +902,13 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() { top_hb->add_child(memnew(VSeparator)); + top_hb->add_child(memnew(Label(TTR("Sync:")))); + sync = memnew(CheckBox); + top_hb->add_child(sync); + sync->connect("toggled", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_config_changed)); + + top_hb->add_child(memnew(VSeparator)); + top_hb->add_child(memnew(Label(TTR("Blend:")))); interpolation = memnew(OptionButton); top_hb->add_child(interpolation); diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h index db54e84254..88b9072599 100644 --- a/editor/plugins/animation_blend_space_2d_editor.h +++ b/editor/plugins/animation_blend_space_2d_editor.h @@ -55,6 +55,7 @@ class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin { Button *snap = nullptr; SpinBox *snap_x = nullptr; SpinBox *snap_y = nullptr; + CheckBox *sync = nullptr; OptionButton *interpolation = nullptr; Button *auto_triangles = nullptr; diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 8d1755d260..3d4701a54a 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -1688,7 +1688,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plug name_dialog->register_text_enter(name); error_dialog = memnew(ConfirmationDialog); - error_dialog->get_ok_button()->set_text(TTR("Close")); + error_dialog->set_ok_button_text(TTR("Close")); error_dialog->set_title(TTR("Error!")); add_child(error_dialog); @@ -1696,7 +1696,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plug blend_editor.dialog = memnew(AcceptDialog); add_child(blend_editor.dialog); - blend_editor.dialog->get_ok_button()->set_text(TTR("Close")); + blend_editor.dialog->set_ok_button_text(TTR("Close")); blend_editor.dialog->set_hide_on_ok(true); VBoxContainer *blend_vb = memnew(VBoxContainer); blend_editor.dialog->add_child(blend_vb); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 12ab9e3b61..bc95624dd5 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -307,8 +307,8 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() { preview_hb->set_v_size_flags(Control::SIZE_EXPAND_FILL); previews->add_child(preview_hb); - get_ok_button()->set_text(TTR("Download")); - get_cancel_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Download")); + set_cancel_button_text(TTR("Close")); } /////////////////////////////////////////////////////////////////////////////////// @@ -1293,14 +1293,14 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const EditorAssetLibraryItemDownload *download_item = _get_asset_in_progress(description->get_asset_id()); if (download_item) { if (download_item->can_install()) { - description->get_ok_button()->set_text(TTR("Install")); + description->set_ok_button_text(TTR("Install")); description->get_ok_button()->set_disabled(false); } else { - description->get_ok_button()->set_text(TTR("Downloading...")); + description->set_ok_button_text(TTR("Downloading...")); description->get_ok_button()->set_disabled(true); } } else { - description->get_ok_button()->set_text(TTR("Download")); + description->set_ok_button_text(TTR("Download")); description->get_ok_button()->set_disabled(false); } @@ -1584,7 +1584,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { asset_open = memnew(EditorFileDialog); asset_open->set_access(EditorFileDialog::ACCESS_FILESYSTEM); - asset_open->add_filter("*.zip ; " + TTR("Assets ZIP File")); + asset_open->add_filter("*.zip", TTR("Assets ZIP File")); asset_open->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); add_child(asset_open); asset_open->connect("file_selected", callable_mp(this, &EditorAssetLibrary::_asset_file_selected)); diff --git a/editor/plugins/bone_map_editor_plugin.cpp b/editor/plugins/bone_map_editor_plugin.cpp index fffadae3eb..967a95be9d 100644 --- a/editor/plugins/bone_map_editor_plugin.cpp +++ b/editor/plugins/bone_map_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "editor/editor_scale.h" #include "editor/import/post_import_plugin_skeleton_renamer.h" +#include "editor/import/post_import_plugin_skeleton_rest_fixer.h" #include "editor/import/scene_import_settings.h" void BoneMapperButton::fetch_textures() { @@ -71,6 +72,10 @@ void BoneMapperButton::set_state(BoneMapState p_state) { } } +bool BoneMapperButton::is_require() const { + return require; +} + void BoneMapperButton::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { @@ -79,8 +84,9 @@ void BoneMapperButton::_notification(int p_what) { } } -BoneMapperButton::BoneMapperButton(const StringName p_profile_bone_name, bool p_selected) { +BoneMapperButton::BoneMapperButton(const StringName p_profile_bone_name, bool p_require, bool p_selected) { profile_bone_name = p_profile_bone_name; + require = p_require; selected = p_selected; } @@ -89,7 +95,7 @@ BoneMapperButton::~BoneMapperButton() { void BoneMapperItem::create_editor() { skeleton_bone_selector = memnew(EditorPropertyTextEnum); - skeleton_bone_selector->setup(skeleton_bone_names); + skeleton_bone_selector->setup(skeleton_bone_names, false, true); skeleton_bone_selector->set_label(profile_bone_name); skeleton_bone_selector->set_selectable(false); skeleton_bone_selector->set_object_and_property(bone_map.ptr(), "bone_map/" + String(profile_bone_name)); @@ -251,7 +257,7 @@ void BoneMapper::recreate_editor() { for (int i = 0; i < len; i++) { if (profile->get_group(i) == profile->get_group_name(current_group_idx)) { - BoneMapperButton *mb = memnew(BoneMapperButton(profile->get_bone_name(i), current_bone_idx == i)); + BoneMapperButton *mb = memnew(BoneMapperButton(profile->get_bone_name(i), profile->is_require(i), current_bone_idx == i)); mb->connect("pressed", callable_mp(this, &BoneMapper::set_current_bone_idx), varray(i), CONNECT_DEFERRED); mb->set_h_grow_direction(GROW_DIRECTION_BOTH); mb->set_v_grow_direction(GROW_DIRECTION_BOTH); @@ -284,8 +290,6 @@ void BoneMapper::recreate_items() { Ref<SkeletonProfile> profile = bone_map->get_profile(); if (profile.is_valid()) { PackedStringArray skeleton_bone_names; - skeleton_bone_names.push_back(String()); - int len = skeleton->get_bone_count(); for (int i = 0; i < len; i++) { skeleton_bone_names.push_back(skeleton->get_bone_name(i)); @@ -314,7 +318,11 @@ void BoneMapper::_update_state() { bone_mapper_buttons[i]->set_state(BoneMapperButton::BONE_MAP_STATE_ERROR); } } else { - bone_mapper_buttons[i]->set_state(BoneMapperButton::BONE_MAP_STATE_UNSET); + if (bone_mapper_buttons[i]->is_require()) { + bone_mapper_buttons[i]->set_state(BoneMapperButton::BONE_MAP_STATE_ERROR); + } else { + bone_mapper_buttons[i]->set_state(BoneMapperButton::BONE_MAP_STATE_UNSET); + } } } } @@ -396,9 +404,12 @@ void BoneMapEditor::_notification(int p_what) { create_editors(); } break; case NOTIFICATION_EXIT_TREE: { + if (!bone_mapper) { + return; + } remove_child(bone_mapper); bone_mapper->queue_delete(); - } + } break; } } @@ -436,4 +447,8 @@ BoneMapEditorPlugin::BoneMapEditorPlugin() { Ref<PostImportPluginSkeletonRenamer> post_import_plugin_renamer; post_import_plugin_renamer.instantiate(); add_scene_post_import_plugin(post_import_plugin_renamer); + + Ref<PostImportPluginSkeletonRestFixer> post_import_plugin_rest_fixer; + post_import_plugin_rest_fixer.instantiate(); + add_scene_post_import_plugin(post_import_plugin_rest_fixer); } diff --git a/editor/plugins/bone_map_editor_plugin.h b/editor/plugins/bone_map_editor_plugin.h index 0ec9f74373..e1ea6b4060 100644 --- a/editor/plugins/bone_map_editor_plugin.h +++ b/editor/plugins/bone_map_editor_plugin.h @@ -53,6 +53,7 @@ public: private: StringName profile_bone_name; bool selected = false; + bool require = false; TextureRect *circle; @@ -65,7 +66,9 @@ public: StringName get_profile_bone_name() const; void set_state(BoneMapState p_state); - BoneMapperButton(const StringName p_profile_bone_name, bool p_selected); + bool is_require() const; + + BoneMapperButton(const StringName p_profile_bone_name, bool p_require, bool p_selected); ~BoneMapperButton(); }; diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 7e525a4698..9723fece5e 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1201,7 +1201,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1369,14 +1369,14 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { drag_selection[0]->get_name(), drag_selection[0]->_edit_get_pivot().x, drag_selection[0]->_edit_get_pivot().y)); - drag_type = DRAG_NONE; + _reset_drag(); return true; } // Cancel a drag if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1452,14 +1452,14 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { _insert_animation_keys(false, true, false, true); } - drag_type = DRAG_NONE; + _reset_drag(); return true; } // Cancel a drag if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1614,14 +1614,14 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { _commit_canvas_item_state( drag_selection, vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection[0]->get_name())); - drag_type = DRAG_NONE; + _reset_drag(); return true; } // Cancel a drag if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1820,7 +1820,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1830,7 +1830,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { _restore_canvas_item_state(drag_selection); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1959,7 +1959,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { _insert_animation_keys(false, false, true, true); } - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -1967,7 +1967,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { // Cancel a drag if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -2092,7 +2092,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -2102,7 +2102,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { _restore_canvas_item_state(drag_selection, true); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -2209,7 +2209,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { drag_selection[0]->_edit_get_position().y), true); } - drag_type = DRAG_NONE; + _reset_drag(); } viewport->update(); return true; @@ -2360,7 +2360,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_QUEUED) { if (b.is_valid() && !b->is_pressed()) { - drag_type = DRAG_NONE; + _reset_drag(); return true; } if (m.is_valid()) { @@ -2411,14 +2411,14 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } } - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } if (b.is_valid() && b->is_pressed() && b->get_button_index() == MouseButton::RIGHT) { // Cancel box selection - drag_type = DRAG_NONE; + _reset_drag(); viewport->update(); return true; } @@ -3645,7 +3645,7 @@ void CanvasItemEditor::_draw_hover() { } void CanvasItemEditor::_draw_transform_message() { - if (drag_selection.is_empty() || !drag_selection.front()->get()) { + if (drag_type == DRAG_NONE || drag_selection.is_empty() || !drag_selection.front()->get()) { return; } String transform_message; @@ -3981,7 +3981,7 @@ void CanvasItemEditor::_notification(int p_what) { void CanvasItemEditor::_selection_changed() { if (!selected_from_canvas) { - drag_type = DRAG_NONE; + _reset_drag(); } selected_from_canvas = false; } @@ -3989,7 +3989,7 @@ void CanvasItemEditor::_selection_changed() { void CanvasItemEditor::edit(CanvasItem *p_canvas_item) { Array selection = editor_selection->get_selected_nodes(); if (selection.size() != 1 || Object::cast_to<Node>(selection[0]) != p_canvas_item) { - drag_type = DRAG_NONE; + _reset_drag(); // Clear the selection editor_selection->clear(); //_clear_canvas_items(); @@ -4701,6 +4701,11 @@ void CanvasItemEditor::_focus_selection(int p_op) { } } +void CanvasItemEditor::_reset_drag() { + drag_type = DRAG_NONE; + drag_selection.clear(); +} + void CanvasItemEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_override_camera_button", "game_running"), &CanvasItemEditor::_update_override_camera_button); ClassDB::bind_method("_get_editor_data", &CanvasItemEditor::_get_editor_data); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 5f50882dba..83685baf7a 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -455,8 +455,8 @@ private: void _update_cursor(); void _selection_changed(); - void _focus_selection(int p_op); + void _reset_drag(); SnapTarget snap_target[2]; Transform2D snap_transform; diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp index 79025041d3..a7c3c32120 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp @@ -257,7 +257,7 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin() { List<String> ext; ImageLoader::get_recognized_extensions(&ext); for (const String &E : ext) { - file->add_filter("*." + E + "; " + E.to_upper()); + file->add_filter("*." + E, E.to_upper()); } file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); toolbar->add_child(file); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index a255c12ed4..8e6687c836 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -380,7 +380,7 @@ GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin() { List<String> ext; ImageLoader::get_recognized_extensions(&ext); for (const String &E : ext) { - file->add_filter("*." + E + "; " + E.to_upper()); + file->add_filter("*." + E, E.to_upper()); } file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); toolbar->add_child(file); diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index 5461fda58b..6750f1aa9c 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -215,7 +215,7 @@ GPUParticles3DEditorBase::GPUParticles3DEditorBase() { emission_fill->add_item(TTR("Volume")); emd_vb->add_margin_child(TTR("Emission Source:"), emission_fill); - emission_dialog->get_ok_button()->set_text(TTR("Create")); + emission_dialog->set_ok_button_text(TTR("Create")); emission_dialog->connect("confirmed", callable_mp(this, &GPUParticles3DEditorBase::_generate_emission_points)); emission_tree_dialog = memnew(SceneTreeDialog); diff --git a/editor/plugins/gradient_texture_2d_editor_plugin.cpp b/editor/plugins/gradient_texture_2d_editor_plugin.cpp index e97c611e96..df45d6c290 100644 --- a/editor/plugins/gradient_texture_2d_editor_plugin.cpp +++ b/editor/plugins/gradient_texture_2d_editor_plugin.cpp @@ -117,17 +117,15 @@ void GradientTexture2DEditorRect::_notification(int p_what) { const Ref<Texture2D> fill_to_icon = get_theme_icon(SNAME("EditorPathSharpHandle"), SNAME("EditorIcons")); handle_size = fill_from_icon->get_size(); - const int MAX_HEIGHT = 250 * EDSCALE; Size2 rect_size = get_size(); // Get the size and position to draw the texture and handles at. - size = Size2(texture->get_width() * MAX_HEIGHT / texture->get_height(), MAX_HEIGHT); + size = Size2(texture->get_width() * rect_size.height / texture->get_height(), rect_size.height); if (size.width > rect_size.width) { size.width = rect_size.width; - size.height = texture->get_height() * rect_size.width / texture->get_width(); + size.height = texture->get_height() * size.width / texture->get_width(); } - offset = Point2(Math::round((rect_size.width - size.width) / 2), 0) + handle_size / 2; - set_custom_minimum_size(Size2(0, size.height)); + offset = ((rect_size - size + handle_size) / 2).round(); size -= handle_size; checkerboard->set_rect(Rect2(offset, size)); @@ -183,6 +181,8 @@ GradientTexture2DEditorRect::GradientTexture2DEditorRect() { checkerboard->set_stretch_mode(TextureRect::STRETCH_TILE); checkerboard->set_draw_behind_parent(true); add_child(checkerboard); + + set_custom_minimum_size(Size2(0, 250 * EDSCALE)); } /////////////////////// diff --git a/editor/plugins/lightmap_gi_editor_plugin.cpp b/editor/plugins/lightmap_gi_editor_plugin.cpp index aef97f059a..8413c5e875 100644 --- a/editor/plugins/lightmap_gi_editor_plugin.cpp +++ b/editor/plugins/lightmap_gi_editor_plugin.cpp @@ -138,7 +138,7 @@ LightmapGIEditorPlugin::LightmapGIEditorPlugin() { file_dialog = memnew(EditorFileDialog); file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); - file_dialog->add_filter("*.lmbake ; " + TTR("LightMap Bake")); + file_dialog->add_filter("*.lmbake", TTR("LightMap Bake")); file_dialog->set_title(TTR("Select lightmap bake file:")); file_dialog->connect("file_selected", callable_mp(this, &LightmapGIEditorPlugin::_bake_select_file)); bake->add_child(file_dialog); diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index d1f858315c..5fb885ad1f 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -519,7 +519,7 @@ MeshInstance3DEditor::MeshInstance3DEditor() { outline_dialog = memnew(ConfirmationDialog); outline_dialog->set_title(TTR("Create Outline Mesh")); - outline_dialog->get_ok_button()->set_text(TTR("Create")); + outline_dialog->set_ok_button_text(TTR("Create")); VBoxContainer *outline_dialog_vbc = memnew(VBoxContainer); outline_dialog->add_child(outline_dialog_vbc); diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index 914ccb54c1..72bfc05270 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -263,7 +263,7 @@ MeshLibraryEditor::MeshLibraryEditor() { file->clear_filters(); file->set_title(TTR("Import Scene")); for (int i = 0; i < extensions.size(); i++) { - file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file->add_filter("*." + extensions[i], extensions[i].to_upper()); } add_child(file); file->connect("file_selected", callable_mp(this, &MeshLibraryEditor::_import_scene_cbk)); @@ -288,7 +288,7 @@ MeshLibraryEditor::MeshLibraryEditor() { cd_remove->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_remove_confirm)); cd_update = memnew(ConfirmationDialog); add_child(cd_update); - cd_update->get_ok_button()->set_text(TTR("Apply without Transforms")); + cd_update->set_ok_button_text(TTR("Apply without Transforms")); cd_update->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_update_confirm), varray(false)); cd_update->add_button(TTR("Apply with Transforms"))->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_update_confirm), varray(true)); } diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp index 0fab3aed0d..7207390922 100644 --- a/editor/plugins/multimesh_editor_plugin.cpp +++ b/editor/plugins/multimesh_editor_plugin.cpp @@ -347,7 +347,7 @@ MultiMeshEditor::MultiMeshEditor() { populate_amount->set_value(128); vbc->add_margin_child(TTR("Amount:"), populate_amount); - populate_dialog->get_ok_button()->set_text(TTR("Populate")); + populate_dialog->set_ok_button_text(TTR("Populate")); populate_dialog->get_ok_button()->connect("pressed", callable_mp(this, &MultiMeshEditor::_populate)); std = memnew(SceneTreeDialog); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 99c492379d..7530f88fef 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -2379,19 +2379,19 @@ void Node3DEditorPlugin::edited_scene_changed() { void Node3DEditorViewport::_project_settings_changed() { //update shadow atlas if changed - int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/size"); - bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/16_bits"); - int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_0_subdiv"); - int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_1_subdiv"); - int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_2_subdiv"); - int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_3_subdiv"); - - viewport->set_shadow_atlas_size(shadowmap_size); - viewport->set_shadow_atlas_16_bits(shadowmap_16_bits); - viewport->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0)); - viewport->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1)); - viewport->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2)); - viewport->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3)); + int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_size"); + bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_16_bits"); + int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_quadrant_0_subdiv"); + int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_quadrant_1_subdiv"); + int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_quadrant_2_subdiv"); + int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/shadows/positional_shadow/atlas_quadrant_3_subdiv"); + + viewport->set_positional_shadow_atlas_size(shadowmap_size); + viewport->set_positional_shadow_atlas_16_bits(shadowmap_16_bits); + viewport->set_positional_shadow_atlas_quadrant_subdiv(0, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q0)); + viewport->set_positional_shadow_atlas_quadrant_subdiv(1, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q1)); + viewport->set_positional_shadow_atlas_quadrant_subdiv(2, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q2)); + viewport->set_positional_shadow_atlas_quadrant_subdiv(3, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q3)); _update_shrink(); diff --git a/editor/plugins/occluder_instance_3d_editor_plugin.cpp b/editor/plugins/occluder_instance_3d_editor_plugin.cpp index d5fc51aea4..365f74d7a3 100644 --- a/editor/plugins/occluder_instance_3d_editor_plugin.cpp +++ b/editor/plugins/occluder_instance_3d_editor_plugin.cpp @@ -113,7 +113,7 @@ OccluderInstance3DEditorPlugin::OccluderInstance3DEditorPlugin() { file_dialog = memnew(EditorFileDialog); file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); - file_dialog->add_filter("*.occ ; Occluder3D"); + file_dialog->add_filter("*.occ", "Occluder3D"); file_dialog->set_title(TTR("Select occluder bake file:")); file_dialog->connect("file_selected", callable_mp(this, &OccluderInstance3DEditorPlugin::_bake_select_file)); bake->add_child(file_dialog); diff --git a/editor/plugins/replication_editor_plugin.cpp b/editor/plugins/replication_editor_plugin.cpp index 72fe3c5f20..9e495c3aa3 100644 --- a/editor/plugins/replication_editor_plugin.cpp +++ b/editor/plugins/replication_editor_plugin.cpp @@ -171,7 +171,7 @@ ReplicationEditor::ReplicationEditor() { add_child(delete_dialog); error_dialog = memnew(AcceptDialog); - error_dialog->get_ok_button()->set_text(TTR("Close")); + error_dialog->set_ok_button_text(TTR("Close")); error_dialog->set_title(TTR("Error!")); add_child(error_dialog); diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp index 79fc304242..4e528ef066 100644 --- a/editor/plugins/resource_preloader_editor_plugin.cpp +++ b/editor/plugins/resource_preloader_editor_plugin.cpp @@ -57,7 +57,7 @@ void ResourcePreloaderEditor::_files_load_request(const Vector<String> &p_paths) dialog->set_text(TTR("ERROR: Couldn't load resource!")); dialog->set_title(TTR("Error!")); //dialog->get_cancel()->set_text("Close"); - dialog->get_ok_button()->set_text(TTR("Close")); + dialog->set_ok_button_text(TTR("Close")); dialog->popup_centered(); return; ///beh should show an error i guess } @@ -139,7 +139,7 @@ void ResourcePreloaderEditor::_paste_pressed() { if (!r.is_valid()) { dialog->set_text(TTR("Resource clipboard is empty!")); dialog->set_title(TTR("Error!")); - dialog->get_ok_button()->set_text(TTR("Close")); + dialog->set_ok_button_text(TTR("Close")); dialog->popup_centered(); return; ///beh should show an error i guess } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 6ab2366a44..f4d42ff456 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -377,7 +377,7 @@ ScriptEditorQuickOpen::ScriptEditorQuickOpen() { search_box->connect("gui_input", callable_mp(this, &ScriptEditorQuickOpen::_sbox_input)); search_options = memnew(Tree); vbc->add_margin_child(TTR("Matches:"), search_options, true); - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); get_ok_button()->set_disabled(true); register_text_enter(search_box); set_hide_on_ok(false); @@ -1188,7 +1188,7 @@ void ScriptEditor::_menu_option(int p_option) { file_dialog->clear_filters(); for (const String &E : textfile_extensions) { - file_dialog->add_filter("*." + E + " ; " + E.to_upper()); + file_dialog->add_filter("*." + E, E.to_upper()); } file_dialog->popup_file_dialog(); file_dialog->set_title(TTR("New Text File...")); @@ -1203,11 +1203,11 @@ void ScriptEditor::_menu_option(int p_option) { ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); file_dialog->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + file_dialog->add_filter("*." + extensions[i], extensions[i].to_upper()); } for (const String &E : textfile_extensions) { - file_dialog->add_filter("*." + E + " ; " + E.to_upper()); + file_dialog->add_filter("*." + E, E.to_upper()); } file_dialog->popup_file_dialog(); @@ -3883,7 +3883,7 @@ ScriptEditor::ScriptEditor() { tab_container->connect("tab_changed", callable_mp(this, &ScriptEditor::_tab_changed)); erase_tab_confirm = memnew(ConfirmationDialog); - erase_tab_confirm->get_ok_button()->set_text(TTR("Save")); + erase_tab_confirm->set_ok_button_text(TTR("Save")); erase_tab_confirm->add_button(TTR("Discard"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "discard"); erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab), varray(true)); erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab)); @@ -3916,7 +3916,7 @@ ScriptEditor::ScriptEditor() { disk_changed_list->set_v_size_flags(SIZE_EXPAND_FILL); disk_changed->connect("confirmed", callable_mp(this, &ScriptEditor::_reload_scripts)); - disk_changed->get_ok_button()->set_text(TTR("Reload")); + disk_changed->set_ok_button_text(TTR("Reload")); disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); disk_changed->connect("custom_action", callable_mp(this, &ScriptEditor::_resave_scripts)); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 04b407ce65..d79d2e9012 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -830,7 +830,7 @@ ShaderEditor::ShaderEditor() { vbc->add_child(dl); disk_changed->connect("confirmed", callable_mp(this, &ShaderEditor::_reload_shader_from_disk)); - disk_changed->get_ok_button()->set_text(TTR("Reload")); + disk_changed->set_ok_button_text(TTR("Reload")); disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); disk_changed->connect("custom_action", callable_mp(this, &ShaderEditor::save_external_data)); @@ -923,6 +923,15 @@ ShaderEditor *ShaderEditorPlugin::get_shader_editor(const Ref<Shader> &p_for_sha return nullptr; } +VisualShaderEditor *ShaderEditorPlugin::get_visual_shader_editor(const Ref<Shader> &p_for_shader) { + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + if (edited_shaders[i].shader == p_for_shader) { + return edited_shaders[i].visual_shader_editor; + } + } + return nullptr; +} + void ShaderEditorPlugin::save_external_data() { for (uint32_t i = 0; i < edited_shaders.size(); i++) { if (edited_shaders[i].shader_editor) { @@ -950,6 +959,7 @@ void ShaderEditorPlugin::_close_shader(int p_index) { memdelete(c); edited_shaders.remove_at(index); _update_shader_list(); + EditorNode::get_singleton()->get_undo_redo()->clear_history(); // To prevent undo on deleted graphs. } void ShaderEditorPlugin::_resource_saved(Object *obj) { diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index e1e815f939..2e0dbe0d60 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -209,6 +209,7 @@ public: virtual void selected_notify() override; ShaderEditor *get_shader_editor(const Ref<Shader> &p_for_shader); + VisualShaderEditor *get_visual_shader_editor(const Ref<Shader> &p_for_shader); virtual void save_external_data() override; virtual void apply_changes() override; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 8845fe9eca..93e44c8ca0 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -42,6 +42,7 @@ #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/physics_body_3d.h" #include "scene/resources/capsule_shape_3d.h" +#include "scene/resources/skeleton_profile.h" #include "scene/resources/sphere_shape_3d.h" #include "scene/resources/surface_tool.h" @@ -250,6 +251,10 @@ void Skeleton3DEditor::_on_click_skeleton_option(int p_skeleton_option) { create_physical_skeleton(); break; } + case SKELETON_OPTION_EXPORT_SKELETON_PROFILE: { + export_skeleton_profile(); + break; + } } } @@ -451,6 +456,73 @@ PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_chi return physical_bone; } +void Skeleton3DEditor::export_skeleton_profile() { + file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); + file_dialog->set_title(TTR("Export Skeleton Profile As...")); + + List<String> exts; + ResourceLoader::get_recognized_extensions_for_type("SkeletonProfile", &exts); + file_dialog->clear_filters(); + for (const String &K : exts) { + file_dialog->add_filter("*." + K); + } + + file_dialog->popup_file_dialog(); +} + +void Skeleton3DEditor::_file_selected(const String &p_file) { + // Export SkeletonProfile. + Ref<SkeletonProfile> sp(memnew(SkeletonProfile)); + + // Build SkeletonProfile. + sp->set_group_size(1); + + Vector<Vector2> handle_positions; + Vector2 position_max; + Vector2 position_min; + + int len = skeleton->get_bone_count(); + sp->set_bone_size(len); + for (int i = 0; i < len; i++) { + sp->set_bone_name(i, skeleton->get_bone_name(i)); + int parent = skeleton->get_bone_parent(i); + if (parent >= 0) { + sp->set_bone_parent(i, skeleton->get_bone_name(parent)); + } + sp->set_reference_pose(i, skeleton->get_bone_rest(i)); + + Transform3D grest = skeleton->get_bone_global_rest(i); + handle_positions.append(Vector2(grest.origin.x, grest.origin.y)); + if (i == 0) { + position_max = Vector2(grest.origin.x, grest.origin.y); + position_min = Vector2(grest.origin.x, grest.origin.y); + } else { + position_max.x = MAX(grest.origin.x, position_max.x); + position_max.y = MAX(grest.origin.y, position_max.y); + position_min.x = MIN(grest.origin.x, position_min.x); + position_min.y = MIN(grest.origin.y, position_min.y); + } + } + + // Layout handles provisionaly. + Vector2 bound = Vector2(position_max.x - position_min.x, position_max.y - position_min.y); + Vector2 center = Vector2((position_max.x + position_min.x) * 0.5, (position_max.y + position_min.y) * 0.5); + float nrm = MAX(bound.x, bound.y); + if (nrm > 0) { + for (int i = 0; i < len; i++) { + handle_positions.write[i] = (handle_positions[i] - center) / nrm * 0.9; + sp->set_handle_offset(i, Vector2(0.5 + handle_positions[i].x, 0.5 - handle_positions[i].y)); + } + } + + Error err = ResourceSaver::save(p_file, sp); + + if (err != OK) { + EditorNode::get_singleton()->show_warning(vformat(TTR("Error saving file: %s"), p_file)); + return; + } +} + Variant Skeleton3DEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { TreeItem *selected = joint_tree->get_selected(); @@ -631,6 +703,11 @@ void Skeleton3DEditor::create_editors() { Node3DEditor *ne = Node3DEditor::get_singleton(); AnimationTrackEditor *te = AnimationPlayerEditor::get_singleton()->get_track_editor(); + // Create File dialog. + file_dialog = memnew(EditorFileDialog); + file_dialog->connect("file_selected", callable_mp(this, &Skeleton3DEditor::_file_selected)); + add_child(file_dialog); + // Create Top Menu Bar. separator = memnew(VSeparator); ne->add_control_to_menu_panel(separator); @@ -649,6 +726,7 @@ void Skeleton3DEditor::create_editors() { p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/all_poses_to_rests", TTR("Apply all poses to rests")), SKELETON_OPTION_ALL_POSES_TO_RESTS); p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/selected_poses_to_rests", TTR("Apply selected poses to rests")), SKELETON_OPTION_SELECTED_POSES_TO_RESTS); p->add_item(TTR("Create physical skeleton"), SKELETON_OPTION_CREATE_PHYSICAL_SKELETON); + p->add_item(TTR("Export skeleton profile"), SKELETON_OPTION_EXPORT_SKELETON_PROFILE); p->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_skeleton_option)); set_bone_options_enabled(false); diff --git a/editor/plugins/skeleton_3d_editor_plugin.h b/editor/plugins/skeleton_3d_editor_plugin.h index 8f03e7c8db..975b54fa77 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.h +++ b/editor/plugins/skeleton_3d_editor_plugin.h @@ -101,6 +101,7 @@ class Skeleton3DEditor : public VBoxContainer { SKELETON_OPTION_ALL_POSES_TO_RESTS, SKELETON_OPTION_SELECTED_POSES_TO_RESTS, SKELETON_OPTION_CREATE_PHYSICAL_SKELETON, + SKELETON_OPTION_EXPORT_SKELETON_PROFILE, }; struct BoneInfo { @@ -155,6 +156,8 @@ class Skeleton3DEditor : public VBoxContainer { void create_physical_skeleton(); PhysicalBone3D *create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos); + void export_skeleton_profile(); + Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); 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); diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index ad817f9a41..3323d865c2 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/editor/plugins/sprite_2d_editor_plugin.cpp @@ -122,7 +122,7 @@ void Sprite2DEditor::_menu_option(int p_option) { switch (p_option) { case MENU_OPTION_CONVERT_TO_MESH_2D: { - debug_uv_dialog->get_ok_button()->set_text(TTR("Create MeshInstance2D")); + debug_uv_dialog->set_ok_button_text(TTR("Create MeshInstance2D")); debug_uv_dialog->set_title(TTR("MeshInstance2D Preview")); _update_mesh_data(); @@ -131,7 +131,7 @@ void Sprite2DEditor::_menu_option(int p_option) { } break; case MENU_OPTION_CONVERT_TO_POLYGON_2D: { - debug_uv_dialog->get_ok_button()->set_text(TTR("Create Polygon2D")); + debug_uv_dialog->set_ok_button_text(TTR("Create Polygon2D")); debug_uv_dialog->set_title(TTR("Polygon2D Preview")); _update_mesh_data(); @@ -139,7 +139,7 @@ void Sprite2DEditor::_menu_option(int p_option) { debug_uv->update(); } break; case MENU_OPTION_CREATE_COLLISION_POLY_2D: { - debug_uv_dialog->get_ok_button()->set_text(TTR("Create CollisionPolygon2D")); + debug_uv_dialog->set_ok_button_text(TTR("Create CollisionPolygon2D")); debug_uv_dialog->set_title(TTR("CollisionPolygon2D Preview")); _update_mesh_data(); @@ -148,7 +148,7 @@ void Sprite2DEditor::_menu_option(int p_option) { } break; case MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D: { - debug_uv_dialog->get_ok_button()->set_text(TTR("Create LightOccluder2D")); + debug_uv_dialog->set_ok_button_text(TTR("Create LightOccluder2D")); debug_uv_dialog->set_title(TTR("LightOccluder2D Preview")); _update_mesh_data(); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 8a40ffbe38..edd900f7d8 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -119,7 +119,7 @@ void SpriteFramesEditor::_sheet_preview_draw() { if (frames_selected.size() == 0) { split_sheet_dialog->get_ok_button()->set_disabled(true); - split_sheet_dialog->get_ok_button()->set_text(TTR("No Frames Selected")); + split_sheet_dialog->set_ok_button_text(TTR("No Frames Selected")); return; } @@ -140,7 +140,7 @@ void SpriteFramesEditor::_sheet_preview_draw() { } split_sheet_dialog->get_ok_button()->set_disabled(false); - split_sheet_dialog->get_ok_button()->set_text(vformat(TTR("Add %d Frame(s)"), frames_selected.size())); + split_sheet_dialog->set_ok_button_text(vformat(TTR("Add %d Frame(s)"), frames_selected.size())); } void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { @@ -449,7 +449,7 @@ void SpriteFramesEditor::_file_load_request(const Vector<String> &p_path, int p_ dialog->set_title(TTR("Error!")); //dialog->get_cancel()->set_text("Close"); - dialog->get_ok_button()->set_text(TTR("Close")); + dialog->set_ok_button_text(TTR("Close")); dialog->popup_centered(); return; ///beh should show an error i guess } @@ -516,7 +516,7 @@ void SpriteFramesEditor::_paste_pressed() { dialog->set_text(TTR("Resource clipboard is empty or not a texture!")); dialog->set_title(TTR("Error!")); //dialog->get_cancel()->set_text("Close"); - dialog->get_ok_button()->set_text(TTR("Close")); + dialog->set_ok_button_text(TTR("Close")); dialog->popup_centered(); return; ///beh should show an error i guess } diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 3f4f9a4f4d..dd98247428 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -989,7 +989,7 @@ Vector2 TextureRegionEditor::snap_point(Vector2 p_target) const { } TextureRegionEditor::TextureRegionEditor() { - get_ok_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Close")); VBoxContainer *vb = memnew(VBoxContainer); add_child(vb); node_sprite_2d = nullptr; diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index b01b90cd08..129af1bb1d 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -1883,7 +1883,7 @@ void ThemeItemEditorDialog::set_edited_theme(const Ref<Theme> &p_theme) { ThemeItemEditorDialog::ThemeItemEditorDialog(ThemeTypeEditor *p_theme_type_editor) { set_title(TTR("Manage Theme Items")); - get_ok_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Close")); set_hide_on_ok(false); // Closing may require a confirmation in some cases. theme_type_editor = p_theme_type_editor; @@ -2080,7 +2080,7 @@ ThemeItemEditorDialog::ThemeItemEditorDialog(ThemeTypeEditor *p_theme_type_edito List<String> ext; ResourceLoader::get_recognized_extensions_for_type("Theme", &ext); for (const String &E : ext) { - import_another_theme_dialog->add_filter(vformat("*.%s; %s", E, TTR("Theme Resource"))); + import_another_theme_dialog->add_filter("*." + E, TTR("Theme Resource")); } import_another_file_hb->add_child(import_another_theme_dialog); import_another_theme_dialog->connect("file_selected", callable_mp(this, &ThemeItemEditorDialog::_select_another_theme_cbk)); @@ -2733,7 +2733,7 @@ void ThemeTypeEditor::_list_type_selected(int p_index) { void ThemeTypeEditor::_add_type_button_cbk() { add_type_mode = ADD_THEME_TYPE; add_type_dialog->set_title(TTR("Add Item Type")); - add_type_dialog->get_ok_button()->set_text(TTR("Add Type")); + add_type_dialog->set_ok_button_text(TTR("Add Type")); add_type_dialog->set_include_own_types(false); add_type_dialog->popup_centered(Size2(560, 420) * EDSCALE); } @@ -3269,7 +3269,7 @@ void ThemeTypeEditor::_type_variation_changed(const String p_value) { void ThemeTypeEditor::_add_type_variation_cbk() { add_type_mode = ADD_VARIATION_BASE; add_type_dialog->set_title(TTR("Set Variation Base Type")); - add_type_dialog->get_ok_button()->set_text(TTR("Set Base Type")); + add_type_dialog->set_ok_button_text(TTR("Set Base Type")); add_type_dialog->set_include_own_types(true); add_type_dialog->popup_centered(Size2(560, 420) * EDSCALE); } @@ -3663,7 +3663,7 @@ ThemeEditor::ThemeEditor() { List<String> ext; ResourceLoader::get_recognized_extensions_for_type("PackedScene", &ext); for (const String &E : ext) { - preview_scene_dialog->add_filter(vformat("*.%s; %s", E, TTR("Scene"))); + preview_scene_dialog->add_filter("*." + E, TTR("Scene")); } main_hs->add_child(preview_scene_dialog); preview_scene_dialog->connect("file_selected", callable_mp(this, &ThemeEditor::_preview_scene_dialog_cbk)); diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index 02fe65378d..3fe6778f48 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -256,7 +256,7 @@ AtlasMergingDialog::AtlasMergingDialog() { set_hide_on_ok(false); // Ok buttons - get_ok_button()->set_text(TTR("Merge (Keep original Atlases)")); + set_ok_button_text(TTR("Merge (Keep original Atlases)")); get_ok_button()->set_disabled(true); merge_button = add_button(TTR("Merge"), true, "merge"); merge_button->set_disabled(true); diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 37ccc6ad45..deffa48615 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -2405,7 +2405,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { confirm_auto_create_tiles = memnew(AcceptDialog); confirm_auto_create_tiles->set_title(TTR("Auto Create Tiles in Non-Transparent Texture Regions?")); confirm_auto_create_tiles->set_text(TTR("The atlas's texture was modified.\nWould you like to automatically create tiles in the atlas?")); - confirm_auto_create_tiles->get_ok_button()->set_text(TTR("Yes")); + confirm_auto_create_tiles->set_ok_button_text(TTR("Yes")); confirm_auto_create_tiles->add_cancel_button()->set_text(TTR("No")); confirm_auto_create_tiles->connect("confirmed", callable_mp(this, &TileSetAtlasSourceEditor::_auto_create_tiles)); add_child(confirm_auto_create_tiles); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 8c72a886ea..69a125a029 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -40,6 +40,7 @@ #include "editor/editor_node.h" #include "editor/editor_properties.h" #include "editor/editor_scale.h" +#include "editor/plugins/shader_editor_plugin.h" #include "scene/animation/animation_player.h" #include "scene/gui/menu_button.h" #include "scene/gui/panel.h" @@ -72,6 +73,10 @@ const int MAX_FLOAT_CONST_DEFS = sizeof(float_constant_defs) / sizeof(FloatConst /////////////////// +void VisualShaderNodePlugin::set_editor(VisualShaderEditor *p_editor) { + vseditor = p_editor; +} + Control *VisualShaderNodePlugin::create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node) { Object *ret; if (GDVIRTUAL_CALL(_create_editor, p_parent_resource, p_node, ret)) { @@ -115,6 +120,10 @@ void VisualShaderGraphPlugin::_bind_methods() { ClassDB::bind_method("update_curve_xyz", &VisualShaderGraphPlugin::update_curve_xyz); } +void VisualShaderGraphPlugin::set_editor(VisualShaderEditor *p_editor) { + editor = p_editor; +} + void VisualShaderGraphPlugin::register_shader(VisualShader *p_shader) { visual_shader = Ref<VisualShader>(p_shader); } @@ -186,10 +195,6 @@ void VisualShaderGraphPlugin::set_input_port_default_value(VisualShader::Type p_ switch (p_value.get_type()) { case Variant::COLOR: { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { - break; - } button->set_custom_minimum_size(Size2(30, 0) * EDSCALE); Callable ce = callable_mp(editor, &VisualShaderEditor::_draw_color_over_button); @@ -337,10 +342,6 @@ void VisualShaderGraphPlugin::register_uniform_name(int p_node_id, LineEdit *p_u } void VisualShaderGraphPlugin::update_theme() { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { - return; - } vector_expanded_color[0] = editor->get_theme_color(SNAME("axis_x_color"), SNAME("Editor")); // red vector_expanded_color[1] = editor->get_theme_color(SNAME("axis_y_color"), SNAME("Editor")); // green vector_expanded_color[2] = editor->get_theme_color(SNAME("axis_z_color"), SNAME("Editor")); // blue @@ -351,10 +352,6 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { if (!visual_shader.is_valid() || p_type != visual_shader->get_shader_type()) { return; } - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { - return; - } GraphEdit *graph = editor->graph; if (!graph) { return; @@ -474,6 +471,12 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { node->set_custom_minimum_size(Size2(200 * EDSCALE, 0)); } + Ref<VisualShaderNodeUniformRef> uniform_ref = vsnode; + if (uniform_ref.is_valid()) { + uniform_ref->set_shader_rid(visual_shader->get_rid()); + uniform_ref->update_uniform_type(); + } + Ref<VisualShaderNodeUniform> uniform = vsnode; HBoxContainer *hb = nullptr; @@ -1035,10 +1038,6 @@ void VisualShaderGraphPlugin::remove_node(VisualShader::Type p_type, int p_id) { } void VisualShaderGraphPlugin::connect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { - return; - } GraphEdit *graph = editor->graph; if (!graph) { return; @@ -1055,10 +1054,6 @@ void VisualShaderGraphPlugin::connect_nodes(VisualShader::Type p_type, int p_fro } void VisualShaderGraphPlugin::disconnect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { - return; - } GraphEdit *graph = editor->graph; if (!graph) { return; @@ -1085,6 +1080,10 @@ VisualShaderGraphPlugin::~VisualShaderGraphPlugin() { ///////////////// +Vector2 VisualShaderEditor::selection_center; +List<VisualShaderEditor::CopyItem> VisualShaderEditor::copy_items_buffer; +List<VisualShader::Connection> VisualShaderEditor::copy_connections_buffer; + void VisualShaderEditor::edit(VisualShader *p_visual_shader) { bool changed = false; if (p_visual_shader) { @@ -1602,7 +1601,7 @@ void VisualShaderEditor::_update_created_node(GraphNode *node) { } void VisualShaderEditor::_update_uniforms(bool p_update_refs) { - VisualShaderNodeUniformRef::clear_uniforms(); + VisualShaderNodeUniformRef::clear_uniforms(visual_shader->get_rid()); for (int t = 0; t < VisualShader::TYPE_MAX; t++) { Vector<int> tnodes = visual_shader->get_node_list((VisualShader::Type)t); @@ -1640,7 +1639,7 @@ void VisualShaderEditor::_update_uniforms(bool p_update_refs) { } else { uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_SAMPLER; } - VisualShaderNodeUniformRef::add_uniform(uniform->get_uniform_name(), uniform_type); + VisualShaderNodeUniformRef::add_uniform(visual_shader->get_rid(), uniform->get_uniform_name(), uniform_type); } } } @@ -2645,7 +2644,6 @@ void VisualShaderEditor::_add_node(int p_idx, const Vector<Variant> &p_ops, Stri _setup_node(vsn, p_ops); } VisualShaderNodeUniformRef *uniform_ref = Object::cast_to<VisualShaderNodeUniformRef>(vsn); - if (uniform_ref && to_node != -1 && to_slot != -1) { VisualShaderNode::PortType input_port_type = visual_shader->get_node(type, to_node)->get_input_port_type(to_slot); bool success = false; @@ -4644,10 +4642,7 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_is_available", &VisualShaderEditor::_is_available); } -VisualShaderEditor *VisualShaderEditor::singleton = nullptr; - VisualShaderEditor::VisualShaderEditor() { - singleton = this; ShaderLanguage::get_keyword_list(&keyword_list); graph = memnew(GraphEdit); @@ -4911,7 +4906,7 @@ VisualShaderEditor::VisualShaderEditor() { members_dialog->set_title(TTR("Create Shader Node")); members_dialog->set_exclusive(false); members_dialog->add_child(members_vb); - members_dialog->get_ok_button()->set_text(TTR("Create")); + members_dialog->set_ok_button_text(TTR("Create")); members_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_member_create)); members_dialog->get_ok_button()->set_disabled(true); members_dialog->connect("cancelled", callable_mp(this, &VisualShaderEditor::_member_cancel)); @@ -4922,7 +4917,7 @@ VisualShaderEditor::VisualShaderEditor() { add_varying_dialog = memnew(ConfirmationDialog); add_varying_dialog->set_title(TTR("Create Shader Varying")); add_varying_dialog->set_exclusive(false); - add_varying_dialog->get_ok_button()->set_text(TTR("Create")); + add_varying_dialog->set_ok_button_text(TTR("Create")); add_varying_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_varying_create)); add_varying_dialog->get_ok_button()->set_disabled(true); add_child(add_varying_dialog); @@ -4966,7 +4961,7 @@ VisualShaderEditor::VisualShaderEditor() { remove_varying_dialog = memnew(ConfirmationDialog); remove_varying_dialog->set_title(TTR("Delete Shader Varying")); remove_varying_dialog->set_exclusive(false); - remove_varying_dialog->get_ok_button()->set_text(TTR("Delete")); + remove_varying_dialog->set_ok_button_text(TTR("Delete")); remove_varying_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_varying_deleted)); add_child(remove_varying_dialog); @@ -5635,9 +5630,11 @@ VisualShaderEditor::VisualShaderEditor() { Ref<VisualShaderNodePluginDefault> default_plugin; default_plugin.instantiate(); + default_plugin->set_editor(this); add_plugin(default_plugin); graph_plugin.instantiate(); + graph_plugin->set_editor(this); property_editor = memnew(CustomPropertyEditor); add_child(property_editor); @@ -5648,6 +5645,7 @@ VisualShaderEditor::VisualShaderEditor() { class VisualShaderNodePluginInputEditor : public OptionButton { GDCLASS(VisualShaderNodePluginInputEditor, OptionButton); + VisualShaderEditor *editor = nullptr; Ref<VisualShaderNodeInput> input; public: @@ -5660,13 +5658,11 @@ public: } void _item_selected(int p_item) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (editor) { - editor->call_deferred(SNAME("_input_select_item"), input, get_item_text(p_item)); - } + editor->call_deferred(SNAME("_input_select_item"), input, get_item_text(p_item)); } - void setup(const Ref<VisualShaderNodeInput> &p_input) { + void setup(VisualShaderEditor *p_editor, const Ref<VisualShaderNodeInput> &p_input) { + editor = p_editor; input = p_input; Ref<Texture2D> type_icon[] = { EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("float"), SNAME("EditorIcons")), @@ -5699,6 +5695,7 @@ public: class VisualShaderNodePluginVaryingEditor : public OptionButton { GDCLASS(VisualShaderNodePluginVaryingEditor, OptionButton); + VisualShaderEditor *editor = nullptr; Ref<VisualShaderNodeVarying> varying; public: @@ -5709,13 +5706,11 @@ public: } void _item_selected(int p_item) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (editor) { - editor->call_deferred(SNAME("_varying_select_item"), varying, get_item_text(p_item)); - } + editor->call_deferred(SNAME("_varying_select_item"), varying, get_item_text(p_item)); } - void setup(const Ref<VisualShaderNodeVarying> &p_varying, VisualShader::Type p_type) { + void setup(VisualShaderEditor *p_editor, const Ref<VisualShaderNodeVarying> &p_varying, VisualShader::Type p_type) { + editor = p_editor; varying = p_varying; Ref<Texture2D> type_icon[] = { @@ -5776,6 +5771,7 @@ public: class VisualShaderNodePluginUniformRefEditor : public OptionButton { GDCLASS(VisualShaderNodePluginUniformRefEditor, OptionButton); + VisualShaderEditor *editor = nullptr; Ref<VisualShaderNodeUniformRef> uniform_ref; public: @@ -5788,13 +5784,11 @@ public: } void _item_selected(int p_item) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (editor) { - editor->call_deferred(SNAME("_uniform_select_item"), uniform_ref, get_item_text(p_item)); - } + editor->call_deferred(SNAME("_uniform_select_item"), uniform_ref, get_item_text(p_item)); } - void setup(const Ref<VisualShaderNodeUniformRef> &p_uniform_ref) { + void setup(VisualShaderEditor *p_editor, const Ref<VisualShaderNodeUniformRef> &p_uniform_ref) { + editor = p_editor; uniform_ref = p_uniform_ref; Ref<Texture2D> type_icon[] = { @@ -5828,6 +5822,7 @@ public: class VisualShaderNodePluginDefaultEditor : public VBoxContainer { GDCLASS(VisualShaderNodePluginDefaultEditor, VBoxContainer); + VisualShaderEditor *editor = nullptr; Ref<Resource> parent_resource; int node_id = 0; VisualShader::Type shader_type; @@ -5861,13 +5856,10 @@ public: } } if (p_property != "constant") { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (editor) { - VisualShaderGraphPlugin *graph_plugin = editor->get_graph_plugin(); - if (graph_plugin) { - undo_redo->add_do_method(graph_plugin, "update_node_deferred", shader_type, node_id); - undo_redo->add_undo_method(graph_plugin, "update_node_deferred", shader_type, node_id); - } + VisualShaderGraphPlugin *graph_plugin = editor->get_graph_plugin(); + if (graph_plugin) { + undo_redo->add_do_method(graph_plugin, "update_node_deferred", shader_type, node_id); + undo_redo->add_undo_method(graph_plugin, "update_node_deferred", shader_type, node_id); } } undo_redo->commit_action(); @@ -5903,7 +5895,8 @@ public: } } - void setup(Ref<Resource> p_parent_resource, Vector<EditorProperty *> p_properties, const Vector<StringName> &p_names, const HashMap<StringName, String> &p_overrided_names, Ref<VisualShaderNode> p_node) { + void setup(VisualShaderEditor *p_editor, Ref<Resource> p_parent_resource, Vector<EditorProperty *> p_properties, const Vector<StringName> &p_names, const HashMap<StringName, String> &p_overrided_names, Ref<VisualShaderNode> p_node) { + editor = p_editor; parent_resource = p_parent_resource; updating = false; node = p_node; @@ -5956,19 +5949,19 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par if (p_shader.is_valid() && (p_node->is_class("VisualShaderNodeVaryingGetter") || p_node->is_class("VisualShaderNodeVaryingSetter"))) { VisualShaderNodePluginVaryingEditor *editor = memnew(VisualShaderNodePluginVaryingEditor); - editor->setup(p_node, p_shader->get_shader_type()); + editor->setup(vseditor, p_node, p_shader->get_shader_type()); return editor; } if (p_node->is_class("VisualShaderNodeUniformRef")) { VisualShaderNodePluginUniformRefEditor *editor = memnew(VisualShaderNodePluginUniformRefEditor); - editor->setup(p_node); + editor->setup(vseditor, p_node); return editor; } if (p_node->is_class("VisualShaderNodeInput")) { VisualShaderNodePluginInputEditor *editor = memnew(VisualShaderNodePluginInputEditor); - editor->setup(p_node); + editor->setup(vseditor, p_node); return editor; } @@ -6023,22 +6016,22 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par properties.push_back(pinfo[i].name); } VisualShaderNodePluginDefaultEditor *editor = memnew(VisualShaderNodePluginDefaultEditor); - editor->setup(p_parent_resource, editors, properties, p_node->get_editable_properties_names(), p_node); + editor->setup(vseditor, p_parent_resource, editors, properties, p_node->get_editable_properties_names(), p_node); return editor; } void EditorPropertyShaderMode::_option_selected(int p_which) { - VisualShaderEditor *editor = VisualShaderEditor::get_singleton(); - if (!editor) { + Ref<VisualShader> visual_shader(Object::cast_to<VisualShader>(get_edited_object())); + if (visual_shader->get_mode() == p_which) { return; } - //will not use this, instead will do all the logic setting manually - //emit_signal(SNAME("property_changed"), get_edited_property(), p_which); - - Ref<VisualShader> visual_shader(Object::cast_to<VisualShader>(get_edited_object())); - - if (visual_shader->get_mode() == p_which) { + ShaderEditorPlugin *shader_editor = Object::cast_to<ShaderEditorPlugin>(EditorNode::get_singleton()->get_editor_data().get_editor("Shader")); + if (!shader_editor) { + return; + } + VisualShaderEditor *editor = shader_editor->get_visual_shader_editor(visual_shader); + if (!editor) { return; } @@ -6145,10 +6138,10 @@ bool EditorInspectorShaderModePlugin::can_handle(Object *p_object) { bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path == "mode" && p_object->is_class("VisualShader") && p_type == Variant::INT) { - EditorPropertyShaderMode *editor = memnew(EditorPropertyShaderMode); + EditorPropertyShaderMode *mode_editor = memnew(EditorPropertyShaderMode); Vector<String> options = p_hint_text.split(","); - editor->setup(options); - add_property_editor(p_path, editor); + mode_editor->setup(options); + add_property_editor(p_path, mode_editor); return true; } diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index b8da266ed7..2feed6108a 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -42,15 +42,21 @@ #include "scene/gui/tree.h" #include "scene/resources/visual_shader.h" +class VisualShaderEditor; + class VisualShaderNodePlugin : public RefCounted { GDCLASS(VisualShaderNodePlugin, RefCounted); protected: + VisualShaderEditor *vseditor = nullptr; + +protected: static void _bind_methods(); GDVIRTUAL2RC(Object *, _create_editor, Ref<Resource>, Ref<VisualShaderNode>) public: + void set_editor(VisualShaderEditor *p_editor); virtual Control *create_editor(const Ref<Resource> &p_parent_resource, const Ref<VisualShaderNode> &p_node); }; @@ -58,6 +64,8 @@ class VisualShaderGraphPlugin : public RefCounted { GDCLASS(VisualShaderGraphPlugin, RefCounted); private: + VisualShaderEditor *editor = nullptr; + struct InputPort { Button *default_input_button = nullptr; }; @@ -91,6 +99,7 @@ protected: static void _bind_methods(); public: + void set_editor(VisualShaderEditor *p_editor); void register_shader(VisualShader *p_visual_shader); void set_connections(const List<VisualShader::Connection> &p_connections); void register_link(VisualShader::Type p_type, int p_id, VisualShaderNode *p_visual_node, GraphNode *p_graph_node); @@ -324,8 +333,6 @@ class VisualShaderEditor : public VBoxContainer { void _update_preview(); String _get_description(int p_idx); - static VisualShaderEditor *singleton; - struct DragOp { VisualShader::Type type = VisualShader::Type::TYPE_MAX; int node = 0; @@ -403,9 +410,9 @@ class VisualShaderEditor : public VBoxContainer { void _duplicate_nodes(); - Vector2 selection_center; - List<CopyItem> copy_items_buffer; - List<VisualShader::Connection> copy_connections_buffer; + static Vector2 selection_center; + static List<CopyItem> copy_items_buffer; + static List<VisualShader::Connection> copy_connections_buffer; void _clear_copy_buffer(); void _copy_nodes(bool p_cut); @@ -482,7 +489,6 @@ public: void add_plugin(const Ref<VisualShaderNodePlugin> &p_plugin); void remove_plugin(const Ref<VisualShaderNodePlugin> &p_plugin); - static VisualShaderEditor *get_singleton() { return singleton; } VisualShaderGraphPlugin *get_graph_plugin() { return graph_plugin.ptr(); } void clear_custom_types(); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index ac32027219..209c997d58 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -892,7 +892,7 @@ void ProjectExportDialog::_export_project() { List<String> extension_list = platform->get_binary_extensions(current); for (int i = 0; i < extension_list.size(); i++) { // TRANSLATORS: This is the name of a project export file format. %s will be replaced by the platform name. - export_project->add_filter(vformat("*.%s; %s", extension_list[i], vformat(TTR("%s Export"), platform->get_name()))); + export_project->add_filter("*." + extension_list[i], vformat(TTR("%s Export"), platform->get_name())); } if (!current->get_export_path().is_empty()) { @@ -1195,13 +1195,13 @@ ProjectExportDialog::ProjectExportDialog() { delete_confirm = memnew(ConfirmationDialog); add_child(delete_confirm); - delete_confirm->get_ok_button()->set_text(TTR("Delete")); + delete_confirm->set_ok_button_text(TTR("Delete")); delete_confirm->connect("confirmed", callable_mp(this, &ProjectExportDialog::_delete_preset_confirm)); // Export buttons, dialogs and errors. - get_cancel_button()->set_text(TTR("Close")); - get_ok_button()->set_text(TTR("Export PCK/ZIP...")); + set_cancel_button_text(TTR("Close")); + set_ok_button_text(TTR("Export PCK/ZIP...")); export_button = add_button(TTR("Export Project..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project)); // Disable initially before we select a valid preset @@ -1222,8 +1222,8 @@ ProjectExportDialog::ProjectExportDialog() { export_all_button->set_disabled(true); export_pck_zip = memnew(EditorFileDialog); - export_pck_zip->add_filter("*.zip ; " + TTR("ZIP File")); - export_pck_zip->add_filter("*.pck ; " + TTR("Godot Project Pack")); + export_pck_zip->add_filter("*.zip", TTR("ZIP File")); + export_pck_zip->add_filter("*.pck", TTR("Godot Project Pack")); export_pck_zip->set_access(EditorFileDialog::ACCESS_FILESYSTEM); export_pck_zip->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); add_child(export_pck_zip); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index d1aa1ceae6..f7ef574205 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -362,8 +362,8 @@ private: if (mode == MODE_IMPORT) { fdialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); fdialog->clear_filters(); - fdialog->add_filter(vformat("project.godot ; %s %s", VERSION_NAME, TTR("Project"))); - fdialog->add_filter("*.zip ; " + TTR("ZIP File")); + fdialog->add_filter("project.godot", vformat("%s %s", VERSION_NAME, TTR("Project"))); + fdialog->add_filter("*.zip", TTR("ZIP File")); } else { fdialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); } @@ -681,7 +681,7 @@ public: install_browse->hide(); set_title(TTR("Rename Project")); - get_ok_button()->set_text(TTR("Rename")); + set_ok_button_text(TTR("Rename")); name_container->show(); status_rect->hide(); msg->hide(); @@ -735,7 +735,7 @@ public: if (mode == MODE_IMPORT) { set_title(TTR("Import Existing Project")); - get_ok_button()->set_text(TTR("Import & Edit")); + set_ok_button_text(TTR("Import & Edit")); name_container->hide(); install_path_container->hide(); rasterizer_container->hide(); @@ -744,7 +744,7 @@ public: } else if (mode == MODE_NEW) { set_title(TTR("Create New Project")); - get_ok_button()->set_text(TTR("Create & Edit")); + set_ok_button_text(TTR("Create & Edit")); name_container->show(); install_path_container->hide(); rasterizer_container->show(); @@ -754,7 +754,7 @@ public: } else if (mode == MODE_INSTALL) { set_title(TTR("Install Project:") + " " + zip_title); - get_ok_button()->set_text(TTR("Install & Edit")); + set_ok_button_text(TTR("Install & Edit")); project_name->set_text(zip_title); name_container->show(); install_path_container->hide(); @@ -2801,9 +2801,9 @@ ProjectManager::ProjectManager() { { // Dialogs language_restart_ask = memnew(ConfirmationDialog); - language_restart_ask->get_ok_button()->set_text(TTR("Restart Now")); + language_restart_ask->set_ok_button_text(TTR("Restart Now")); language_restart_ask->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_restart_confirm)); - language_restart_ask->get_cancel_button()->set_text(TTR("Continue")); + language_restart_ask->set_cancel_button_text(TTR("Continue")); add_child(language_restart_ask); scan_dir = memnew(EditorFileDialog); @@ -2816,12 +2816,12 @@ ProjectManager::ProjectManager() { scan_dir->connect("dir_selected", callable_mp(this, &ProjectManager::_scan_begin)); erase_missing_ask = memnew(ConfirmationDialog); - erase_missing_ask->get_ok_button()->set_text(TTR("Remove All")); + erase_missing_ask->set_ok_button_text(TTR("Remove All")); erase_missing_ask->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_erase_missing_projects_confirm)); add_child(erase_missing_ask); erase_ask = memnew(ConfirmationDialog); - erase_ask->get_ok_button()->set_text(TTR("Remove")); + erase_ask->set_ok_button_text(TTR("Remove")); erase_ask->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_erase_project_confirm)); add_child(erase_ask); @@ -2836,17 +2836,17 @@ ProjectManager::ProjectManager() { erase_ask_vb->add_child(delete_project_contents); multi_open_ask = memnew(ConfirmationDialog); - multi_open_ask->get_ok_button()->set_text(TTR("Edit")); + multi_open_ask->set_ok_button_text(TTR("Edit")); multi_open_ask->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects)); add_child(multi_open_ask); multi_run_ask = memnew(ConfirmationDialog); - multi_run_ask->get_ok_button()->set_text(TTR("Run")); + multi_run_ask->set_ok_button_text(TTR("Run")); multi_run_ask->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_run_project_confirm)); add_child(multi_run_ask); multi_scan_ask = memnew(ConfirmationDialog); - multi_scan_ask->get_ok_button()->set_text(TTR("Scan")); + multi_scan_ask->set_ok_button_text(TTR("Scan")); add_child(multi_scan_ask); ask_update_settings = memnew(ConfirmationDialog); @@ -2868,7 +2868,7 @@ ProjectManager::ProjectManager() { if (asset_library) { open_templates = memnew(ConfirmationDialog); open_templates->set_text(TTR("You currently don't have any projects.\nWould you like to explore official example projects in the Asset Library?")); - open_templates->get_ok_button()->set_text(TTR("Open Asset Library")); + open_templates->set_ok_button_text(TTR("Open Asset Library")); open_templates->connect("confirmed", callable_mp(this, &ProjectManager::_open_asset_library)); add_child(open_templates); } diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 1524993bd0..49707355a0 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -685,7 +685,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { timer->set_one_shot(true); add_child(timer); - get_ok_button()->set_text(TTR("Close")); + set_ok_button_text(TTR("Close")); set_hide_on_ok(true); bool use_advanced = EditorSettings::get_singleton()->get_project_metadata("project_settings", "advanced_mode", false); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 9f13a9d520..277ae14e0e 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -145,7 +145,7 @@ void CustomPropertyEditor::_menu_option(int p_which) { file->clear_filters(); for (const String &E : valid_extensions) { - file->add_filter("*." + E + " ; " + E.to_upper()); + file->add_filter("*." + E, E.to_upper()); } file->popup_file_dialog(); @@ -1223,7 +1223,7 @@ void CustomPropertyEditor::_action_pressed(int p_which) { filter = "*." + extensions[i]; } - file->add_filter(filter + " ; " + extensions[i].to_upper()); + file->add_filter(filter, extensions[i].to_upper()); } } file->popup_file_dialog(); @@ -1307,7 +1307,7 @@ void CustomPropertyEditor::_action_pressed(int p_which) { ResourceLoader::get_recognized_extensions_for_type(type, &extensions); file->clear_filters(); for (const String &E : extensions) { - file->add_filter("*." + E + " ; " + E.to_upper()); + file->add_filter("*." + E, E.to_upper()); } file->popup_file_dialog(); diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index c136eae1bc..841c3ff3b1 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -581,7 +581,7 @@ PropertySelector::PropertySelector() { search_box->connect("gui_input", callable_mp(this, &PropertySelector::_sbox_input)); search_options = memnew(Tree); vbc->add_margin_child(TTR("Matches:"), search_options, true); - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); get_ok_button()->set_disabled(true); register_text_enter(search_box); set_hide_on_ok(false); diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp index 4938699fc4..4f7f9fc78c 100644 --- a/editor/quick_open.cpp +++ b/editor/quick_open.cpp @@ -263,6 +263,6 @@ EditorQuickOpen::EditorQuickOpen() { search_options->add_theme_constant_override("draw_guides", 1); vbc->add_margin_child(TTR("Matches:"), search_options, true); - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); set_hide_on_ok(false); } diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index a8278b9aab..255187e4ed 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -289,7 +289,7 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_und // ---- Dialog related set_min_size(Size2(383, 0)); - get_ok_button()->set_text(TTR("Rename")); + set_ok_button_text(TTR("Rename")); Button *but_reset = add_button(TTR("Reset")); eh.errfunc = _error_handler; diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp index 5a8fe24518..75098b25b1 100644 --- a/editor/reparent_dialog.cpp +++ b/editor/reparent_dialog.cpp @@ -89,7 +89,7 @@ ReparentDialog::ReparentDialog() { //cancel->connect("pressed", this,"_cancel"); - get_ok_button()->set_text(TTR("Reparent")); + set_ok_button_text(TTR("Reparent")); } ReparentDialog::~ReparentDialog() { diff --git a/editor/scene_create_dialog.cpp b/editor/scene_create_dialog.cpp index 64aea54c5f..6a35b22210 100644 --- a/editor/scene_create_dialog.cpp +++ b/editor/scene_create_dialog.cpp @@ -76,7 +76,7 @@ void SceneCreateDialog::accept_create() { void SceneCreateDialog::browse_types() { select_node_dialog->popup_create(true); select_node_dialog->set_title(TTR("Pick Root Node Type")); - select_node_dialog->get_ok_button()->set_text(TTR("Pick")); + select_node_dialog->set_ok_button_text(TTR("Pick")); } void SceneCreateDialog::on_type_picked() { diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 2e1090e6c0..fb8be5db81 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -910,7 +910,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { ResourceSaver::get_recognized_extensions(sd, &extensions); new_scene_from_dialog->clear_filters(); for (int i = 0; i < extensions.size(); i++) { - new_scene_from_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); + new_scene_from_dialog->add_filter("*." + extensions[i], extensions[i].to_upper()); } String existing; @@ -3535,7 +3535,7 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec clear_inherit_confirm = memnew(ConfirmationDialog); clear_inherit_confirm->set_text(TTR("Clear Inheritance? (No Undo!)")); - clear_inherit_confirm->get_ok_button()->set_text(TTR("Clear")); + clear_inherit_confirm->set_ok_button_text(TTR("Clear")); add_child(clear_inherit_confirm); set_process_input(true); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 86fa9222c0..5e1f5ab750 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -1359,6 +1359,10 @@ void SceneTreeDialog::_select() { } } +void SceneTreeDialog::_selected_changed() { + get_ok_button()->set_disabled(!tree->get_selected()); +} + void SceneTreeDialog::_filter_changed(const String &p_filter) { tree->set_filter(p_filter); } @@ -1386,6 +1390,10 @@ SceneTreeDialog::SceneTreeDialog() { tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); tree->get_scene_tree()->connect("item_activated", callable_mp(this, &SceneTreeDialog::_select)); vbc->add_child(tree); + + // Disable the OK button when no node is selected. + get_ok_button()->set_disabled(!tree->get_selected()); + tree->connect("node_selected", callable_mp(this, &SceneTreeDialog::_selected_changed)); } SceneTreeDialog::~SceneTreeDialog() { diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 5d4230059c..31a14e4667 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -176,6 +176,7 @@ class SceneTreeDialog : public ConfirmationDialog { void _select(); void _cancel(); + void _selected_changed(); void _filter_changed(const String &p_filter); void _update_theme(); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index e8561de19c..f2eabdd208 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -481,7 +481,7 @@ void ScriptCreateDialog::_browse_path(bool browse_parent, bool p_save) { if (p_save) { file_browse->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); file_browse->set_title(TTR("Open Script / Choose Location")); - file_browse->get_ok_button()->set_text(TTR("Open")); + file_browse->set_ok_button_text(TTR("Open")); } else { file_browse->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); file_browse->set_title(TTR("Open Script")); @@ -528,7 +528,7 @@ void ScriptCreateDialog::_browse_class_in_tree() { select_class->set_base_type(base_type); select_class->popup_create(true); select_class->set_title(vformat(TTR("Inherit %s"), base_type)); - select_class->get_ok_button()->set_text(TTR("Inherit")); + select_class->set_ok_button_text(TTR("Inherit")); } void ScriptCreateDialog::_path_changed(const String &p_path) { @@ -750,7 +750,7 @@ void ScriptCreateDialog::_update_dialog() { parent_browse_button->set_disabled(!is_new_file || !can_inherit_from_file); template_inactive_message = ""; String button_text = is_new_file ? TTR("Create") : TTR("Load"); - get_ok_button()->set_text(button_text); + set_ok_button_text(button_text); if (is_new_file) { if (is_built_in) { @@ -1088,7 +1088,7 @@ ScriptCreateDialog::ScriptCreateDialog() { file_browse->connect("file_selected", callable_mp(this, &ScriptCreateDialog::_file_selected)); file_browse->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); add_child(file_browse); - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); alert = memnew(AcceptDialog); alert->get_label()->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART); alert->get_label()->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index f70c46c8d8..28e1e9bf22 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -270,7 +270,7 @@ void ShaderCreateDialog::_built_in_toggled(bool p_enabled) { void ShaderCreateDialog::_browse_path() { file_browse->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); file_browse->set_title(TTR("Open Shader / Choose Location")); - file_browse->get_ok_button()->set_text(TTR("Open")); + file_browse->set_ok_button_text(TTR("Open")); file_browse->set_disable_overwrite_warning(true); file_browse->clear_filters(); @@ -469,20 +469,20 @@ void ShaderCreateDialog::_update_dialog() { builtin_warning_label->set_visible(is_built_in); if (is_built_in) { - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); _msg_path_valid(true, TTR("Built-in shader (into scene file).")); } else if (is_new_shader_created) { - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); if (is_path_valid) { _msg_path_valid(true, TTR("Will create a new shader file.")); } } else if (load_enabled) { - get_ok_button()->set_text(TTR("Load")); + set_ok_button_text(TTR("Load")); if (is_path_valid) { _msg_path_valid(true, TTR("Will load an existing shader file.")); } } else { - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); _msg_path_valid(false, TTR("Shader file already exists.")); shader_ok = false; @@ -638,7 +638,7 @@ ShaderCreateDialog::ShaderCreateDialog() { alert->get_label()->set_custom_minimum_size(Size2(325, 60) * EDSCALE); add_child(alert); - get_ok_button()->set_text(TTR("Create")); + set_ok_button_text(TTR("Create")); set_hide_on_ok(false); set_title(TTR("Create Shader")); diff --git a/editor/translations/af.po b/editor/translations/af.po index db28610435..78dd7f2140 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -473,6 +473,10 @@ msgid "Pressure" msgstr "Herset Zoem" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21471,7 +21475,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstant" @@ -23434,6 +23438,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Anim Verander Transform" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 93bc2971e8..87266564f8 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -65,13 +65,14 @@ # Awab Najim <dev.djvan@gmail.com>, 2022. # Abderrahim <abdoudido117@gmail.com>, 2022. # Jhon Smith <jhonsmaith3@gmail.com>, 2022. +# Oo mohab oO <mohab9225@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-05 07:17+0000\n" -"Last-Translator: Jhon Smith <jhonsmaith3@gmail.com>\n" +"PO-Revision-Date: 2022-07-09 21:11+0000\n" +"Last-Translator: Oo mohab oO <mohab9225@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -504,6 +505,10 @@ msgid "Pressure" msgstr "الضغط" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "نسبي" @@ -9299,7 +9304,7 @@ msgstr "Ø§Ù„Ù…ØØ§Ø°Ø§Ø© الذكية" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Ø§Ø®ÙØ§Ø¡" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -21781,7 +21786,7 @@ msgstr "Ø§Ù„Ø³ÙØ±" msgid "Rotation Degrees" msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "ثابت" @@ -23913,6 +23918,11 @@ msgstr "" "قم بتغيير Ø§Ù„ØØ¬Ù… ÙÙŠ أشكال تصادم الأتباع (Children) بدلاً من ذلك." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Ø§Ù„Ø§ØØªÙاظ بالتØÙˆÙ‘Ù„ الشمولي Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/az.po b/editor/translations/az.po index 3701234f3d..cd3e8def9b 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -464,6 +464,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20644,7 +20648,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22555,6 +22559,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Animasiyanı TÉ™mizlÉ™mÉ™" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 105aad00db..06d16ebe96 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -492,6 +492,10 @@ msgid "Pressure" msgstr "ÐатиÑк" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21205,7 +21209,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "ГрадуÑи на завъртане" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Глобална конÑтанта" @@ -23243,6 +23247,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ИзчиÑтване на транÑформациÑта" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 0e99518ac1..c2ed1a7596 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -484,6 +484,10 @@ msgid "Pressure" msgstr "পà§à¦°à¦¿à¦¸à§‡à¦Ÿ..." #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "আপেকà§à¦·à¦¿à¦• সà§à¦¨à§à¦¯à¦¾à¦ª" @@ -22658,7 +22662,7 @@ msgstr "à¦à§à¦°à¦®à¦£" msgid "Rotation Degrees" msgstr "%s ডিগà§à¦°à¦¿ ঘূরà§à¦£à¦¿à¦¤ হচà§à¦›à§‡à¥¤" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "ধà§à¦°à§à¦¬à¦•/কনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦Ÿ" @@ -24731,6 +24735,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "সারà§à¦¬à¦œà¦¨à§€à¦¨ রূপানà§à¦¤à¦° রাখà§à¦¨" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/br.po b/editor/translations/br.po index 101a0f7581..2d7b6fe900 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -454,6 +454,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20424,7 +20428,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22317,6 +22321,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Tro Fiñvskeudenn" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index c9726505d3..67f0296b05 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-26 16:15+0000\n" +"PO-Revision-Date: 2022-07-09 21:11+0000\n" "Last-Translator: Roger VC <rogervilarasau@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" @@ -67,7 +67,7 @@ msgstr "Mode de Baix Us del Processador" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Mode d'ús del processador baix en repòs (µseg)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -136,8 +136,9 @@ msgid "Size" msgstr "Mida" #: core/bind/core_bind.cpp +#, fuzzy msgid "Endian Swap" -msgstr "" +msgstr "Intercanvi d'endian" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -161,9 +162,8 @@ msgid "Time Scale" msgstr "Escala de Temps" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "Fotograma de FÃsica %" +msgstr "Correcció de fluctuacions de fÃsica" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -246,25 +246,23 @@ msgstr "Connexió" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "Llegeix la mida del fragment" #: core/io/marshalls.cpp msgid "Object ID" msgstr "ID de l'Objecte" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "Activa l'Efecte Paper Ceba" +msgstr "Permet la descodificació d'objectes" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" msgstr "Rebutja les noves connexions de xarxa" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "Perfilador de Xarxa" +msgstr "Parell de xarxa" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp msgid "Root Node" @@ -275,13 +273,12 @@ msgid "Refuse New Connections" msgstr "Rebutjar Noves Connexions" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "Tipus de Transformació" +msgstr "Mode de transferència" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "Mida mà xima de la memòria intermèdia de codificació" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" @@ -297,7 +294,7 @@ msgstr "" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "Endian gran" #: core/io/stream_peer.cpp msgid "Data Array" @@ -373,14 +370,12 @@ msgid "Max Size (KB)" msgstr "Mida mà xima (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Mode de moviment" +msgstr "Mode ratolÃ" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Elimina l'Entrada" +msgstr "Utilitza l'entrada acumulada" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -388,9 +383,8 @@ msgid "Device" msgstr "Dispositiu" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "Tot" +msgstr "Alt" #: core/os/input_event.cpp msgid "Shift" @@ -410,9 +404,8 @@ msgid "Command" msgstr "Comunitat" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Fotograma de FÃsica %" +msgstr "FÃsic" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -421,9 +414,8 @@ msgid "Pressed" msgstr "Premut" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Explora" +msgstr "Codi d'escaneig" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -468,6 +460,10 @@ msgid "Pressure" msgstr "Configuracions prestablertes" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatiu" @@ -799,7 +795,7 @@ msgstr "Renderitzat" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Qualitat" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -808,8 +804,9 @@ msgid "Filters" msgstr "Filtres" #: core/project_settings.cpp scene/main/viewport.cpp +#, fuzzy msgid "Sharpen Intensity" -msgstr "" +msgstr "Intensitat d'agudització" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -834,9 +831,8 @@ msgid "Profiler" msgstr "Perfilador" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Reanomena Funció" +msgstr "Funcions mà ximes" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -848,39 +844,39 @@ msgstr "Formats" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Coincidència de llarga distà ncia" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Nivell de compressió" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Mida del registre de la finestra" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Mòduls" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp msgid "Connect Timeout Seconds" @@ -892,11 +888,11 @@ msgstr "" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "Memòria intermèdia mà xima (potència de 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp msgid "Certificates" @@ -909,9 +905,8 @@ msgid "Resource" msgstr "Recurs" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Tanca l'Escena" +msgstr "Local a l'escena" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -980,7 +975,7 @@ msgstr "" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Mida de la memòria intermèdia de l'Ãndex del polÃgon de llenç (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -992,7 +987,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1002,14 +997,13 @@ msgstr "Ajustament Intel·ligent" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Utilitzar ajustament amb els PÃxels" +msgstr "Utilitza l'ajust de pÃxels de la GPU" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "Mida de la memòria intermèdia immediata (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1020,28 +1014,27 @@ msgstr "Precalcular Lightmaps" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Utilitza el mostreig bicúbic" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "Elements renderitzables mà xims" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Llums mà ximes renderitzables" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "Centra la Selecció" +msgstr "Reflexions mà ximes renderitzables" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "Llums mà ximes per objecte" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Dispersió subsuperficial" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1057,9 +1050,8 @@ msgid "Scale" msgstr "Escala" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Follow Surface" -msgstr "Omple la SuperfÃcie" +msgstr "Segueix la superfÃcie" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -1067,11 +1059,11 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Traçat del con Voxel" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Alta qualitat" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -1149,9 +1141,8 @@ msgstr "Canviar crida d'animació" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "% del Fotograma" +msgstr "Fotograma" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1162,9 +1153,8 @@ msgstr "Temps" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Localització" +msgstr "Ubicació" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp @@ -1184,7 +1174,7 @@ msgstr "Quantitat d'arguments" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Args" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1348,9 +1338,8 @@ msgid "Position:" msgstr "Posició:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Pas de la Rotació:" +msgstr "Rotació:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1373,7 +1362,7 @@ msgstr "(No và lid, tipus esperat: %s)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Easing:" -msgstr "Esmorteeix Entrada-Sortida" +msgstr "Alleugeriment:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1391,19 +1380,16 @@ msgid "Stream:" msgstr "Element de rà dio" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Reinici (s):" +msgstr "Inici (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "Fosa d'entrada (s):" +msgstr "Final (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animacions:" +msgstr "Clip d'animació:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1492,9 +1478,8 @@ msgid "Editors" msgstr "Editors" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "Insereix una Pista i una Clau" +msgstr "Confirmeu la inserció de pista" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1773,9 +1758,8 @@ msgid "Go to Previous Step" msgstr "Anar al Pas Anterior" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "Resetejar" +msgstr "Aplica reinicialització" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -2236,7 +2220,7 @@ msgstr "Obre" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Propietaris de: %s (Total: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2430,10 +2414,10 @@ msgid "Licenses" msgstr "Llicències" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." msgstr "" -"S'ha produit un error en obrir el fitxer comprimit, no té el format ZIP." +"S'ha produït un error en obrir el fitxer de recursos per a \"%s\" (no en " +"format ZIP)." #: editor/editor_asset_installer.cpp msgid "%s (already exists)" @@ -2456,9 +2440,8 @@ msgid "Uncompressing Assets" msgstr "Descomprimint Recursos" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Ha fracassat l'extracció del paquet dels següents fitxers:" +msgstr "Els fitxers següents no s'han pogut extraure del recurs \"%s\":" #: editor/editor_asset_installer.cpp msgid "(and %s more files)" @@ -2478,9 +2461,8 @@ msgid "Install" msgstr "Instal·la" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" -msgstr "Instal·lador de paquets" +msgstr "Instal·lador de recursos" #: editor/editor_audio_buses.cpp msgid "Speakers" @@ -2650,9 +2632,8 @@ msgid "Create a new Bus Layout." msgstr "Crea un nou Disseny de Bus." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" -msgstr "Obre un Disseny de Bus d'Àudio" +msgstr "Disseny del bus d'à udio" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -22126,7 +22107,7 @@ msgstr "Viatge" msgid "Rotation Degrees" msgstr "Rotació de %s graus." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constant" @@ -24240,6 +24221,11 @@ msgstr "" "Modifica la mida de les Formes de Col. lisió Filles." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Manté la Transformació Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 0c0b8b63ca..a166951396 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -516,6 +516,10 @@ msgid "Pressure" msgstr "Profil" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "PÅ™ichytávat relativnÄ›" @@ -21860,7 +21864,7 @@ msgstr "Cestovat" msgid "Rotation Degrees" msgstr "Rotuji %s stupňů." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "KonstantnÃ" @@ -23970,6 +23974,11 @@ msgstr "" "Změňte velikost koliznÃch tvarů v uzlech potomků." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Zachovat globálnà transformaci" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/da.po b/editor/translations/da.po index 3b19f24ec8..b4f7334278 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -486,6 +486,10 @@ msgid "Pressure" msgstr "Forudindstillet..." #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21994,7 +21998,7 @@ msgstr "Rejse" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstant" @@ -24018,6 +24022,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Anim Skift Transformering" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/de.po b/editor/translations/de.po index f0c79cda0f..64b8268adb 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -87,7 +87,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-30 16:42+0000\n" +"PO-Revision-Date: 2022-07-09 21:11+0000\n" "Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" @@ -466,9 +466,8 @@ msgid "Command" msgstr "Befehl" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (physisch)" +msgstr "Physisch" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -521,6 +520,11 @@ msgid "Pressure" msgstr "Druck" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "Umkehren" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativ" @@ -5560,9 +5564,8 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "Extramaustasten blättern durch Verlauf" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap-Auswahl" +msgstr "Auswahl ziehen und fallen lassen" #: editor/editor_settings.cpp msgid "Appearance" @@ -18449,9 +18452,8 @@ msgid "The package must have at least one '.' separator." msgstr "Das Paket muss mindestens einen Punkt-Unterteiler ‚.‘ haben." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "Einen Build verwenden" +msgstr "Eigener Build" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" @@ -18743,66 +18745,69 @@ msgstr "" "„Use Custom Build“ muss aktiviert werden um die Plugins nutzen zu können." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"„Hand Tracking“ ist nur gültig wenn „Xr Mode“ als „Occulus Mobile VrApi“ " -"oder „OpenXR“ gesetzt wurde." +"„Hand Tracking“ ist nur gültig wenn „XR Mode“ als „Oculus Mobile VrApi“ oder " +"„OpenXR“ gesetzt wurde." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "" -"„Passthrough“ ist nur gültig wenn „Xr Mode“ als „OpenXR“ gesetzt wurde." +"„Passthrough“ ist nur gültig wenn „XR Mode“ als „OpenXR“ gesetzt wurde." #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." msgstr "„Export AAB“ ist nur gültig wenn „Use Custom Build“ aktiviert ist." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"Das „Min Sdk“ zu ändern ist nur möglich wenn „Use Custom Build“ aktiviert " -"ist." +"Das „Min SDK“ zu überschreiben ist nur möglich wenn „Use Custom Build“ " +"aktiviert ist." #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"„Min SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig ist." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"„Min SDK“ kann nicht niedriger als %d sein, der Version, die die Godot-" +"Bibliothek benötigt." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"Das „Target Sdk“ zu ändern ist nur möglich wenn „Use Custom Build“ aktiviert " +"„Target SDK“ kann nur überschrieben werden wenn „Use Custom Build“ aktiviert " "ist." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"„Taret SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig " +"ist." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"„Target SDK“ %d ist höher als die Standardversion %d. Diese Kombination " +"könnte funktionieren, wurde aber nicht getestet und könnte gegebenenfalls " +"instabil sein." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." msgstr "" -"Die Version des „Target Sdk“ muss größer gleich der des „Min Sdk“ sein." +"Die „Target SDK“-Version muss größer gleich der „Min SDK“-Version sein." #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp @@ -21093,9 +21098,8 @@ msgstr "" "map_get_path()‘ zu verwenden." #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Pathfinding" -msgstr "Zuordnung" +msgstr "Pfadfinden" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Path Desired Distance" @@ -21110,9 +21114,8 @@ msgid "Path Max Distance" msgstr "Max Pfad-Distanz" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance" -msgstr "Erweitert" +msgstr "Vermeiden" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Avoidance Enabled" @@ -21177,7 +21180,7 @@ msgstr "Reisekosten" msgid "Rotation Degrees" msgstr "Rotationswinkel" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "Globale Rotation" @@ -23106,6 +23109,11 @@ msgstr "" "geändert werden." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Globales Transform" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "Matrix" @@ -24213,9 +24221,8 @@ msgid "Fold Gutter" msgstr "Einklappenspalte" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Drag And Drop Selection Enabled" -msgstr "Textauswahl möglich" +msgstr "Ziehen-und-Fallenlassen-Auswahl aktiviert" #: scene/gui/text_edit.cpp msgid "Hiding Enabled" @@ -24592,6 +24599,11 @@ msgid "" "Effects.\n" "HDR will be disabled for this Viewport." msgstr "" +"In diesem Ansichtsfenster ist HDR aktiv, jedoch wurde dessen Nutzung auf 2D " +"oder 2D-No-Sampling eingestellt.\n" +"HDR wird nur in Ansichtsfenstern deren Nutzung auf 3D oder 3D-No-Effects " +"eingestellt sind unterstützt.\n" +"HDR wird für dieses Ansichtsfenster deaktiviert." #: scene/main/viewport.cpp msgid "ARVR" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 5d2d5f1cbc..231863615b 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -435,6 +435,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20231,7 +20235,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22046,6 +22050,10 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +msgid "Global Translation" +msgstr "" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index a061cc5a59..8511b4fdd2 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -469,6 +469,10 @@ msgid "Pressure" msgstr "Πίεση" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Σχετικό" @@ -22038,7 +22042,7 @@ msgstr "Ταξίδι" msgid "Rotation Degrees" msgstr "ΠεÏιστÏοφή %s μοίÏες." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "ΣταθεÏή" @@ -24163,6 +24167,11 @@ msgstr "" "Αλλάξτε μÎγεθος στα σχήματα σÏγκÏουσης των παιδιών." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ΔιατήÏηση παγκόσμιου μετασχηματισμοÏ" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 1f648844a2..d69ca8d97f 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -447,6 +447,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20337,7 +20341,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22218,6 +22222,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 2eef4fc0d0..3b651b3e97 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -493,6 +493,10 @@ msgid "Pressure" msgstr "AntaÅagordo" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Kapti relative" @@ -21632,7 +21636,7 @@ msgstr "VojaÄa" msgid "Rotation Degrees" msgstr "Rotacia paÅo:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstanto" @@ -23654,6 +23658,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transformo" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index febff41060..3c21955a46 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -522,6 +522,10 @@ msgid "Pressure" msgstr "Presionado" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativo" @@ -21650,7 +21654,7 @@ msgstr "Viaje" msgid "Rotation Degrees" msgstr "Grados de Rotación" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constante Global" @@ -23770,6 +23774,11 @@ msgstr "" "En su lugar, cambia el tamaño en las formas de colisión de los hijos." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Mantener transformación global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index eeea3a9922..de1187f08f 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -473,6 +473,11 @@ msgstr "Preset" #: core/os/input_event.cpp #, fuzzy +msgid "Pen Inverted" +msgstr "Invertir" + +#: core/os/input_event.cpp +#, fuzzy msgid "Relative" msgstr "Ajuste Relativo" @@ -21890,7 +21895,7 @@ msgstr "Viaje" msgid "Rotation Degrees" msgstr "Rotando %s grados." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constante Global" @@ -23995,6 +24000,11 @@ msgstr "" "En su lugar, cambiá el tamaño de los collision shapes hijos." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Mantener Transformación Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "Matriz" diff --git a/editor/translations/et.po b/editor/translations/et.po index b7ed666bb0..b355c9c343 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -477,6 +477,10 @@ msgid "Pressure" msgstr "Eelseadistus" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21068,7 +21072,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstant" @@ -23041,6 +23045,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Tõlked" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index ff9601ad57..fc753e6cb9 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -451,6 +451,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Atxikitze erlatiboa" @@ -20844,7 +20848,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstantea" @@ -22790,6 +22794,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Translazio atzikitzea:" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index ae8a37388a..f43848b065 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -503,6 +503,10 @@ msgid "Pressure" msgstr "بازنشانی بزرگنمایی" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "GDNative" @@ -21832,7 +21836,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "ثابت" @@ -23857,6 +23861,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "انتقال را در انیمیشن تغییر بده" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 7613bdfcce..b83c7d11fa 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -501,6 +501,10 @@ msgid "Pressure" msgstr "Esiasetukset" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Suhteellinen tarttuminen" @@ -21899,7 +21903,7 @@ msgstr "Matkaa" msgid "Rotation Degrees" msgstr "Kierto %s astetta." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Globaali vakio" @@ -24049,6 +24053,11 @@ msgstr "" "Muuta kokoa sen sijaan alisolmujen törmäysmuodoissa." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Pidä globaali muunnos" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 24a5742ef6..c4e02900d7 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -448,6 +448,10 @@ msgid "Pressure" msgstr "Presyur" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatibo" @@ -20496,7 +20500,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22368,6 +22372,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "3D Transform Track" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 8822d35687..e4f5a2feff 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -99,13 +99,15 @@ # HOUA <ninjacowzx@gmail.com>, 2022. # DinosaurHorseSword <ewenlandry@mailfence.com>, 2022. # Arnaud Lier <arnaud@ric-rac.org>, 2022. +# Jérémie Guegain <mirejai@orange.fr>, 2022. +# cwulveryck <cwulveryck@online.fr>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-03 00:44+0000\n" -"Last-Translator: Sofiane <Sofiane-77@caramail.fr>\n" +"PO-Revision-Date: 2022-07-16 06:20+0000\n" +"Last-Translator: cwulveryck <cwulveryck@online.fr>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -113,7 +115,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -314,8 +316,9 @@ msgid "Page Size" msgstr "Taille de page" #: core/io/file_access_network.cpp +#, fuzzy msgid "Page Read Ahead" -msgstr "" +msgstr "Page lue devant" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" @@ -326,8 +329,9 @@ msgid "Connection" msgstr "Connexion" #: core/io/http_client.cpp +#, fuzzy msgid "Read Chunk Size" -msgstr "" +msgstr "Lire la taille du tronçon" #: core/io/marshalls.cpp msgid "Object ID" @@ -359,15 +363,15 @@ msgstr "Mode de Transfert" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "Taille maximale du tampon d'encodage" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "Taille maximale du tampon d'entrée" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "Taille maximale du tampon de sortie" #: core/io/packet_peer.cpp msgid "Stream Peer" @@ -539,6 +543,11 @@ msgid "Pressure" msgstr "Pression" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "Inverser" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatif" @@ -732,11 +741,11 @@ msgstr "Noms de scènes" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "Rechercher dans les extensions de fichiers" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Chemin où chercher les modèles de scripts" #: core/project_settings.cpp msgid "Version Control Autoload On Startup" @@ -753,15 +762,13 @@ msgstr "Entrée" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "Accepter" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" msgstr "Sélectionner" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" msgstr "Annuler" @@ -783,7 +790,7 @@ msgstr "Droite" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "Haut" #: core/project_settings.cpp msgid "UI Down" @@ -796,11 +803,11 @@ msgstr "Page Haut" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "Page Bas" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "Accueil Interface Utilisateur" #: core/project_settings.cpp msgid "UI End" @@ -862,7 +869,7 @@ msgstr "Filtres" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Augmenter l'intensité" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -900,19 +907,20 @@ msgstr "Formats" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Appairement longue distance" #: core/project_settings.cpp msgid "Compression Level" msgstr "Niveau de Compression" #: core/project_settings.cpp +#, fuzzy msgid "Window Log Size" -msgstr "" +msgstr "Taille de la fenêtre du journal" #: core/project_settings.cpp msgid "Zlib" @@ -928,7 +936,7 @@ msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Modules" #: core/register_core_types.cpp msgid "TCP" @@ -943,8 +951,9 @@ msgid "Packet Peer Stream" msgstr "" #: core/register_core_types.cpp +#, fuzzy msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "Tampon Max (puissance de 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" @@ -984,8 +993,9 @@ msgid "Test" msgstr "Test" #: core/translation.cpp scene/resources/font.cpp +#, fuzzy msgid "Fallback" -msgstr "" +msgstr "Repli" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1021,7 +1031,7 @@ msgstr "Eio" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Tampons" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1043,7 +1053,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1060,7 +1070,7 @@ msgstr "Aligner au pixel près" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "Taille du tampon immédiat (Ko)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1071,28 +1081,28 @@ msgstr "Précalculer les lightmaps" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Utiliser l’échantillonnage bicubique" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "Maximum d'éléments pouvant être rendus" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Maximum de lumières pouvant être rendues" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "Centrer sur la sélection" +msgstr "Nombre maximum de reflets pouvant être rendus" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "Maximum de lumières par objet" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Subsurface Scattering" -msgstr "" +msgstr "Transluminescence" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1112,8 +1122,9 @@ msgid "Follow Surface" msgstr "Suivre la surface" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Weight Samples" -msgstr "" +msgstr "Échantillons de poids" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" @@ -1199,9 +1210,8 @@ msgstr "Changer l’appel de l’animation" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Image %" +msgstr "Trame" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1227,14 +1237,13 @@ msgid "Value" msgstr "Valeur" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Compte" +msgstr "Nombre d'arguments" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Args" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1258,17 +1267,16 @@ msgstr "Définir la poignée" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Flux" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Décalage du Pivot" +msgstr "Décalage du Départ" #: editor/animation_track_editor.cpp #, fuzzy msgid "End Offset" -msgstr "Décalage :" +msgstr "Décalage à la fin" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1418,9 +1426,8 @@ msgid "Type:" msgstr "Type :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Modèle d'exportation non valide :" +msgstr "(Invalide, type attendu : %s)" #: editor/animation_track_editor.cpp #, fuzzy @@ -1438,9 +1445,8 @@ msgid "Out-Handle:" msgstr "Définir la poignée" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Item radio" +msgstr "Flux :" #: editor/animation_track_editor.cpp #, fuzzy @@ -1695,7 +1701,7 @@ msgstr "Méthodes" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bezier" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2289,7 +2295,7 @@ msgstr "Ouvrir" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Possesseur de : %s (Total : %d)" #: editor/dependency_editor.cpp msgid "" @@ -2857,22 +2863,19 @@ msgstr "Choisir" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Exportation du projet pour la plateforme :" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Copier le chemin du nÅ“ud" +msgstr "Terminé avec des erreurs." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Paquetage installé avec succès !" +msgstr "Terminé avec succès." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Échec :" +msgstr "Échec." #: editor/editor_export.cpp msgid "Storing File:" @@ -2887,29 +2890,24 @@ msgid "Packing" msgstr "Empaquetage" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Enregistrer sous" +msgstr "Enregistrer PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Impossible de créer le dossier." +msgstr "Impossible de créer le fichier \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Impossible d'exporter les fichiers du projet" +msgstr "Impossible d'exporter les fichiers du projet." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Impossible d'ouvrir le fichier pour écriture :" +msgstr "Impossible d'ouvrir le fichier en lecture depuis le chemin \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Enregistrer sous" +msgstr "Enregistrer le ZIP" #: editor/editor_export.cpp msgid "" @@ -2989,29 +2987,29 @@ msgid "64 Bits" msgstr "64 Bits" #: editor/editor_export.cpp +#, fuzzy msgid "Embed PCK" -msgstr "" +msgstr "PCK Intégré" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "RegionDeTexture" +msgstr "Format de la texture" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp msgid "No BPTC Fallbacks" @@ -3035,25 +3033,22 @@ msgid "Prepare Template" msgstr "Gérer les modèles" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Le chemin de l'exportation donné n'existe pas :" +msgstr "Le chemin de l'exportation donné n'existe pas." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Fichier modèle introuvable :" +msgstr "Fichier modèle introuvable : \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Modèle d'exportation non valide :" +msgstr "La copie du modèle d'exportation a échoué." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp #, fuzzy msgid "PCK Embedding" -msgstr "Remplissage(Padding)" +msgstr "Intégration du PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3061,7 +3056,7 @@ msgstr "Le PCK inclus dans un export 32-bits ne peut dépasser 4 Go." #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "Convertir les ressources textuelles en binaire lors de l'exportation" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3387,8 +3382,9 @@ msgid "Show Hidden Files" msgstr "Afficher les fichiers cachés" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Disable Overwrite Warning" -msgstr "" +msgstr "Désactiver l'avertissement de réécriture" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3491,7 +3487,7 @@ msgstr "Ré-importation des assets" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "Réimporter les fichiers importés manquants" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3602,7 +3598,7 @@ msgstr "Aide" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "Trier les fonctions par ordre alphabétique" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4085,7 +4081,8 @@ msgstr "Sauvegarder & Recharger" #: editor/editor_node.cpp #, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Sauvegarder les modifications effectuées à « %s » avant de quitter ?" +msgstr "" +"Sauvegarder les modifications effectuées dans « %s » avant de recharger ?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4404,6 +4401,8 @@ msgstr "%d fichiers supplémentaires" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" +"Impossible d'écrire dans le fichier '%s', le fichier est peut être utilisé, " +"verrouillé ou vous n'avez pas les permissions pour écrire dessus." #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp @@ -4416,53 +4415,49 @@ msgid "Scene Tabs" msgstr "Basculer entre onglets de scène" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Toujours afficher la grille" +msgstr "Toujours afficher le bouton fermer" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "Redimensionner si plusieurs onglets" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "" +msgstr "Largeur Minimum" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" msgstr "Sortie" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Effacer la sortie" +msgstr "Toujours nettoyer la sortie lors du lancement" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "" +msgstr "Toujours afficher la sortie lors du lancement" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" -msgstr "" +msgstr "Toujours fermer la sortie à l'arrêt" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "Enregistrer lorsque le focus est perdu" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy msgid "Save Each Scene On Quit" -msgstr "Sauvegarder la branche comme scène" +msgstr "Enregistrer toutes les scènes à la fermeture" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Voir information" +msgstr "Confirmer avant de quitter" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Cacher l'indicateur d'activité" +msgstr "Afficher l'indicateur d'activité" #: editor/editor_node.cpp msgid "Update Continuously" @@ -4481,11 +4476,11 @@ msgstr "Localisation" #: editor/editor_node.cpp #, fuzzy msgid "Restore Scenes On Load" -msgstr "Le nÅ“ud de la scène" +msgstr "Restaurer les scènes au chargement" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "Afficher l’aperçu au survol" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4494,11 +4489,11 @@ msgstr "Inspecteur" #: editor/editor_node.cpp #, fuzzy msgid "Default Property Name Style" -msgstr "Chemin du projet :" +msgstr "Style par défaut des noms de propriétés" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "Pas par défaut des flottant" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4506,30 +4501,32 @@ msgid "Disable Folding" msgstr "Bouton désactivé" #: editor/editor_node.cpp +#, fuzzy msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Déplier automatiquement les scènes étrangères" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Édition horizontale de Vector2" #: editor/editor_node.cpp +#, fuzzy msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Édition de Types de Vecteur Horizontal" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Ouvrir dans l'Inspecteur" +msgstr "Ouvrir les ressources dans l'inspecteur actuel" #: editor/editor_node.cpp #, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Ouvrir dans l'Inspecteur" +msgstr "Ressources à ouvrir dans un nouvel inspecteur" #: editor/editor_node.cpp +#, fuzzy msgid "Default Color Picker Mode" -msgstr "" +msgstr "Mode par défaut du sélectionneur de couleur" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -5189,8 +5186,9 @@ msgid "Debugger" msgstr "Débogueur" #: editor/editor_profiler.cpp +#, fuzzy msgid "Profiler Frame History Size" -msgstr "" +msgstr "Taille de l'historique de la trame du profileur" #: editor/editor_profiler.cpp #, fuzzy @@ -5328,20 +5326,17 @@ msgstr "Nouveau %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "Changer le type de base" +msgstr "Type de base" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Ajouter une ressource" +msgstr "Ressource modifiée" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" -msgstr "Élément modifiable" +msgstr "Modifiable" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" @@ -5365,9 +5360,8 @@ msgstr "" "Ajoutez un préréglage exécutable dans le menu d'exportation." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Projet" +msgstr "Exécution du projet" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5394,34 +5388,34 @@ msgid "Did you forget the '_run' method?" msgstr "Avez-vous oublié la méthode « _run » ?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Disposition de l'éditeur" +msgstr "Langue de l'Éditeur" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Tout afficher" +msgstr "Échelle de l'affichage" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Échelle personnalisé de l'affichage" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "" +msgstr "Taille de la police principale" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Taille de la police du code" #: editor/editor_settings.cpp +#, fuzzy msgid "Font Antialiased" -msgstr "" +msgstr "Anticrénelage appliqué sur la police" #: editor/editor_settings.cpp +#, fuzzy msgid "Font Hinting" -msgstr "" +msgstr "Indication de police" #: editor/editor_settings.cpp msgid "Main Font" @@ -5429,7 +5423,7 @@ msgstr "Police Principale" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "" +msgstr "Principale police grasse" #: editor/editor_settings.cpp msgid "Code Font" @@ -5437,11 +5431,12 @@ msgstr "Police du Code" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" -msgstr "" +msgstr "Assombrir l'éditeur à l'ouverture d'un dialogue" #: editor/editor_settings.cpp main/main.cpp +#, fuzzy msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Mode de faible latence Processeur" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" @@ -5454,7 +5449,7 @@ msgstr "Mode Sans Distraction" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "Ouvrir automatiquement les captures d'écran" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" @@ -5472,7 +5467,7 @@ msgstr "Préréglage" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Couleur de police et d'icône" #: editor/editor_settings.cpp msgid "Base Color" @@ -5485,7 +5480,7 @@ msgstr "Prélever une couleur" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "Contraste" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" @@ -5502,8 +5497,9 @@ msgid "Border Size" msgstr "Pixels de bordure" #: editor/editor_settings.cpp +#, fuzzy msgid "Use Graph Node Headers" -msgstr "" +msgstr "Utiliser les en-tête de noeud Graph" #: editor/editor_settings.cpp #, fuzzy @@ -5539,13 +5535,13 @@ msgid "On Save" msgstr "Enregistrer" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "Copier la ressource" +msgstr "Compresser les ressources binaires" #: editor/editor_settings.cpp +#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "Sauvegarde sécurisée lors de l'archivage puis renommer" #: editor/editor_settings.cpp #, fuzzy @@ -5565,8 +5561,9 @@ msgid "Scene Tree" msgstr "une arborescence, arbre des scènes" #: editor/editor_settings.cpp +#, fuzzy msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "Lancer le dialogue de Création totalement expandu" #: editor/editor_settings.cpp #, fuzzy @@ -5579,7 +5576,7 @@ msgstr "Éditeur de Propriétés" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" -msgstr "" +msgstr "Intervalle d’autorafraîchissement" #: editor/editor_settings.cpp #, fuzzy @@ -5593,8 +5590,9 @@ msgstr "Thème de l'éditeur" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Line Spacing" -msgstr "" +msgstr "Espace entre les lignes" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp @@ -5609,15 +5607,16 @@ msgstr "Coloration syntaxique" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "Mettre en évidence toutes les occurrences" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "" +msgstr "Mettre en évidence la ligne actuelle" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Surligner les lignes Typées" #: editor/editor_settings.cpp #, fuzzy @@ -5634,9 +5633,8 @@ msgid "Convert Indent On Save" msgstr "Convertir indentations en espaces" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "Appels de dessin :" +msgstr "Montrer les tabulations" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5652,11 +5650,11 @@ msgstr "Navigation" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "" +msgstr "Défilement Doux" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "Vitesse du défilement vertical" #: editor/editor_settings.cpp #, fuzzy @@ -5665,7 +5663,7 @@ msgstr "Afficher l'origine" #: editor/editor_settings.cpp msgid "Minimap Width" -msgstr "" +msgstr "Largeur de la mini-carte" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" @@ -5678,7 +5676,7 @@ msgstr "Sélection de la GridMap" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "Apparence" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Show Line Numbers" @@ -5691,7 +5689,7 @@ msgstr "Numéro de ligne :" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Montrer le bandeau de marque-page" #: editor/editor_settings.cpp #, fuzzy @@ -5699,12 +5697,13 @@ msgid "Show Breakpoint Gutter" msgstr "Passer les points d'arrêt" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Info Gutter" -msgstr "" +msgstr "Montrer le bandeau d'information" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "Rétrécir le code" #: editor/editor_settings.cpp msgid "Word Wrap" @@ -5727,8 +5726,9 @@ msgid "Script List" msgstr "Liste des Scripts" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Members Overview" -msgstr "" +msgstr "Montrer l'ensemble des Membres" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Files" @@ -5740,16 +5740,19 @@ msgid "Trim Trailing Whitespace On Save" msgstr "Supprimer les espaces de fin de ligne" #: editor/editor_settings.cpp +#, fuzzy msgid "Autosave Interval Secs" -msgstr "" +msgstr "Intervalle entre les auto-sauvegarde (en secondes)" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Restore Scripts On Load" -msgstr "" +msgstr "Restaurer les scripts lors du chargement" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" msgstr "" +"Recharger et parcourir les scripts automatiquement lors de la sauvegarde" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" @@ -5766,23 +5769,23 @@ msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" -msgstr "" +msgstr "Curseur" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "Défiler au-delà de la fin du fichier" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "Caret bloc" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "Clignotement du caret" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "Vitesse du clignotement du caret" #: editor/editor_settings.cpp #, fuzzy @@ -5801,11 +5804,11 @@ msgstr "" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "Complétion automatique des accolades" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "Délai d'auto-complétion du code" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" @@ -5844,8 +5847,9 @@ msgid "Help Source Font Size" msgstr "Taille de la police de l'aide de la source" #: editor/editor_settings.cpp +#, fuzzy msgid "Help Title Font Size" -msgstr "" +msgstr "Taille de la police du titre Aide" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -5862,11 +5866,11 @@ msgstr "Aperçu de la taille" #: editor/editor_settings.cpp msgid "Primary Grid Color" -msgstr "" +msgstr "Couleur de la grille principale" #: editor/editor_settings.cpp msgid "Secondary Grid Color" -msgstr "" +msgstr "Couleur de la grille secondaire" #: editor/editor_settings.cpp #, fuzzy @@ -5903,7 +5907,7 @@ msgstr "Point" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "Forme" #: editor/editor_settings.cpp #, fuzzy @@ -5916,11 +5920,11 @@ msgstr "Taille de la Grille" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "Niveau maximal de division de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "Niveau minimal de division de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" @@ -5957,7 +5961,7 @@ msgstr "Défaut" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "Nombre de fils CPU pour calculer les cartes de lumières" #: editor/editor_settings.cpp #, fuzzy @@ -5980,11 +5984,11 @@ msgstr "Style de Zoom" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "Émuler un pavé numérique" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "Émuler souris à 3 boutons" #: editor/editor_settings.cpp #, fuzzy @@ -5997,9 +6001,8 @@ msgid "Pan Modifier" msgstr "Mode navigation" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Modifier" -msgstr "Modifié" +msgstr "Multiplicateur de Zoom" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" @@ -6077,7 +6080,7 @@ msgstr "Magnétisme intelligent" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "Largeur des os" #: editor/editor_settings.cpp #, fuzzy @@ -6099,8 +6102,9 @@ msgid "Bone IK Color" msgstr "" #: editor/editor_settings.cpp +#, fuzzy msgid "Bone Outline Color" -msgstr "" +msgstr "Couleur de bordure de l'Os" #: editor/editor_settings.cpp #, fuzzy @@ -6108,12 +6112,14 @@ msgid "Bone Outline Size" msgstr "Taille du contour :" #: editor/editor_settings.cpp +#, fuzzy msgid "Viewport Border Color" -msgstr "" +msgstr "Couleur de bordure de la fenêtre d'affichage" #: editor/editor_settings.cpp +#, fuzzy msgid "Constrain Editor View" -msgstr "" +msgstr "Restreindre la fenêtre d'Éditeur" #: editor/editor_settings.cpp msgid "Simple Panning" @@ -6157,12 +6163,14 @@ msgid "Default Create Reset Tracks" msgstr "Créer des pistes RESET" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Past Color" -msgstr "" +msgstr "Couleur de couche Oignon précedente" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Future Color" -msgstr "" +msgstr "Couleur de la couche d'Oignon suivante" #: editor/editor_settings.cpp #, fuzzy @@ -6171,11 +6179,11 @@ msgstr "Editeur de groupe" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "Opacité de la mini-carte" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "Placement de la fenêtre" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp @@ -6190,7 +6198,7 @@ msgstr "Définir la position de sortie de la courbe" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "Écran" #: editor/editor_settings.cpp #, fuzzy @@ -6223,17 +6231,17 @@ msgstr "Paramètres de l'éditeur" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "Proxy HTTP" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "Hôte" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "Port" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6251,7 +6259,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "Couleur des mots-clés" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" @@ -6272,7 +6280,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "Couleur des commentaires" #: editor/editor_settings.cpp #, fuzzy @@ -6322,7 +6330,7 @@ msgstr "Numéro de ligne :" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "Couleur du caret" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6357,7 +6365,7 @@ msgstr "Coloration syntaxique" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Couleur des nombres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6385,8 +6393,9 @@ msgid "Breakpoint Color" msgstr "Point d'arrêts" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Executing Line Color" -msgstr "" +msgstr "Couleur de la ligne d’exécution" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" @@ -6713,8 +6722,9 @@ msgstr "" "téléchargement est terminé." #: editor/fileserver/editor_file_server.cpp +#, fuzzy msgid "File Server" -msgstr "" +msgstr "Serveur de fichiers" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -7087,7 +7097,7 @@ msgstr "Gérer les groupes" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" @@ -7121,7 +7131,7 @@ msgstr "Correction de Couleur" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "Pas de BPTC si RVB" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7129,13 +7139,13 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "Paramètres" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "Répéter" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp @@ -7145,24 +7155,24 @@ msgstr "Filtre" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "Signaux" +msgstr "Mipmaps" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Anisotropic" -msgstr "" +msgstr "Anisotropie" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy msgid "Slices" -msgstr "Coupe automatique" +msgstr "Coupures" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -7179,30 +7189,26 @@ msgid "Vertical" msgstr "Vertical" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "Générer des points" +msgstr "Générer les tangentes" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "Mode mise à l'échelle" +msgstr "Échelle du maillage" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "Décalage :" +msgstr "Décalage du maillage" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Octahedral Compression" -msgstr "Expression" +msgstr "Compression Octaédrique" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "Optimiser les drapeaux de Mesh" +msgstr "Optimiser les paramètres du maillage" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7258,9 +7264,8 @@ msgid "Root Name" msgstr "Nom de la Racine" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "Mode mise à l'échelle" +msgstr "Échelle de la racine" #: editor/import/resource_importer_scene.cpp msgid "Custom Script" @@ -7271,17 +7276,17 @@ msgid "Storage" msgstr "Stockage" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Use Legacy Names" -msgstr "" +msgstr "Utiliser des noms classiques" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" msgstr "Matériaux" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "Réimporter" +msgstr "Conserver à la réimportation" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Meshes" @@ -7295,12 +7300,11 @@ msgstr "Modifier la tangente de courbes" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Light Baking" -msgstr "Précalculer les lightmaps" +msgstr "Pré-calculer les cartes de lumières" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "LightMap Bake" +msgstr "Taille des Texels dans la carte de lumières" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" @@ -7312,13 +7316,13 @@ msgid "Use Named Skins" msgstr "Utiliser le magnétisme d'échelle" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "Ouvrir un fichier" +msgstr "Fichiers externes" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Store In Subdir" -msgstr "" +msgstr "Stocker dans un sous-dossier" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7326,14 +7330,12 @@ msgid "Filter Script" msgstr "Filtrer les scripts" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "Transformation" +msgstr "Conserver les pistes personnalisées" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "Optimiser" +msgstr "Optimiseur" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7347,9 +7349,8 @@ msgstr "Optimiser" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp #: scene/gui/rich_text_label.cpp scene/resources/curve.cpp #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Enabled" -msgstr "Activer" +msgstr "Activé" #: editor/import/resource_importer_scene.cpp msgid "Max Linear Error" @@ -7427,30 +7428,34 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s : La texture a été utilisé comme carte de normales dans la 3D. Activation " +"de la compression rouge-verte pour réduire l'utilisation de la mémoire (le " +"canal bleu est désactivé)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s : La texture a été détecter comme étant utilisé dans la 3D. Activation du " +"filtrage, de la répétition, de la génération de mipmap et de la compression " +"de la texture dans la mémoire vidéo." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, Détecter la 3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "Pixels pleins" +msgstr "Pixel 2D" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "Mauvaise qualité" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "Mode sélection" +msgstr "Mode HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" @@ -7461,16 +7466,15 @@ msgstr "" #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Carte de normales" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Process" -msgstr "Post-traitement" +msgstr "Processus" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "Corriger la bordure alpha" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7479,37 +7483,36 @@ msgstr "Modifier le polygone" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr en tant que Srgb" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Invert Color" -msgstr "Vertex" +msgstr "Inverser la couleur" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "Échelle aléatoire :" +msgstr "Inverser l'axe Y de la carte de normales" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Size Limit" -msgstr "Limites" +msgstr "Limite de taille" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "Détecter la 3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Attention, aucune compression de la mémoire vidéo qui aille sur PC n'est " +"activé dans les paramètres du projet. Cette texture ne s'affichera pas " +"correctement sur PC." #: editor/import/resource_importer_texture_atlas.cpp msgid "Atlas File" @@ -7529,55 +7532,48 @@ msgid "Trim Alpha Border From Region" msgstr "" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "Force-pousser" +msgstr "Force" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Mono" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate" -msgstr "Mélanger le nÅ“ud" +msgstr "Taux maximal" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate Hz" -msgstr "Mélanger le nÅ“ud" +msgstr "Taux maximal en Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" msgstr "" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "Format" +msgstr "Normaliser" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "Mode déplacement" +msgstr "Mode de bouclage" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "Mode déplacement" +msgstr "Début de la boucle" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "Mode déplacement" +msgstr "Fin de la boucle" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7658,9 +7654,8 @@ msgid "Failed to load resource." msgstr "Impossible de charger la ressource." #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "Nom du projet :" +msgstr "Style des noms de propriétés" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" @@ -7672,13 +7667,12 @@ msgid "Capitalized" msgstr "Majuscule à chaque mot" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "Localisation" +msgstr "Traduit" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "La traduction n'est pas disponible pour la langue actuel." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8229,9 +8223,8 @@ msgid "New" msgstr "Nouveau" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "Référence de classe %s" +msgstr "Collé en tant que référence" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8561,7 +8554,7 @@ msgstr "Filtres…" #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Utiliser le multitâche" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8724,25 +8717,21 @@ msgid "Loading..." msgstr "Chargement..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" msgstr "Premier" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "Précédent" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "Suivant" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" msgstr "Dernier" @@ -8793,7 +8782,7 @@ msgstr "En période de test" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "N'a pas réussi à récupérer la configuration du dépôt." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -9360,23 +9349,20 @@ msgid "View" msgstr "Affichage" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "Afficher la grille" +msgstr "Afficher" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "Magnétisme intelligent" +msgstr "Afficher lors de la magnétisation" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Cacher" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid" -msgstr "Basculer le mode" +msgstr "Activer/Désactiver la grille" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9728,16 +9714,16 @@ msgstr "Dégradé édité" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "Échanger les points de remplissage du GradientTexture2D" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#, fuzzy msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Échanger les points de remplissage du dégradé" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "Basculer le mode" +msgstr "Activer/Désactiver le magnétisme de la grille" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9756,13 +9742,12 @@ msgstr "Icône" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Séparation :" +msgstr "Séparateur" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -10006,7 +9991,6 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" msgstr "Librairie de maillages" @@ -10569,7 +10553,7 @@ msgstr "Synchroniser les os avec le polygone" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "Définir cast_to" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10900,21 +10884,19 @@ msgstr "Résultats de recherche" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Ouvrir le script principal lors du changement de scène" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Externe" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Use External Editor" -msgstr "Déboguer avec un éditeur externe" +msgstr "Utiliser un éditeur externe" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Exec Path" -msgstr "Chemin d'exportation" +msgstr "Chemin d'exécution" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10923,7 +10905,7 @@ msgstr "Sélectionner le fichier de modèles" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "Mettre en évidence le script actuel" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" @@ -10939,18 +10921,16 @@ msgid "Group Help Pages" msgstr "Groupe sélectionné" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort Scripts By" -msgstr "Créer un script" +msgstr "Trier les scripts par" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Nom du script :" +msgstr "Lister les noms de scripts en tant que" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "Paramètres d'exécution" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11471,10 +11451,11 @@ msgid "(Not in GLES2)" msgstr "(Non disponible dans GLES2)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Debug draw modes are only available when using the GLES3 renderer, not GLES2." -msgstr "Non disponible quand le moteur de rendu GLES2 est utilisé." +msgstr "" +"Les modes de rendu de débogage ne sont disponibles qu'avec le moteur GLES3, " +"et pas GLES2." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -11777,9 +11758,8 @@ msgid "Manipulator Gizmo Opacity" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Show Viewport Rotation Gizmo" -msgstr "Verrouiller la rotation de la vue" +msgstr "Afficher le manipulateur de rotation dans le viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "Unnamed Gizmo" @@ -11832,9 +11812,8 @@ 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 "Convert to MeshInstance2D" -msgstr "Convertir en Mesh2D" +msgstr "Convertir en MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -12238,9 +12217,8 @@ msgstr "" "Fermer tout de même ?" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "Supprimer la tuile" +msgstr "Supprimer le type" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -12285,14 +12263,12 @@ msgstr "" "thème." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Type" -msgstr "Ajouter un item de type" +msgstr "Ajouter un type de thème" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Theme Type" -msgstr "Retirer le dépôt distant" +msgstr "Supprimer un type de thème" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -12411,7 +12387,7 @@ msgstr "Sélectionnez une autre ressource Theme :" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Theme Resource" -msgstr "Renommer une ressource" +msgstr "Ressource de Thème" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -12472,7 +12448,6 @@ msgid "Set Variation Base Type" msgstr "Définir type de variable" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Base Type" msgstr "Changer le type de base" @@ -12498,10 +12473,13 @@ msgid "Select the variation base type from a list of available types." msgstr "" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"Un type affilié à une classe intégré ne peut pas être marqué comme une " +"variante d'un autre type." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12742,14 +12720,13 @@ msgid "Clear Transform" msgstr "Supprimer la transformation" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Tile Map" -msgstr "Peindre sur la TileMap" +msgstr "Carte de Tuiles" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "Largeur minimale de la palette" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -12757,19 +12734,16 @@ msgid "Palette Item H Separation" msgstr "Séparateur nommé" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Names" -msgstr "Afficher toutes les langues" +msgstr "Afficher les noms des tuiles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Ids" -msgstr "Afficher les règles" +msgstr "Afficher les IDs des tuiles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Sort Tiles By Name" -msgstr "Trier les fichiers" +msgstr "Trier les tuiles par nom" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -12778,19 +12752,16 @@ msgstr "Remplissage du seau" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editor Side" -msgstr "Éditeur" +msgstr "Coté Éditeur" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Display Grid" -msgstr "Affichage des surimpressions" +msgstr "Afficher la grille" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "Prélever une couleur" +msgstr "Couleur des axes" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -13129,7 +13100,6 @@ msgid "This property can't be changed." msgstr "Cette propriété ne peut être changée." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" msgstr "Options de magnétisme" @@ -13154,14 +13124,12 @@ msgstr "Pas" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "Séparation :" +msgstr "Séparation" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Tile" -msgstr "Sélectionner" +msgstr "Tuile sélectionné" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp @@ -13170,9 +13138,8 @@ msgstr "Sélectionner" #: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp #: scene/resources/material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture" -msgstr "Texte" +msgstr "Texture" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13187,9 +13154,8 @@ msgstr "Matériau" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "Peupler" +msgstr "Moduler" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13202,39 +13168,32 @@ msgid "Autotile Bitmask Mode" msgstr "Mode Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "Taille de Contour" +msgstr "Taille des sous-tuiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" -msgstr "Bouclage de l’animation" +msgstr "Espacement des sous-tuiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "Créer un polygone occulteur" +msgstr "Décalage de l’occulteur" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" -msgstr "Mode Navigation" +msgstr "Décalage de la navigation" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "Décalage :" +msgstr "Décalage de la forme" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "Transformation" +msgstr "Transformation de la forme" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "Collision" +msgstr "Collision sélectionné" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13247,9 +13206,8 @@ msgid "Selected Collision One Way Margin" msgstr "Mode collision" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Navigation" -msgstr "Navigation visible" +msgstr "Navigation sélectionnée" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -14354,11 +14312,13 @@ msgstr "Exécutable" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Exporter le projet pour tous les préréglages définis." #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Tous les préréglages doivent avoir un chemin d'exportation défini pour " +"pouvoir tous les exportés." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14471,53 +14431,48 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Note : La clé de cryptage doit être stocké dans le binaire,\n" +"vous devez compiler les modèles d'exportation depuis les sources." #: editor/project_export.cpp -#, fuzzy msgid "More Info..." -msgstr "Déplacer vers…" +msgstr "Plus d'informations..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." msgstr "Exporter le PCK/ZIP" #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "Exporter le projet" +msgstr "Exporter le projet..." #: editor/project_export.cpp msgid "Export All" msgstr "Tout exporter" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "Veuillez choisir un dossier vide." +msgstr "Choisissez un mode d'exportation :" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "Tout exporter" +msgstr "Tout exporter..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" msgstr "Fichier ZIP" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Archive Godot" +msgstr "Pack de Projet Godot" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "Modèles d'exportation manquants pour cette plateforme :" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "Fondateurs du projet" +msgstr "Exportation du projet" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14835,7 +14790,6 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp -#, fuzzy msgctxt "Application" msgid "Project Manager" msgstr "Gestionnaire de projets" @@ -15644,17 +15598,15 @@ msgstr "Rendre local" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Another node already uses this unique name in the scene." -msgstr "" +msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Enable Scene Unique Name" -msgstr "Nom unique" +msgstr "Activer le nom unique de la scène" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy msgid "Disable Scene Unique Name" -msgstr "Nom unique" +msgstr "Désactiver le nom unique de la scène" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15833,7 +15785,7 @@ msgstr "Effacer l'héritage ? (Pas de retour en arrière !)" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "Centrer sur la sélection" +msgstr "Afficher la sélection de la racine de l'arborescence" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" @@ -15870,6 +15822,9 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Ce NÅ“ud est accessible de n'importe où dans la scène en le préfixant de '%s' " +"dans un chemin de NÅ“ud.\n" +"Cliquer pour désactiver cela." #: editor/scene_tree_editor.cpp msgid "" @@ -16156,9 +16111,8 @@ msgid "Stack Frames" msgstr "Pile des appels" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "Filtrer les tuiles" +msgstr "Filtrer les variables de la pile" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" @@ -16166,7 +16120,7 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Intervalle de rafraîchissement de l'arborescence distante" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" @@ -16268,8 +16222,9 @@ msgid "Change Light Radius" msgstr "Changer le rayon d'une lumière" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Stream Player 3D" -msgstr "" +msgstr "Émetteur de flux sonore 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -16279,7 +16234,7 @@ msgstr "Changer l'angle d'émission AudioStreamPlayer3D" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Caméra" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16291,7 +16246,7 @@ msgstr "Changer la taille d'une caméra" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "Notifiant de visibilité" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16302,18 +16257,16 @@ msgid "Change Particles AABB" msgstr "Changer particules AABB" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "Sélectionnez une propriété" +msgstr "Sonde de Réflexion" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "Changer les ampleurs de la sonde" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "Créer sonde IG (Illumination Globale)" +msgstr "Sonde GI" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -16349,14 +16302,12 @@ msgid "Change Ray Shape Length" msgstr "Changer la longueur d'une forme en rayon" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge" -msgstr "Mode Navigation" +msgstr "Bord de la Navigation" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "Mode Navigation" +msgstr "Bord de la Navigation Désactivé" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -16378,7 +16329,7 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "Bord de la pièce" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" @@ -16389,13 +16340,12 @@ msgid "Set Room Point Position" msgstr "Définir la position du point de la pièce" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "Définir la marge" +msgstr "Marge du portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "Bords du portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" @@ -16407,18 +16357,16 @@ msgstr "Définir la position du point du Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "Avant du Portail" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "Retourner" +msgstr "Arrière du Portail" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "Mode Occlusion" +msgstr "Occulteur" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16469,39 +16417,36 @@ msgid "BVH Collision Margin" msgstr "Mode collision" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "Définir la poignée" +msgstr "Gestionnaire de Crash" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "Ensemble multi-nÅ“ud" +msgstr "Serveur à tâches parallèles" #: main/main.cpp msgid "RID Pool Prealloc" msgstr "" #: main/main.cpp -#, fuzzy msgid "Debugger stdout" -msgstr "Débogueur" +msgstr "Sortie standard du débogueur" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "Maximum de Caractères par seconde" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Maximum de messages par image" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Maximum d'erreurs par seconde" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Maximum d'avertissements par secondes" #: main/main.cpp msgid "Flush stdout On Print" @@ -16509,38 +16454,35 @@ msgstr "" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "Journalisation" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "Journalisation dans un fichier" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "Activer le filtrage" +msgstr "Activer la journalisation dans un fichier" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "Copier le chemin" +msgstr "Chemin du Journal" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Maximum de fichiers journaux" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Pilote" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "Nom du script :" +msgstr "Nom du Pilote" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "Se replier sur GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" @@ -16555,45 +16497,40 @@ msgid "Allow hiDPI" msgstr "" #: main/main.cpp -#, fuzzy msgid "V-Sync" -msgstr "Synchroniser" +msgstr "Synchronisation Vertical" #: main/main.cpp -#, fuzzy msgid "Use V-Sync" -msgstr "Utiliser l’aimantation" +msgstr "Utiliser la Synchronisation Vertical" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "Transparence par pixel" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "Autorisé" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Usage prévu" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "Encadrer la sélection" +msgstr "Allocation du tampon d'image (Framebuffer)" #: main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Energy Saving" -msgstr "Erreur d'enregistrement" +msgstr "Économie d'Énergie" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "Tâches Parallèles" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "Basculer le mode" +msgstr "Modèle de Parallélisme" #: main/main.cpp msgid "Thread Safe BVH" @@ -16605,25 +16542,21 @@ msgstr "" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Orientation" -msgstr "Documentation en ligne" +msgstr "Orientation" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp -#, fuzzy msgid "Common" -msgstr "Communauté" +msgstr "Commun" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "Image physique %" +msgstr "TPS de la physique" #: main/main.cpp -#, fuzzy msgid "Force FPS" -msgstr "Force-pousser" +msgstr "Forces les trames par seconde" #: main/main.cpp msgid "Enable Pause Aware Picking" @@ -16641,7 +16574,7 @@ msgstr "" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "Sortie Standard" #: main/main.cpp msgid "Print FPS" @@ -16649,26 +16582,23 @@ msgstr "" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "Détailler La Sortie Standard" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "Mode d’interpolation" +msgstr "Interpolation de la physique" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "Activer le filtrage" +msgstr "Activer les avertissements" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "Encadrer la sélection" +msgstr "Délai des trames en millisecondes" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "Mode Processeur Faible" #: main/main.cpp msgid "Delta Sync After Draw" @@ -16676,21 +16606,19 @@ msgstr "" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "Masquer l'indicateur d’accueil" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "Tous les périphérique" +msgstr "Périphériques d'entrée" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "Point" +msgstr "Pointage" #: main/main.cpp msgid "Touch Delay" @@ -16698,12 +16626,11 @@ msgstr "" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Shaders" -msgstr "Ombrage" +msgstr "Shaders" #: main/main.cpp #, fuzzy @@ -16713,49 +16640,44 @@ msgstr "Forcer les replis du shader" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp #: scene/resources/world.cpp -#, fuzzy msgid "Environment" -msgstr "Voir environnement" +msgstr "Environnement" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "Couleur d'effacement par défaut" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "Écran de démarrage" #: main/main.cpp -#, fuzzy msgid "Show Image" -msgstr "Afficher les os" +msgstr "Afficher l'image" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "Image" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Pleine taille" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "Filtre :" +msgstr "Utiliser le filtrage" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "Couleurs" +msgstr "Couleur d'arrière-plan" #: main/main.cpp -#, fuzzy msgid "macOS Native Icon" -msgstr "Définir l'icône de la tuile" +msgstr "Icône native de macOS" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Icône native de Windows" #: main/main.cpp msgid "Buffering" @@ -16767,30 +16689,27 @@ msgstr "" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "Émuler le toucher tactile avec la souris" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "Émuler la souris avec le toucher tactile" #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "Bouton de souris" +msgstr "Curseur de la souris" #: main/main.cpp -#, fuzzy msgid "Custom Image" -msgstr "NÅ“ud Personnalisé" +msgstr "Image personnalisée" #: main/main.cpp msgid "Custom Image Hotspot" msgstr "" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "Décalage de la rotation :" +msgstr "Décalage de la position des info-bulles" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16798,9 +16717,8 @@ msgid "Debugger Agent" msgstr "Débogueur" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait For Debugger" -msgstr "Débogueur" +msgstr "Attendre le débogueur" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait Timeout" @@ -16815,28 +16733,25 @@ msgid "Unhandled Exception Policy" msgstr "" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "Rechercher le type de nÅ“ud" +msgstr "Type de boucle principale" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp -#, fuzzy msgid "Stretch" -msgstr "Actualiser" +msgstr "Étirement" #: main/main.cpp -#, fuzzy msgid "Aspect" -msgstr "Inspecteur" +msgstr "Aspect" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "Rétrécissement" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "Accepter automatiquement la fermeture" #: main/main.cpp scene/main/scene_tree.cpp #, fuzzy @@ -16850,7 +16765,7 @@ msgstr "Aimanter aux flancs du nÅ“ud" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "Polices Dynamiques" #: main/main.cpp msgid "Use Oversampling" @@ -16887,7 +16802,7 @@ msgstr "Options" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "Calculer les Tangentes" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16993,9 +16908,8 @@ msgid "Path Simplify Angle" msgstr "" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "Rotation aléatoire :" +msgstr "Rotation du chemin" #: modules/csg/csg_shape.cpp #, fuzzy @@ -17018,24 +16932,20 @@ msgid "Path Joined" msgstr "Rotation aléatoire :" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Compression Mode" -msgstr "Mode collision" +msgstr "Mode de compression" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Transfer Channel" -msgstr "Modification de la transformation" +msgstr "Canal de transfert" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Channel Count" -msgstr "Instance" +msgstr "Nombre de canaux" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Always Ordered" -msgstr "Toujours afficher la grille" +msgstr "Toujours ordonnée" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" @@ -17043,24 +16953,23 @@ msgstr "" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "Vérification DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "Nom de l'hôte DTLS" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Use DTLS" -msgstr "Utiliser l’aimantation" +msgstr "Utiliser DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "Utiliser FBX" #: modules/gdnative/gdnative.cpp msgid "Config File" @@ -17073,19 +16982,16 @@ msgstr "Charger une ressource" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "Squelette" +msgstr "Singleton" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Symbol Prefix" -msgstr "Préfixe :" +msgstr "Préfixe du symbole" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "Recharger" +msgstr "Rechargeable" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -17146,14 +17052,12 @@ msgid "Class Name" msgstr "Nom de la Classe" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "Nom du script :" +msgstr "Classe de Script" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "Focaliser le chemin" +msgstr "Chemin de l'icône" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -17161,34 +17065,32 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "Script" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" -msgstr "" +msgstr "Couleur de définition de fonction" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "Copier le chemin du nÅ“ud" +msgstr "Couleur des chemins de nÅ“ud" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "Maximum de la pile d'appel" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "Traiter les avertissements comme des erreurs" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "Exclure les extensions" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "Auto-compléter les setters et les getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -17235,17 +17137,16 @@ msgid "Language Server" msgstr "Serveur de Langues" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "Impossible à résoudre" +msgstr "Activer la résolution intelligente" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "Afficher les symboles natifs dans l'éditeur" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "Utiliser le parallélisme" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -17256,37 +17157,32 @@ msgid "Export GLTF..." msgstr "Exporter en GLTF..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "Vue de derrière" +msgstr "Vue du tampon" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" msgstr "Décalage d’Octet" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "Composants" +msgstr "Type de composant" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "Format" +msgstr "Normalisé" #: modules/gltf/gltf_accessor.cpp msgid "Count" msgstr "Compte" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "Mio" +msgstr "Min" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "Mixer" +msgstr "Max" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17315,14 +17211,12 @@ msgid "Sparse Values Byte Offset" msgstr "" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "Vue de derrière" +msgstr "Tampon" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "Thème par défaut" +msgstr "Longueur de byte" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" @@ -17354,19 +17248,17 @@ msgstr "Linéaire" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Color" -msgstr "Couleurs" +msgstr "Couleur" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "Intensité" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Range" -msgstr "Changer" +msgstr "Plage" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" @@ -17387,9 +17279,8 @@ msgid "Instance Materials" msgstr "Changements de matériau :" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Parent" -msgstr "Re-parenter" +msgstr "Parent" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17416,12 +17307,13 @@ msgid "Joints" msgstr "Point" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Roots" -msgstr "" +msgstr "Racines" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "Noms Uniques" #: modules/gltf/gltf_skeleton.cpp #, fuzzy @@ -17460,16 +17352,18 @@ msgid "Godot Skin" msgstr "" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Img" -msgstr "" +msgstr "Image Diffuse" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Factor" -msgstr "" +msgstr "Facteur de diffusion" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Facteur de brillance" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17528,11 +17422,11 @@ msgstr "Fonctionnalités" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "Images" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "Caméras" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp #, fuzzy @@ -17579,7 +17473,7 @@ msgstr "Précalculer les lightmaps" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "Cellule" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -17605,7 +17499,7 @@ msgstr "Centre" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "Masque" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17784,19 +17678,19 @@ msgstr "Précalculer les lightmaps" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "Nombre de rayons de basse qualité" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "Nombre de rayons de qualité moyenne" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "Nombre de rayons de haute qualité" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "Nombre de rayons de qualité extrême" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17806,17 +17700,17 @@ msgid "Loop Offset" msgstr "Décalage de Boucle" #: modules/mobile_vr/mobile_vr_interface.cpp +#, fuzzy msgid "Eye Height" -msgstr "" +msgstr "Hauteur de l’œil" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" msgstr "" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display Width" -msgstr "Affichage en fil de fer" +msgstr "Afficher la largeur" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17844,9 +17738,8 @@ msgid "Build Solution" msgstr "Compiler la solution" #: modules/mono/editor/csharp_project.cpp -#, fuzzy msgid "Auto Update Project" -msgstr "Projet sans titre" +msgstr "Mettre à jour le projet automatiquement" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -17924,17 +17817,17 @@ msgid "Seamless" msgstr "" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "As Normal Map" -msgstr "Échelle aléatoire :" +msgstr "En tant que carte de normales" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Bump Strength" -msgstr "" +msgstr "Force du bossage" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "Bruit" #: modules/opensimplex/noise_texture.cpp #, fuzzy @@ -17942,12 +17835,13 @@ msgid "Noise Offset" msgstr "Décalage de la grille :" #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Octaves" -msgstr "" +msgstr "Octaves" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "Période" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17959,8 +17853,9 @@ msgid "Lacunarity" msgstr "" #: modules/regex/regex.cpp +#, fuzzy msgid "Subject" -msgstr "" +msgstr "Sujet" #: modules/regex/regex.cpp #, fuzzy @@ -17982,7 +17877,7 @@ msgstr "" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Découvrir IPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -18682,7 +18577,7 @@ msgstr "Sous-appel" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "Titre" #: modules/visual_script/visual_script_nodes.cpp msgid "Construct %s" @@ -18752,19 +18647,20 @@ msgstr "Mode prioritaire" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h +#, fuzzy msgid "Max Channel In Buffer (KB)" -msgstr "" +msgstr "Maximum de canal dans le tampon (Ko)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "Vérifier la SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "Certificat SSL Fiable" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18777,8 +18673,9 @@ msgid "Max In Buffer (KB)" msgstr "Taille Maximale (KB)" #: modules/websocket/websocket_macros.h +#, fuzzy msgid "Max In Packets" -msgstr "" +msgstr "Maximum par paquet" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18805,7 +18702,7 @@ msgstr "Chemin de la clé privée SSH" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "Certificat SSL" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18855,7 +18752,7 @@ msgstr "Magnétisme intelligent" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Chemin du SDK Android" #: platform/android/export/export.cpp #, fuzzy @@ -18879,20 +18776,21 @@ msgid "Shutdown ADB On Exit" msgstr "" #: platform/android/export/export_plugin.cpp +#, fuzzy msgid "Launcher Icons" -msgstr "" +msgstr "Icônes du lanceur" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principal 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Avant-Plan Adaptatif 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Arrière-Plan Adaptatif 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18924,18 +18822,16 @@ msgid "The package must have at least one '.' separator." msgstr "Le paquet doit comporter au moins un séparateur « . »." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "NÅ“ud Personnalisé" +msgstr "Construction personnalisé" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" -msgstr "" +msgstr "Utiliser une construction personnalisé" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Export Format" -msgstr "Chemin d'exportation" +msgstr "Format d'exportation" #: platform/android/export/export_plugin.cpp msgid "Min SDK" @@ -18943,12 +18839,11 @@ msgstr "Min SDK" #: platform/android/export/export_plugin.cpp msgid "Target SDK" -msgstr "Target SDK" +msgstr "SDK Cible" #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp -#, fuzzy msgid "Architectures" -msgstr "Ajouter une entrée architecture" +msgstr "Architectures" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18976,17 +18871,17 @@ msgid "Release Password" msgstr "Mot de passe" #: platform/android/export/export_plugin.cpp +#, fuzzy msgid "One Click Deploy" -msgstr "" +msgstr "Déploiement en un clic" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Clear Previous Install" -msgstr "Inspecter l'instance précédente" +msgstr "Nettoyer l'installation précédente" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "Code" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy @@ -19008,7 +18903,7 @@ msgstr "Classer En Tant Que Jeu" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Conserver les données lors de la désinstallation" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19016,14 +18911,12 @@ msgid "Exclude From Recents" msgstr "Supprimer des nÅ“uds" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "Décalage de la grille :" +msgstr "Graphismes" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "OpenGL Debug" -msgstr "Ouvrir" +msgstr "Débogage OpenGL" #: platform/android/export/export_plugin.cpp msgid "XR Features" @@ -19047,9 +18940,8 @@ msgid "Passthrough" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Immersive Mode" -msgstr "Mode prioritaire" +msgstr "Mode immersif" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19078,12 +18970,11 @@ msgstr "Interface utilisateur" #: platform/android/export/export_plugin.cpp msgid "Allow" -msgstr "" +msgstr "Autoriser" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Communauté" +msgstr "Ligne de commande" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Extra Args" @@ -19096,22 +18987,19 @@ msgstr "Expression" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "Sel" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "Chemin de la clé publique SSH" +msgstr "Clé Publique" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "Masque d'émission" +msgstr "Permissions" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Permissions" -msgstr "Jouer une scène personnalisée" +msgstr "Permissions Personnalisées" #: platform/android/export/export_plugin.cpp msgid "Select device from the list" @@ -19231,6 +19119,11 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"Le module \"GodotPaymentV3\" inclus dans les paramètres du projet à " +"\"android/modules\" est invalide (Changé dans Godot 3.2.2).\n" +"Remplacez-le avec le plugin tiers \"GodotGooglePlayBilling\".\n" +"Notez que ce singleton a aussi été renommé de \"GodotPayments\" en " +"\"GodotGooglePlayBilling\"." #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -19265,12 +19158,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" devrait être un nombre entier valide, mais \"%s\" n'est pas " +"valide." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"« Min SDK » ne peut être inférieur à %d, la version requise par la libraire " +"de Godot." #: platform/android/export/export_plugin.cpp msgid "" @@ -19283,12 +19180,16 @@ msgstr "" msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"« SDK Cible » devrait être un nombre entier valide, mais « %s » n'en est pas " +"un." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"« SDK Cible » %d est plus grande que la version par défaut %d. Cela pourrait " +"fonctionner, mais ça n'a pas été testé. Le résultat pourrait être instable." #: platform/android/export/export_plugin.cpp msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." @@ -19492,19 +19393,19 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" -msgstr "" +msgstr "iPhone 2436 X 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "" +msgstr "iPhone 2208 X 1242" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "" +msgstr "iPad 1024 X 768" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "" +msgstr "iPad 2048 X 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" @@ -19512,31 +19413,31 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "" +msgstr "iPhone 640 X 960" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "" +msgstr "iPhone 640 X 1136" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "" +msgstr "iPhone 750 X 1334" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "" +msgstr "iPhone 1125 X 2436" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "" +msgstr "iPad 768 X 1024" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "" +msgstr "iPad 1536 X 2048" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "" +msgstr "iPhone 1242 X 2208" #: platform/iphone/export/export.cpp msgid "App Store Team ID" @@ -19569,37 +19470,34 @@ msgid "Export Method Release" msgstr "Mode d'exportation :" #: platform/iphone/export/export.cpp +#, fuzzy msgid "Targeted Device Family" -msgstr "" +msgstr "Famille de système cible" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "Info" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier" msgstr "Identifiant" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Signaux" +msgstr "Signature" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Short Version" -msgstr "Version" +msgstr "Version courte" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "En haut à droite" +msgstr "Copyright" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Coller les propriétés" +msgstr "Capacités" #: platform/iphone/export/export.cpp msgid "Access Wi-Fi" @@ -19611,9 +19509,8 @@ msgid "Push Notifications" msgstr "Rotation aléatoire :" #: platform/iphone/export/export.cpp -#, fuzzy msgid "User Data" -msgstr "Interface utilisateur" +msgstr "Données Utilisateur" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" @@ -19624,9 +19521,8 @@ msgid "Accessible From iTunes Sharing" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Chemin de la clé privée SSH" +msgstr "Confidentialité" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19644,20 +19540,21 @@ msgid "Photolibrary Usage Description" msgstr "Description des propriétés" #: platform/iphone/export/export.cpp +#, fuzzy msgid "iPhone 120 X 120" -msgstr "" +msgstr "iPhone 120 X 120" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "" +msgstr "iPhone 180 X 180" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "" +msgstr "iPad 76 X 76" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "" +msgstr "iPad 152 X 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" @@ -19699,25 +19596,21 @@ msgid "Custom Image @3x" msgstr "NÅ“ud Personnalisé" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "NÅ“ud Personnalisé" +msgstr "Utiliser la couleur d'arrière-plan personnalisée" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "NÅ“ud Personnalisé" +msgstr "Couleur d'arrière-plan personnalisée" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Gérer les modèles" +msgstr "Préparer les modèles" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Modèle de version personnalisée introuvable." +msgstr "Modèle d'exportation introuvable." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19740,29 +19633,24 @@ msgid "Run exported HTML in the system's default browser." msgstr "Exécutez le HTML exporté dans le navigateur par défaut du système." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Impossible d'ouvrir le modèle pour exportation :" +msgstr "Impossible d'ouvrir le modèle pour exportation : « %s »." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Modèle d'exportation non valide :" +msgstr "Modèle d'exportation invalide : « %s »." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Impossible d'écrire le fichier :" +msgstr "Impossible d'écrire le fichier : « %s »." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Définir la marge" +msgstr "Création de l'icône" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Impossible de lire le fichier :" +msgstr "Impossible de lire le fichier : «%s »." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19773,36 +19661,32 @@ msgid "Variant" msgstr "Variant" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Type" -msgstr "Exporter" +msgstr "Type d'exportation" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "Expression" +msgstr "Compression des textures dans la mémoire vidéo" #: platform/javascript/export/export.cpp msgid "For Desktop" -msgstr "" +msgstr "Pour PC" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "Pour Mobile" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Développer tout" +msgstr "Icône d'exportation" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Custom HTML Shell" -msgstr "NÅ“ud Personnalisé" +msgstr "Shell HTML personnalisé" #: platform/javascript/export/export.cpp msgid "Head Include" @@ -19817,65 +19701,60 @@ msgid "Focus Canvas On Start" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Filtrer les signaux" +msgstr "Clavier virtuel expérimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "" +msgstr "Application web progressive" #: platform/javascript/export/export.cpp msgid "Offline Page" -msgstr "" +msgstr "Page hors ligne" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Icône 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Icône 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Icône 512 X 512" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Impossible de lire le shell HTML :" +msgstr "Impossible de lire le shell HTML : « %s »." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Impossible de créer le répertoire du serveur HTTP :" +msgstr "Impossible de créer le répertoire du serveur HTTP : %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Erreur de démarrage du serveur HTTP :" +msgstr "Erreur de démarrage du serveur HTTP : %d." #: platform/javascript/export/export.cpp msgid "Web" -msgstr "" +msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "Hôte HTTP" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Port HTTP" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Use SSL" -msgstr "Utiliser l’aimantation" +msgstr "Utiliser SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" -msgstr "" +msgstr "Clé SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." @@ -19903,7 +19782,7 @@ msgstr "Échec de création du sous-dossier « %s »." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." -msgstr "" +msgstr "Échec lors de l'extraction du binaire." #: platform/osx/export/codesign.cpp msgid "Invalid binary format." @@ -19920,7 +19799,7 @@ msgstr "Impossible de charger la ressource." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." -msgstr "" +msgstr "Échec lors de la création du sous-dossier _CodeSignature." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19937,29 +19816,30 @@ msgid "Invalid executable file." msgstr "Fichier exécutable invalide." #: platform/osx/export/codesign.cpp +#, fuzzy msgid "Can't resize signature load command." -msgstr "" +msgstr "Impossible de redimensionner la commande de chargement des signatures." #: platform/osx/export/codesign.cpp msgid "Failed to create fat binary." -msgstr "" +msgstr "Échec lors de la création du binaire." #: platform/osx/export/codesign.cpp msgid "Unknown bundle type." -msgstr "" +msgstr "Type de paquet inconnu." #: platform/osx/export/codesign.cpp msgid "Unknown object type." msgstr "Type d'objet inconnu." #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "Catégorie :" +msgstr "Catégorie de l'application" #: platform/osx/export/export.cpp +#, fuzzy msgid "High Res" -msgstr "" +msgstr "Haute Résolution" #: platform/osx/export/export.cpp #, fuzzy @@ -20039,7 +19919,7 @@ msgstr "NÅ“ud Personnalisé" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" -msgstr "" +msgstr "Autoriser l'exécution du code JIT" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" @@ -20050,27 +19930,24 @@ msgid "Allow Dyld Environment Variables" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Bouton désactivé" +msgstr "Désactiver la validation des librairies" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Ajouter une entrée" +msgstr "Entrée Audio" #: platform/osx/export/export.cpp msgid "Address Book" -msgstr "" +msgstr "Carnet d'Adresses" #: platform/osx/export/export.cpp msgid "Calendars" -msgstr "" +msgstr "Calendrier" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "Bibliothèque d'exportation" +msgstr "Bibliothèque de photos" #: platform/osx/export/export.cpp #, fuzzy @@ -20083,8 +19960,9 @@ msgid "Debugging" msgstr "Débogage" #: platform/osx/export/export.cpp +#, fuzzy msgid "App Sandbox" -msgstr "" +msgstr "Bac à sable de l'application" #: platform/osx/export/export.cpp #, fuzzy @@ -20172,18 +20050,24 @@ msgid "" "The notarization process generally takes less than an hour. When the process " "is completed, you'll receive an email." msgstr "" +"Le processus de certification prend généralement moins d'une heure. Quand le " +"processus sera achevé, vous recevrez un e-mail." #: platform/osx/export/export.cpp msgid "" "You can check progress manually by opening a Terminal and running the " "following command:" msgstr "" +"Vous pouvez contrôler la progression manuellement en ouvrant un Terminal et " +"en exécutant la commande suivante :" #: platform/osx/export/export.cpp msgid "" "Run the following command to staple the notarization ticket to the exported " "application (optional):" msgstr "" +"Exécutez la commande suivante pour lier le ticket de certification avec " +"l'application exporté (optionnel) :" #: platform/osx/export/export.cpp msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" @@ -20207,6 +20091,8 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"Ne peut lancer l'exécutable codesign, vérifiez que les outils en ligne de " +"commande de Xcode sont installés." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." @@ -20220,6 +20106,8 @@ msgstr "Erreur lors de l'enregistrement du fichier : %s" #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" +"Les liens symboliques relatifs ne sont pas supportés, « %s » pourrait être " +"cassé !" #: platform/osx/export/export.cpp #, fuzzy @@ -20232,12 +20120,13 @@ msgid "Could not start hdiutil executable." msgstr "Impossible de démarrer le sous-processus !" #: platform/osx/export/export.cpp +#, fuzzy msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` a échoué - le fichier existe." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` a échoué." #: platform/osx/export/export.cpp #, fuzzy @@ -20259,12 +20148,16 @@ msgid "" "Relative symlinks are not supported on this OS, the exported project might " "be broken!" msgstr "" +"Les liens symboliques relatifs ne sont pas supportés sur ce système " +"d'exploitation, le projet exporté pourrait être cassé !" #: platform/osx/export/export.cpp msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." msgstr "" +"Le binaire modèle requis « %s » n'a pas été trouvé. Il doit être absent de " +"votre archive de modèles." #: platform/osx/export/export.cpp msgid "Making PKG" @@ -20297,10 +20190,12 @@ msgid "" "Notarization requires the app to be archived first, select the DMG or ZIP " "export format instead." msgstr "" +"La certification nécessite que l'application soit préalablement archivé. " +"Sélectionnez le format d'exportation DMG ou ZIP à la place." #: platform/osx/export/export.cpp msgid "Sending archive for notarization" -msgstr "" +msgstr "Envoi de l'archive pour la certification" #: platform/osx/export/export.cpp #, fuzzy @@ -20321,16 +20216,23 @@ msgid "" "Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " "signing is limited to ad-hoc signature only." msgstr "" +"Attention : Le « codesign » embarqué est sélectionné dans les paramètres de " +"l'éditeur. La signature du code se limite à la signature ad-hoc seulement." #: platform/osx/export/export.cpp msgid "" "Warning: Xcode command line tools are not installed, using built-in " "\"codesign\". Code signing is limited to ad-hoc signature only." msgstr "" +"Attention : Les outils en ligne de commande de Xcode ne sont pas installés, " +"utilisation du « codesign » embarqué. La signature du code se limite à la " +"signature ad-hoc seulement." #: platform/osx/export/export.cpp msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" +"Certification : La certification avec une signature ad-hoc n'est pas " +"supporté." #: platform/osx/export/export.cpp #, fuzzy @@ -20360,12 +20262,17 @@ msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Attention : La certification est désactivé. Le projet exporté sera bloqué " +"par Gatekeeper si il est téléchargé depuis une source inconnue." #: platform/osx/export/export.cpp msgid "" "Code signing is disabled. The exported project will not run on Macs with " "enabled Gatekeeper and Apple Silicon powered Macs." msgstr "" +"La signature du code est désactivé. Le projet exporté ne fonctionnera pas " +"sur les Macs avec Gatekeeper activé et sous les Macs fonctionnant sous Apple " +"Silicon." #: platform/osx/export/export.cpp msgid "" @@ -20383,6 +20290,9 @@ msgid "" "Warning: Notarization is not supported from this OS. The exported project " "will be blocked by Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Attention : La certification n'est pas compatible avec ce système " +"d'exploitation. Le projet exporté sera bloqué par Gatekeeper si il est " +"téléchargé depuis une source inconnue." #: platform/osx/export/export.cpp msgid "" @@ -20432,7 +20342,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "macOS" -msgstr "" +msgstr "macOS" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" @@ -20487,11 +20397,11 @@ msgstr "Débogueur" #: platform/uwp/export/export.cpp msgid "Major" -msgstr "" +msgstr "Majeur" #: platform/uwp/export/export.cpp msgid "Minor" -msgstr "" +msgstr "Mineur" #: platform/uwp/export/export.cpp #, fuzzy @@ -20505,7 +20415,7 @@ msgstr "Expression" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "Paysage" #: platform/uwp/export/export.cpp #, fuzzy @@ -20514,11 +20424,11 @@ msgstr "Retourner les Portals" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" -msgstr "" +msgstr "Paysage Inversé" #: platform/uwp/export/export.cpp msgid "Portrait Flipped" -msgstr "" +msgstr "Portrait Inversé" #: platform/uwp/export/export.cpp #, fuzzy @@ -20527,23 +20437,23 @@ msgstr "Mode mise à l'échelle" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Logo 44 X 44 Carré" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Logo 71 X 71 Carré" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Logo 150 X 150 Carré" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Logo 310 X 310 Carré" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" -msgstr "" +msgstr "Logo 310 X 150 Large" #: platform/uwp/export/export.cpp #, fuzzy @@ -20557,15 +20467,15 @@ msgstr "Fichier" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" -msgstr "" +msgstr "Afficher le nom sur le carré 150 X 150" #: platform/uwp/export/export.cpp msgid "Show Name On Wide 310 X 150" -msgstr "" +msgstr "Afficher le nom sur le large 310 X 150" #: platform/uwp/export/export.cpp msgid "Show Name On Square 310 X 310" -msgstr "" +msgstr "Afficher le nom sur le carré 310 X 310" #: platform/uwp/export/export.cpp msgid "Invalid package short name." @@ -20634,7 +20544,7 @@ msgstr "" #: platform/uwp/export/export.cpp msgid "UWP" -msgstr "" +msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp #, fuzzy @@ -20643,7 +20553,7 @@ msgstr "Signaux" #: platform/uwp/export/export.cpp msgid "Debug Certificate" -msgstr "" +msgstr "Certificat de Débogage" #: platform/uwp/export/export.cpp #, fuzzy @@ -20656,8 +20566,9 @@ msgid "Failed to rename temporary file \"%s\"." msgstr "Impossible de supprimer le fichier temporaire :" #: platform/windows/export/export.cpp +#, fuzzy msgid "Identity Type" -msgstr "" +msgstr "Type d'identité" #: platform/windows/export/export.cpp msgid "Timestamp Server URL" @@ -20697,7 +20608,7 @@ msgstr "Description" #: platform/windows/export/export.cpp msgid "Trademarks" -msgstr "" +msgstr "Marques Déposées" #: platform/windows/export/export.cpp #, fuzzy @@ -20729,6 +20640,8 @@ msgid "" "rcedit failed to modify executable:\n" "%s" msgstr "" +"rcedit n'a pas réussi à modifier l'exécutable :\n" +"%s" #: platform/windows/export/export.cpp #, fuzzy @@ -21582,12 +21495,12 @@ msgstr "Bouton désactivé" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" -msgstr "" +msgstr "Douceur" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Length" -msgstr "" +msgstr "Longueur" #: scene/2d/joints_2d.cpp #, fuzzy @@ -21600,7 +21513,7 @@ msgstr "" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp msgid "Stiffness" -msgstr "" +msgstr "Rigidité" #: scene/2d/light_2d.cpp msgid "" @@ -21624,15 +21537,15 @@ msgstr "RegionDeTexture" #: scene/3d/light.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/sky.cpp msgid "Energy" -msgstr "" +msgstr "Énergie" #: scene/2d/light_2d.cpp msgid "Z Min" -msgstr "" +msgstr "Minimum Z" #: scene/2d/light_2d.cpp msgid "Z Max" -msgstr "" +msgstr "Maximum Z" #: scene/2d/light_2d.cpp #, fuzzy @@ -21703,7 +21616,7 @@ msgstr "Défaut" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" -msgstr "" +msgstr "Remplissage" #: scene/2d/line_2d.cpp scene/resources/texture.cpp #, fuzzy @@ -21716,8 +21629,9 @@ msgid "Texture Mode" msgstr "RegionDeTexture" #: scene/2d/line_2d.cpp +#, fuzzy msgid "Capping" -msgstr "" +msgstr "Recouvrement" #: scene/2d/line_2d.cpp #, fuzzy @@ -21745,7 +21659,7 @@ msgstr "" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "Précision de l’arrondissement" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21762,7 +21676,7 @@ msgstr "Multiplier %s" #: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp #: scene/resources/world_2d.cpp servers/physics_2d/physics_2d_server_sw.cpp msgid "Cell Size" -msgstr "" +msgstr "Taille des Cellules" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp #, fuzzy @@ -21775,6 +21689,9 @@ msgid "" "will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " "instead." msgstr "" +"Le nÅ“ud « Navigation2D » et « Navigation2D.get_simple_path() » sont " +"obsolètes et seront supprimés dans une future version. Utilisez « " +"Navigation2DServer.map_get_path() » à la place." #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21788,7 +21705,7 @@ msgstr "Choisissez distance :" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" -msgstr "" +msgstr "Distance Désirée de la Cible" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21807,11 +21724,11 @@ msgstr "Activer" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Neighbor Dist" -msgstr "" +msgstr "Distance des voisins" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Max Neighbors" -msgstr "" +msgstr "Maximum de voisins" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21819,9 +21736,8 @@ msgid "Time Horizon" msgstr "Retourner horizontalement" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "Vitesse :" +msgstr "Vitesse Max" #: scene/2d/navigation_agent_2d.cpp #, fuzzy @@ -21830,9 +21746,8 @@ msgid "" msgstr "Le NavigationAgent2D ne peut être utilisé que sous un nÅ“ud Node2D." #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp -#, fuzzy msgid "Estimate Radius" -msgstr "Changer le rayon extérieur de la tour" +msgstr "Estimer le rayon" #: scene/2d/navigation_obstacle_2d.cpp msgid "" @@ -21870,57 +21785,50 @@ msgstr "Se déplacer" msgid "Rotation Degrees" msgstr "Degrés de Rotation" -#: scene/2d/node_2d.cpp -#, fuzzy +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" -msgstr "Constante globale" +msgstr "Rotation Globale" #: scene/2d/node_2d.cpp msgid "Global Rotation Degrees" msgstr "Degrés de Rotation Globale" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "Échelle aléatoire :" +msgstr "Échelle Globale" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Global Transform" -msgstr "Conserver la transformation globale" +msgstr "Transformation Globale" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Z As Relative" -msgstr "Alignement relatif" +msgstr "Z En tant que relatif" #: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Scroll" -msgstr "" +msgstr "Défilement" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Offset" -msgstr "Décalage :" +msgstr "Décalage de Base" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Scale" -msgstr "Utiliser le magnétisme d'échelle" +msgstr "Échelle de Base" #: scene/2d/parallax_background.cpp msgid "Limit Begin" -msgstr "" +msgstr "Début de la limite" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Limit End" -msgstr "À la fin" +msgstr "Fin de la limite" #: scene/2d/parallax_background.cpp msgid "Ignore Camera Zoom" -msgstr "" +msgstr "Ignorer le zoom de la Caméra" #: scene/2d/parallax_layer.cpp msgid "" @@ -21932,9 +21840,8 @@ msgstr "" #: scene/2d/parallax_layer.cpp scene/2d/physics_body_2d.cpp #: scene/3d/physics_body.cpp scene/3d/vehicle_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Motion" -msgstr "Action" +msgstr "Déplacement" #: scene/2d/parallax_layer.cpp #, fuzzy @@ -21983,19 +21890,17 @@ msgstr "" "Animation » activé." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "Visibility Rect" -msgstr "Mode prioritaire" +msgstr "Zone de Visibilité" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "Process Material" -msgstr "" +msgstr "Matériau" #: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Curve" -msgstr "Scinder la courbe" +msgstr "Courbe" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -22009,58 +21914,51 @@ msgid "Unit Offset" msgstr "Décalage de la grille :" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "H Offset" -msgstr "Décalage :" +msgstr "Décalage Horizontal" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "V Offset" -msgstr "Décalage :" +msgstr "Décalage Vertical" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" -msgstr "" +msgstr "Interpolation Cubique" #: scene/2d/path_2d.cpp msgid "Lookahead" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Layers" -msgstr "Calque" +msgstr "Calques" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Linear Velocity" -msgstr "Initialiser" +msgstr "Vélocité Linéaire Constante" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Angular Velocity" -msgstr "Initialiser" +msgstr "Vélocité Angulaire Constante" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp -#, fuzzy msgid "Friction" -msgstr "Fonction" +msgstr "Friction" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp msgid "Bounce" -msgstr "" +msgstr "Rebond" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Physics Material Override" -msgstr "" +msgstr "Surcharge du Matériau Des Physiques" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity" -msgstr "Aperçu par défaut" +msgstr "Gravité par Défaut" #: scene/2d/physics_body_2d.cpp msgid "" @@ -22074,21 +21972,19 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Mass" -msgstr "" +msgstr "Masse" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "Vertical :" +msgstr "Inertie" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Weight" -msgstr "Lumière" +msgstr "Poids" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" -msgstr "" +msgstr "Échelle de la Gravité" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22102,44 +21998,40 @@ msgstr "Continu" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Contacts Reported" -msgstr "" +msgstr "Contact Rapporté" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Contact Monitor" -msgstr "Prélever une couleur" +msgstr "Moniteur de Contact" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Sleeping" -msgstr "Magnétisme intelligent" +msgstr "Sommeil" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Can Sleep" -msgstr "Vitesse :" +msgstr "Peut Dormir" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" -msgstr "" +msgstr "Atténuation" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Angular" -msgstr "" +msgstr "Angulaire" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" -msgstr "" +msgstr "Forces Appliquées" #: scene/2d/physics_body_2d.cpp msgid "Torque" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Safe Margin" -msgstr "Définir la marge" +msgstr "Marge de sécurité" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Sync To Physics" @@ -22158,9 +22050,8 @@ msgstr "" #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp #: scene/resources/line_shape_2d.cpp scene/resources/material.cpp -#, fuzzy msgid "Normal" -msgstr "Format" +msgstr "Normale" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22168,61 +22059,53 @@ msgid "Remainder" msgstr "Moteur de rendu :" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Local Shape" -msgstr "Localisation" +msgstr "Forme Locale" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider" -msgstr "Mode collision" +msgstr "Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collider ID" -msgstr "" +msgstr "ID Du Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider RID" -msgstr "RID invalide" +msgstr "RID Du Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Shape" -msgstr "Mode collision" +msgstr "Forme Du Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Collider Shape Index" -msgstr "Mode collision" +msgstr "Index De La Forme Du Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Velocity" -msgstr "Vue de l'orbite vers la droite" +msgstr "Vélocité Du Collisionneur" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" -msgstr "" +msgstr "Méta-Données Du Collisionneur" #: scene/2d/polygon_2d.cpp msgid "Invert" -msgstr "" +msgstr "Inverser" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Vertex Colors" -msgstr "Vertex" +msgstr "Couleurs Des Sommets" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Internal Vertex Count" -msgstr "Créer un vertex interne" +msgstr "Nombre de Sommet Interne" #: scene/2d/position_2d.cpp #, fuzzy @@ -22231,7 +22114,7 @@ msgstr "Gadgets" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" -msgstr "" +msgstr "Exclure Le Parent" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -22240,7 +22123,7 @@ msgstr "Créer un nÅ“ud Shader" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" -msgstr "" +msgstr "Collisionne Avec" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" @@ -22248,7 +22131,7 @@ msgstr "" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" -msgstr "" +msgstr "Corps" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -22352,51 +22235,44 @@ msgid "Y Sort" msgstr "Trier" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Show Collision" -msgstr "Collision" +msgstr "Afficher la Collision" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Compatibility Mode" -msgstr "Mode prioritaire" +msgstr "Mode de Compatibilité" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Centered Textures" -msgstr "Fonctionnalités principales :" +msgstr "Textures Centrées" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" msgstr "" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Use Parent" -msgstr "Mode collision" +msgstr "Utiliser le Parent" #: scene/2d/tile_map.cpp msgid "Use Kinematic" -msgstr "" +msgstr "Utiliser Kinematic" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Shape Centered" -msgstr "Aimanter au centre du nÅ“ud" +msgstr "Forme Centrée" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Shape Visible" -msgstr "Rendre visible" +msgstr "Forme Visible" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" msgstr "" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Visibility Mode" -msgstr "Mode prioritaire" +msgstr "Mode de Visibilité" #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -22413,7 +22289,7 @@ msgstr "Coller l'animation" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "Geler les corps" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy @@ -22426,22 +22302,20 @@ msgid "Pause Animated Sprites" msgstr "Coller l'animation" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Process Parent" -msgstr "Activer la priorité" +msgstr "Parent du Processus" #: scene/2d/visibility_notifier_2d.cpp msgid "Physics Process Parent" -msgstr "" +msgstr "Parent du Processus Physique" #: scene/3d/area.cpp msgid "Reverb Bus" msgstr "" #: scene/3d/area.cpp -#, fuzzy msgid "Uniformity" -msgstr "Définir le nom de l'uniforme" +msgstr "Uniformité" #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent." @@ -22449,7 +22323,7 @@ msgstr "ARVRCamera doit avoir un nÅ“ud ARVROrigin comme parent." #: scene/3d/arvr_nodes.cpp msgid "Controller ID" -msgstr "" +msgstr "ID Du Contrôleur" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" @@ -22489,9 +22363,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROrigin requiert un nÅ“ud enfant ARVRCamera." #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "Échelle aléatoire :" +msgstr "Échelle du Monde" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -24023,6 +23896,11 @@ msgstr "" "Modifiez les tailles dans les formes de collision enfants à la place." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transformation Globale" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 65ffebf3e5..db42dda6ed 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -450,6 +450,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20453,7 +20457,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22332,6 +22336,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Athrú: " + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index c8dd75ade3..b42b50e5a7 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -488,6 +488,10 @@ msgid "Pressure" msgstr "Axustes de Importación" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Axuste Relativo" @@ -21645,7 +21649,7 @@ msgstr "Viaxe" msgid "Rotation Degrees" msgstr "Rotando % graos." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constante" @@ -23712,6 +23716,11 @@ msgstr "" "lugar." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transformación" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index d37f806bb7..a89d117ead 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -483,6 +483,10 @@ msgid "Pressure" msgstr "לחץ" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "GDNative" @@ -21808,7 +21812,7 @@ msgstr "טיול" msgid "Rotation Degrees" msgstr "הטיה של %s מעלות." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "קבוע" @@ -23890,6 +23894,11 @@ msgstr "" "×‘×ž×§×•× ×–×ת יש ×œ×©× ×•×ª ×ת גודל צורות ×”×”×ª× ×’×©×•×ª של הצ×צ××™×." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "התמרה" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 0e6bb551e4..a598e43071 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -466,6 +466,10 @@ msgid "Pressure" msgstr "पà¥à¤°à¥€à¤¸à¥‡à¤Ÿ" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21363,7 +21367,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ" @@ -23338,6 +23342,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index c1a9a444cc..61aeaeeb10 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -465,6 +465,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20844,7 +20848,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22783,6 +22787,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Uredi Tranzicije..." + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 5bfd5b0995..9f0d894b2a 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -507,6 +507,10 @@ msgid "Pressure" msgstr "ElÅ‘re beállÃtott" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "RelatÃv Illesztés" @@ -21595,7 +21599,7 @@ msgstr "Utazás" msgid "Rotation Degrees" msgstr "Forgatási Léptetés:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Ãllandó" @@ -23628,6 +23632,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Globális Transzformáció Megtartása" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index 57c1a69e92..24547a7464 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -26,7 +26,7 @@ # Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020. # zephyroths <ridho.hikaru@gmail.com>, 2020, 2021, 2022. # Richard Urban <redasuio1@gmail.com>, 2020. -# yusuf afandi <afandi.yusuf.04@gmail.com>, 2020. +# yusuf afandi <afandi.yusuf.04@gmail.com>, 2020, 2022. # Habib Rohman <revolusi147id@gmail.com>, 2020. # Hanz <hanzhaxors@gmail.com>, 2021. # Reza Almanda <rezaalmanda27@gmail.com>, 2021, 2022. @@ -44,8 +44,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-15 09:38+0000\n" -"Last-Translator: Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>\n" +"PO-Revision-Date: 2022-07-09 21:12+0000\n" +"Last-Translator: yusuf afandi <afandi.yusuf.04@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -53,7 +53,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -481,6 +481,11 @@ msgid "Pressure" msgstr "Tekanan" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "Balik" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatif" @@ -21753,7 +21758,7 @@ msgstr "Menjelajah" msgid "Rotation Degrees" msgstr "Derajat Putaran" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "Rotasi Global" @@ -23822,6 +23827,11 @@ msgstr "" "Ubah ukurannya melalui \"collision shape\"-anaknya saja." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transformasi Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "Matriks" @@ -24742,7 +24752,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Tanda sisipan" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" diff --git a/editor/translations/is.po b/editor/translations/is.po index d5353421d4..b7eb0e4b88 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -457,6 +457,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20739,7 +20743,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22640,6 +22644,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Breyta umbreytingu" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index e693139e21..36757b891d 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -508,6 +508,10 @@ msgid "Pressure" msgstr "Pressione" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativo" @@ -21493,7 +21497,7 @@ msgstr "Spostamento" msgid "Rotation Degrees" msgstr "Rotazione in Gradi" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Costante" @@ -23642,6 +23646,11 @@ msgstr "" "Modifica invece la dimensione nelle forme di collisione figlie." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Mantieni Transform Globale" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 3abcd5529f..5c6358a4c4 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -487,6 +487,11 @@ msgid "Pressure" msgstr "圧力" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "å転" + +#: core/os/input_event.cpp msgid "Relative" msgstr "相対的" @@ -21573,7 +21578,7 @@ msgstr "トラベル" msgid "Rotation Degrees" msgstr "%s 度回転。" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "コンスタント" @@ -23711,6 +23716,11 @@ msgstr "" "代ã‚りã«ã€åã®è¡çªã‚·ã‚§ã‚¤ãƒ—ã®ã‚µã‚¤ã‚ºã‚’変更ã—ã¦ãã ã•ã„。" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ« ãƒˆãƒ©ãƒ³ã‚¹ãƒ•ã‚©ãƒ¼ãƒ ã‚’ä¿æŒ" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 14599ca68e..f67e7c0bdd 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -466,6 +466,10 @@ msgid "Pressure" msgstr "ზუმის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ§áƒ”ნებáƒ" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21235,7 +21239,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "მუდმივი" @@ -23190,6 +23194,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/km.po b/editor/translations/km.po index 32175987ef..2da1ccac99 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -440,6 +440,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20294,7 +20298,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22117,6 +22121,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Anim ផ្លាស់ប្ážáž¼ážš Transition" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 8800745e09..ff2f4ecb80 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -477,6 +477,10 @@ msgid "Pressure" msgstr "ì••ë ¥" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "ìƒëŒ€ì " @@ -21542,7 +21546,7 @@ msgstr "ì§„í–‰" msgid "Rotation Degrees" msgstr "%së„로 íšŒì „." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "ìƒìˆ˜" @@ -23666,6 +23670,11 @@ msgstr "" "ëŒ€ì‹ ìžì‹ ì½œë¦¬ì „ ëª¨ì–‘ì˜ í¬ê¸°ë¥¼ 변경하세요." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ì „ì— ë³€í˜• ìœ ì§€" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 51428b68f4..8daa544db9 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -476,6 +476,10 @@ msgid "Pressure" msgstr "Atstatyti PriartinimÄ…" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21259,7 +21263,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstanta" @@ -23223,6 +23227,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Animacija: Pakeisti TransformacijÄ…" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 0d2e4afec9..2dabcb40bf 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -479,6 +479,10 @@ msgid "Pressure" msgstr "Sagatave" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21083,7 +21087,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstante" @@ -23065,6 +23069,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "PÄreja eksistÄ“!" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index b35fce0168..ef9a504af6 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -444,6 +444,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "GDNative(ГДДомороден)" @@ -20345,7 +20349,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22175,6 +22179,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Ðнимација Промени Прелаз" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index b2f6c17059..1b5bc9e68f 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -450,6 +450,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20389,7 +20393,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22247,6 +22251,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ചലനം à´šàµà´±àµà´±àµ½" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index d9943d0a5e..8dffed5d4e 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -450,6 +450,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20406,7 +20410,7 @@ msgstr "पà¥à¤°à¤µà¤¾à¤¸" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22268,6 +22272,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "संकà¥à¤°à¤®à¤£: " + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index a1955bb027..caef354c6c 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -451,6 +451,10 @@ msgid "Pressure" msgstr "Tekanan" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatif" @@ -21295,7 +21299,7 @@ msgstr "Perjalanan" msgid "Rotation Degrees" msgstr "Langkah Putaran:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Pemalar" @@ -23297,6 +23301,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Kosongkan Transformasi" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 11bf857f4b..68de0259c2 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -473,6 +473,10 @@ msgid "Pressure" msgstr "Trykk" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativ" @@ -22145,7 +22149,7 @@ msgstr "Reise" msgid "Rotation Degrees" msgstr "Roterer %s grader." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstant" @@ -24190,6 +24194,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Nullstill Transformasjon" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index def707ac8b..756bf78add 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -547,6 +547,10 @@ msgid "Pressure" msgstr "Voorinstellingen" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Relatief kleven" @@ -22069,7 +22073,7 @@ msgstr "Verplaats" msgid "Rotation Degrees" msgstr "Roteren %s graden." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constante" @@ -24184,6 +24188,11 @@ msgstr "" "Verander in plaats daarvan de grootte van de onderliggende botsingsvormen." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Houd Globale Transformatie" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 9fdaafae3e..264d623676 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -67,7 +67,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-05 23:51+0000\n" +"PO-Revision-Date: 2022-07-10 14:38+0000\n" "Last-Translator: Dawid Skubij <davidsd@tlen.pl>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -270,7 +270,7 @@ msgstr "Sieć" #: core/io/file_access_network.cpp msgid "Remote FS" -msgstr "Zdalny System Plików" +msgstr "Zdalny System Plików" #: core/io/file_access_network.cpp msgid "Page Size" @@ -450,9 +450,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (fizyczny)" +msgstr "Fizyczny" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -505,6 +504,10 @@ msgid "Pressure" msgstr "CiÅ›nienie" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relatywny" @@ -5505,7 +5508,7 @@ msgstr "Miniatura..." #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "Doki" #: editor/editor_settings.cpp #, fuzzy @@ -7123,7 +7126,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7441,7 +7444,7 @@ msgstr "" #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Mapa normalnych" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -9851,7 +9854,7 @@ msgstr "Utwórz obrys" #: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/texture.cpp msgid "Mesh" -msgstr "Siatka" +msgstr "Mesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -17095,9 +17098,8 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "Skrypt" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" @@ -19304,9 +19306,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "NieprawidÅ‚owa nazwa pliku! APK Androida wymaga rozszerzenia *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "NieobsÅ‚ugiwany format eksportu!\n" +msgstr "NieobsÅ‚ugiwany format eksportu!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19336,9 +19337,8 @@ msgstr "" "projektu" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Nie udaÅ‚o siÄ™ eksportować plików projektu do projektu gradle\n" +msgstr "Nie udaÅ‚o siÄ™ eksportować plików projektu do projektu gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -20267,9 +20267,8 @@ msgid "ZIP Creation" msgstr "Projekt" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Nie udaÅ‚o siÄ™ eksportować plików projektu do projektu gradle\n" +msgstr "Nie udaÅ‚o siÄ™ otworzyć pliku do odczytu ze Å›cieżki \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -21255,26 +21254,23 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp scene/main/timer.cpp -#, fuzzy msgid "One Shot" -msgstr "Jednorazowy WÄ™zeÅ‚" +msgstr "Wyemituj raz" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Preprocess" -msgstr "Przetwarzanie koÅ„cowe" +msgstr "Przetwarzanie wstÄ™pne" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Explosiveness" -msgstr "" +msgstr "Wybuchowość" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "Losowy restart (s):" +msgstr "Losowość" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21849,7 +21845,7 @@ msgstr "Przejdź" msgid "Rotation Degrees" msgstr "Obracanie o %s stopni." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "StaÅ‚a globalna" @@ -21963,9 +21959,8 @@ msgstr "" "\"Particles Animation\"." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "Visibility Rect" -msgstr "Tryb priorytetów" +msgstr "ProstokÄ…t widocznoÅ›ci" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "Process Material" @@ -24000,6 +23995,11 @@ msgstr "" "Zamiast tego, zmieÅ„ rozmiary ksztaÅ‚tów kolizji w wÄ™zÅ‚ach podrzÄ™dnych." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Zachowaj globalnÄ… transformacjÄ™" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" @@ -24916,7 +24916,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Karetka" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index d0e041aba9..5c33524652 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -470,6 +470,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21300,7 +21304,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Rename Variable" @@ -23249,6 +23253,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Change yer Anim Transform" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index edbc6971fb..0b2fa35ae5 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -24,13 +24,14 @@ # Renu <ifpilucas@gmail.com>, 2022. # El_ExpertPlayer <xpertnathan37@gmail.com>, 2022. # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. +# Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-29 10:04+0000\n" -"Last-Translator: Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>\n" +"PO-Revision-Date: 2022-07-11 21:32+0000\n" +"Last-Translator: Ednaldo Pereira Confia <filat51823@storypo.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -38,7 +39,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -463,6 +464,10 @@ msgid "Pressure" msgstr "Pressione" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativo" @@ -2293,7 +2298,6 @@ msgstr "Desenvolvedor-chefe" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" msgstr "Gestor de Projetos" @@ -2540,9 +2544,8 @@ msgid "There is no '%s' file." msgstr "Não existe ficheiro '%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Esquema" +msgstr "Esquema:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2591,9 +2594,8 @@ msgid "Create a new Bus Layout." msgstr "Criar um novo Modelo de Barramento." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" -msgstr "Abrir Modelo de barramento de áudio" +msgstr "Modelo de barramento de áudio" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -2750,18 +2752,16 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Copiar Caminho do Nó" +msgstr "ConcluÃdo com erros." #: editor/editor_export.cpp msgid "Completed successfully." -msgstr "Completado com sucesso." +msgstr "ConcluÃdo com sucesso." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Falhou:" +msgstr "Falhou." #: editor/editor_export.cpp msgid "Storing File:" @@ -21543,7 +21543,7 @@ msgstr "Viagem" msgid "Rotation Degrees" msgstr "Graus de Rotação" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constante Global" @@ -23681,6 +23681,11 @@ msgstr "" "Em vez disso, mude o tamanho das formas de colisão filhas." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Manter Transformação Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 41301db983..a812335e4b 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -127,7 +127,7 @@ # Mário Victor Ribeiro Silva <mariovictorrs@gmail.com>, 2021. # jak3z <jose_renato06@outlook.com>, 2021. # Henrique Darko <henridark00@gmail.com>, 2021. -# Cearaj <pmoraisleal@gmail.com>, 2021. +# Cearaj <pmoraisleal@gmail.com>, 2021, 2022. # Alefy San <alefyferreiradeoliveira@outlook.com>, 2021. # Joel Gomes da Silva <joelgomes1994@hotmail.com>, 2021, 2022. # Orangotango De tanga <luizinho0045@gmail.com>, 2021. @@ -141,13 +141,14 @@ # José Miranda Neto <dodimi95@gmail.com>, 2022. # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. # Kaycke <kaycke@ymail.com>, 2022. +# Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-06-29 10:04+0000\n" -"Last-Translator: Douglas Leão <djlsplays@gmail.com>\n" +"PO-Revision-Date: 2022-07-16 06:20+0000\n" +"Last-Translator: Cearaj <pmoraisleal@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -155,7 +156,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -524,9 +525,8 @@ msgid "Command" msgstr "Comando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (FÃsico)" +msgstr "FÃsico" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -579,6 +579,11 @@ msgid "Pressure" msgstr "Pressão" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "Inverter" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativo" @@ -715,7 +720,6 @@ msgstr "Nome do Diretório de Usuário Personalizado" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" msgstr "Exibição" @@ -739,14 +743,12 @@ msgid "Always On Top" msgstr "Sempre no topo" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" msgstr "Largura de teste" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "Teste de altura" +msgstr "Altura de teste" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -781,9 +783,8 @@ msgid "Script Templates Search Path" msgstr "Caminho de Pesquisa de Modelos de Script" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Carregamento Automático na Inicialização" +msgstr "Carregamento Automático do Controle de Versão na Inicialização" #: core/project_settings.cpp msgid "Version Control Plugin Name" @@ -1091,9 +1092,8 @@ msgstr "Encaixe inteligente" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Usar Encaixe de Pixel" +msgstr "Usar Encaixe de Pixels da GPU" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -1313,7 +1313,6 @@ msgid "Animation" msgstr "Animação" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" msgstr "Facilitar Entrada-SaÃda" @@ -1450,14 +1449,13 @@ msgid "Type:" msgstr "Tipo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Template de exportação inválido:" +msgstr "(Inválido, tipo esperado: %s)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Easing:" -msgstr "Facilitar Entrada-SaÃda" +msgstr "Facilitar Entrada-SaÃda:" #: editor/animation_track_editor.cpp msgid "In-Handle:" @@ -1473,9 +1471,8 @@ msgid "Stream:" msgstr "Transmissão:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "InÃcio(s):" +msgstr "InÃcio (s):" #: editor/animation_track_editor.cpp msgid "End (s):" @@ -1571,9 +1568,8 @@ msgid "Editors" msgstr "Editores" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "Inserir Trilha e Chave na Anim" +msgstr "Confirmar Inserção de Trilha" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -2667,9 +2663,8 @@ msgid "There is no '%s' file." msgstr "Não existe o arquivo '%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Layout" +msgstr "Layout:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2718,9 +2713,8 @@ msgid "Create a new Bus Layout." msgstr "Criar um novo Layout de Canais." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" -msgstr "Abrir Layout de Canais de Ãudio" +msgstr "Layout de Canais de Ãudio" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -2900,14 +2894,12 @@ msgid "Packing" msgstr "Empacotando" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Salvar Como" +msgstr "Salvar PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Não foi possÃvel criar a pasta." +msgstr "Não foi possÃvel criar arquivo \"%s\"." #: editor/editor_export.cpp msgid "Failed to export project files." @@ -2918,9 +2910,8 @@ msgid "Can't open file to read from path \"%s\"." msgstr "Não é possÃvel abrir arquivo para leitura a partir do caminho \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Salvar Como" +msgstr "Salvar ZIP" #: editor/editor_export.cpp msgid "" @@ -3005,9 +2996,8 @@ msgid "Embed PCK" msgstr "Incorporar PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "Região da Textura" +msgstr "Formato da Textura" #: editor/editor_export.cpp msgid "BPTC" @@ -3028,7 +3018,7 @@ msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy msgid "No BPTC Fallbacks" -msgstr "Forçar Fallbacks do Shader" +msgstr "Sem Fallbacks do BPTC" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -3040,12 +3030,11 @@ msgstr "Modelo customizado de depuração não encontrado." #: 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 "Template customizado de release não encontrado." +msgstr "Modelo customizado de lançamento não encontrado." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Gerenciar Templates" +msgstr "Preparar Modelo" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "The given export path doesn't exist." @@ -3061,9 +3050,8 @@ msgstr "Falha ao copiar o modelo de exportação." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Preenchimento" +msgstr "Incorporação de PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3278,9 +3266,8 @@ msgid "Manage Editor Feature Profiles" msgstr "Gerenciar perfis de recurso do editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Perfil de funcionalidade do Godot" +msgstr "Perfil de funcionalidade Padrão" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3688,7 +3675,7 @@ msgstr "Propriedade:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #, fuzzy msgid "Label" -msgstr "Valor" +msgstr "Etiqueta" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp @@ -4072,18 +4059,16 @@ msgid "Quick Open Script..." msgstr "Abrir Script Rapidamente..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" -msgstr "Salvar e Reiniciar" +msgstr "Salvar & Recarregar" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Salvar alterações em '%s' antes de fechar?" +msgstr "Salvar alterações em '%s' antes de recarregar?" #: editor/editor_node.cpp msgid "Save & Close" -msgstr "Salvar e Fechar" +msgstr "Salvar & Fechar" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" @@ -4198,9 +4183,8 @@ msgid "Open Project Manager?" msgstr "Abrir Gerenciador de Projetos?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Salvar alterações na(s) seguinte(s) cena(s) antes de sair?" +msgstr "Salvar alterações na(s) seguinte(s) cena(s) antes de recarregar?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4406,9 +4390,8 @@ msgid "Scene Tabs" msgstr "Abas de Cena" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Sempre Mostrar Grade" +msgstr "Sempre mostrar o botão de fechar." #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" @@ -4423,9 +4406,8 @@ msgid "Output" msgstr "SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Limpar SaÃda" +msgstr "Sempre limpar saÃda ao jogar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" @@ -4440,19 +4422,16 @@ msgid "Save On Focus Loss" msgstr "Salvar em caso de perda de foco" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Salvar Ramo como Cena" +msgstr "Salvar cada cena ao sair" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Visualizar Informações" +msgstr "Confirmação de saÃda" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Ocultar Spinner de Atualização" +msgstr "Mostrar Spinner de Atualização" #: editor/editor_node.cpp msgid "Update Continuously" @@ -4479,18 +4458,16 @@ msgid "Inspector" msgstr "Inspetor" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Caminho Padrão do Projeto" +msgstr "Estilo de Nome de Propriedade Padrão" #: editor/editor_node.cpp msgid "Default Float Step" msgstr "Passo de ponto flutuante padrão" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "Botão Desativado" +msgstr "Desativar Dobragem" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" @@ -4502,21 +4479,19 @@ msgstr "Edição Horizontal do Vector2" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Edição Horizontal de Tipos de Vetor" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Abrir no inspetor" +msgstr "Abrir Recursos no Inspetor Atual" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Abrir no inspetor" +msgstr "Recursos para abrir em Novo Inspetor" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "" +msgstr "Modo de Seletor de Cores Padrão" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -21730,7 +21705,7 @@ msgstr "Viagem" msgid "Rotation Degrees" msgstr "Graus de Rotação" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "Rotação Global" @@ -23808,6 +23783,11 @@ msgstr "" "Altere o tamanho em formas de colisão de crianças." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Manter Transformação Global" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index cdd11f3980..395185bd3e 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -477,6 +477,10 @@ msgid "Pressure" msgstr "Presiune" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Relativ" @@ -21815,7 +21819,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "Pas RotaÈ›ie:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Permanent" @@ -23840,6 +23844,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Anim Schimbare transformare" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 84762459c8..befaceac4c 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -117,13 +117,14 @@ # FuzzMix <fmwolfiechad@gmail.com>, 2022. # Jasuse <jasusemaele@gmail.com>, 2022. # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. +# Maksim Marchukov <mar.maksim63@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-03 00:44+0000\n" -"Last-Translator: Vadim Mitroshkin <Vadim7540@yandex.ru>\n" +"PO-Revision-Date: 2022-07-17 07:14+0000\n" +"Last-Translator: Maksim Marchukov <mar.maksim63@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -132,7 +133,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -506,7 +507,7 @@ msgstr "Command" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr " (ФизичеÑкаÑ)" +msgstr "(ФизичеÑкаÑ)" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -559,6 +560,10 @@ msgid "Pressure" msgstr "Давление" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "ОтноÑительный" @@ -21425,7 +21430,7 @@ msgstr "ПеремеÑтитÑÑ" msgid "Rotation Degrees" msgstr "ГрадуÑÑ‹ вращениÑ" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "Глобальный поворот" @@ -23531,6 +23536,11 @@ msgstr "" "shapes)." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Глобальное преобразование" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/si.po b/editor/translations/si.po index ae1abeaa5a..bfba193a6a 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -454,6 +454,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20628,7 +20632,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "" @@ -22539,6 +22543,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Anim පරිවර්à¶à¶±à¶º වෙනස් කරන්න" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 6e20ee48da..f711be3039 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -493,6 +493,10 @@ msgid "Pressure" msgstr "Preset" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "PrichytiÅ¥ RelatÃvne" @@ -21746,7 +21750,7 @@ msgstr "CestovaÅ¥" msgid "Rotation Degrees" msgstr "Krok Rotácie:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "KonÅ¡tant" @@ -23771,6 +23775,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "PreložiÅ¥ Preloženie:" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 43eb784a39..aae6c8ba68 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -466,6 +466,10 @@ msgid "Pressure" msgstr "Prednastavitev..." #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Pripni Relativno" @@ -22040,7 +22044,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "Rotacijski Korak:" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstanta" @@ -24060,6 +24064,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Preoblikovanje" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index b11dc2f46f..f405b8b8a9 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -478,6 +478,10 @@ msgid "Pressure" msgstr "Ngarko Gabimet" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21475,7 +21479,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstantet" @@ -23425,6 +23429,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Binari i Transformimeve 3D" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index e4a0475e3f..9d7c4c5db8 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -494,6 +494,10 @@ msgid "Pressure" msgstr "ПоÑтавке" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "Залепи релативно" @@ -23499,7 +23503,7 @@ msgstr "Путуј" msgid "Rotation Degrees" msgstr "Ротација за %s Ñтепени." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "КонÑтантан" @@ -25648,6 +25652,11 @@ msgstr "" "рада." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Сачувај Глобалну ТранÑформу" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 9bbc31e19a..d3f588aca6 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -463,6 +463,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20735,7 +20739,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Kontanta" @@ -22675,6 +22679,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Animacija Promjeni Transformaciju" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 010299e2cf..08b57d1a25 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -505,6 +505,10 @@ msgid "Pressure" msgstr "Ã…terställ Zoom" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "GDNative" @@ -21814,7 +21818,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "Roterar %s grader." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Konstant" @@ -23848,6 +23852,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transformera" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 9e49f9dcc5..98eb54ce5c 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -444,6 +444,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -20306,7 +20310,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "à°¸à±à°¥à°¿à°°à°¾à°‚కాలà±" @@ -22146,6 +22150,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "గణనలà±" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 1a6a4b71be..9460318ef8 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -501,6 +501,10 @@ msgid "Pressure" msgstr "พรีเซ็ต" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "จำà¸à¸±à¸”โดยใช้ตำà¹à¸«à¸™à¹ˆà¸‡à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" @@ -21830,7 +21834,7 @@ msgstr "à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸—ี่" msgid "Rotation Degrees" msgstr "หมุน %s à¸à¸‡à¸¨à¸²" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "คงที่" @@ -23918,6 +23922,11 @@ msgstr "" "เปลี่ยนขนาดขà¸à¸‡à¸‚à¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸Šà¸™à¸¥à¸¹à¸à¹à¸—น" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "เà¸à¹‡à¸š Global Transform" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index d5a5d52332..a7a9bacaeb 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -476,6 +476,10 @@ msgid "Pressure" msgstr "Preset" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp #, fuzzy msgid "Relative" msgstr "GDNative" @@ -21035,7 +21039,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Constant" @@ -23032,6 +23036,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Transisyon: " + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 1e4ab521bf..3cbd52b7e4 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -522,6 +522,10 @@ msgid "Pressure" msgstr "Baskı" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Göreceli" @@ -21799,7 +21803,7 @@ msgstr "Seyahat" msgid "Rotation Degrees" msgstr "%s Düzey Dönüyor." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Genel Sabit" @@ -23938,6 +23942,11 @@ msgstr "" "Bunun yerine alt düğümlerde çarpışma ÅŸekillerindeki boyutu deÄŸiÅŸtirin." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Bütünsel Dönüşümü Tut" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 4d22a47dea..fd20ea0a29 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -467,6 +467,11 @@ msgid "Pressure" msgstr "ТиÑк" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "Інвертувати" + +#: core/os/input_event.cpp msgid "Relative" msgstr "ВідноÑний" @@ -21149,7 +21154,7 @@ msgstr "Подорож" msgid "Rotation Degrees" msgstr "ГрудуÑи обертаннÑ" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "Загальна Ñтала" @@ -23109,6 +23114,11 @@ msgstr "" "ЗаміÑть цієї зміни, вам варто змінити розміри дочірніх форм зіткненнÑ." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Зберегти загальне перетвореннÑ" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "МатрицÑ" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index e1bae41d6b..46cd56a57b 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -465,6 +465,10 @@ msgid "Pressure" msgstr "" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21088,7 +21092,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "مستقل" @@ -23012,6 +23016,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "سب سکریپشن بنائیں" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index c8eae36ad6..32fe3c1087 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -470,6 +470,10 @@ msgid "Pressure" msgstr "Ãp lá»±c" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "Tương đối" @@ -21691,7 +21695,7 @@ msgstr "Di chuyển" msgid "Rotation Degrees" msgstr "Xoay %s độ." -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "Hằng số" @@ -23778,6 +23782,11 @@ msgstr "" "Hãy sá»a kÃch cỡ khối va chạm cá»§a nút con ý." #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "Xóa biến đổi" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 976fe38138..a2183dd550 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -89,7 +89,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-06-30 16:42+0000\n" +"PO-Revision-Date: 2022-07-09 21:12+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -467,9 +467,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (物ç†ï¼‰" +msgstr "物ç†" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -522,6 +521,11 @@ msgid "Pressure" msgstr "压力" #: core/os/input_event.cpp +#, fuzzy +msgid "Pen Inverted" +msgstr "翻转" + +#: core/os/input_event.cpp msgid "Relative" msgstr "相对" @@ -5436,9 +5440,8 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "ä½¿ç”¨ä¸“é—¨é¼ æ ‡æŒ‰é”®æŸ¥çœ‹åŽ†å²" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap 选择" +msgstr "拖放选ä¸å†…容" #: editor/editor_settings.cpp msgid "Appearance" @@ -5672,7 +5675,7 @@ msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«ä¸‹é™" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«å倚" +msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«åç½®" #: editor/editor_settings.cpp msgid "Grid XZ Plane" @@ -14180,7 +14183,7 @@ msgid "" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"æ— æ³•è¿è¡Œé¡¹ç›®ï¼šæœªå®šä¹‰ä¸»åœºæ™¯ã€‚ \n" +"æ— æ³•è¿è¡Œé¡¹ç›®ï¼šæœªå®šä¹‰ä¸»åœºæ™¯ã€‚\n" "请编辑项目并在 “项目设置†的 “Application†类别下设置主场景。" #: editor/project_manager.cpp @@ -18075,9 +18078,8 @@ msgid "The package must have at least one '.' separator." msgstr "包必须至少有一个 “.†分隔符。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "使用自定义构建" +msgstr "自定义构建" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" @@ -18354,51 +18356,52 @@ msgstr "å¿…é¡»å¯ç”¨ “使用自定义构建†æ‰èƒ½ä½¿ç”¨æ’件。" msgid "" "\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." -msgstr "" -"“Hand Trackingâ€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOculus Mobile VrApiâ€æˆ–“OpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" +msgstr "“手势跟踪â€åªæœ‰åœ¨å½““XR 模å¼â€æ˜¯â€œOculus Mobile VrApiâ€æˆ–“OpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" #: platform/android/export/export_plugin.cpp msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." -msgstr "“Passthroughâ€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" +msgstr "“穿é€â€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "“Export AABâ€åªæœ‰åœ¨å½“å¯ç”¨â€œUse Custom Buildâ€æ—¶æ‰æœ‰æ•ˆã€‚" +msgstr "“Export AABâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„å»ºâ€æ—¶æ‰æœ‰æ•ˆã€‚" #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "修改“Min SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œUse Custom Buildâ€æ—¶æ‰æœ‰æ•ˆã€‚" +msgstr "ä¿®æ”¹â€œæœ€å° SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„å»ºâ€æ—¶æ‰æœ‰æ•ˆã€‚" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." -msgstr "" +msgstr "â€œæœ€å° SDKâ€åº”å½“ä¸ºæœ‰æ•ˆçš„æ•´æ•°ï¼Œä½†èŽ·å¾—äº†æ— æ•ˆçš„â€œ%sâ€ã€‚" #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." -msgstr "" +msgstr "â€œæœ€å° SDKâ€ä¸èƒ½ä½ŽäºŽ %d,这是 Godot 库所需è¦çš„版本。" #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "修改“Target SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œUse Custom Buildâ€æ—¶æ‰æœ‰æ•ˆã€‚" +msgstr "ä¿®æ”¹â€œç›®æ ‡ SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„å»ºâ€æ—¶æ‰æœ‰æ•ˆã€‚" #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." -msgstr "" +msgstr "â€œç›®æ ‡ SDKâ€åº”å½“ä¸ºæœ‰æ•ˆçš„æ•´æ•°ï¼Œä½†èŽ·å¾—äº†æ— æ•ˆçš„â€œ%sâ€ã€‚" #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"â€œç›®æ ‡ SDKâ€%d 比默认版本 %d è¦é«˜ã€‚è¿™æ ·åšä¹Ÿè®¸å¯è¡Œï¼Œä½†å¹¶æ²¡æœ‰ç»è¿‡æµ‹è¯•,å¯èƒ½ä¸ç¨³" +"定。" #: platform/android/export/export_plugin.cpp msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." -msgstr "“Target SDKâ€ç‰ˆæœ¬å¿…须大于ç‰äºŽâ€œMin SDKâ€ç‰ˆæœ¬ã€‚" +msgstr "â€œç›®æ ‡ SDKâ€ç‰ˆæœ¬å¿…须大于ç‰äºŽâ€œæœ€å° SDKâ€ç‰ˆæœ¬ã€‚" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp @@ -19725,8 +19728,8 @@ msgid "" "The rcedit tool must be configured in the Editor Settings (Export > Windows " "> Rcedit) to change the icon or app information data." msgstr "" -"必须在编辑器设置ä¸é…ç½® rcedit 工具(Export > Windows > Rcedit)æ‰èƒ½ä¿®æ”¹å›¾æ ‡æˆ–" -"åº”ç”¨ä¿¡æ¯æ•°æ®ã€‚" +"必须在编辑器设置ä¸é…ç½® rcedit 工具(导出 > Windows > Rcedit)æ‰èƒ½ä¿®æ”¹å›¾æ ‡æˆ–应" +"ç”¨ä¿¡æ¯æ•°æ®ã€‚" #: platform/windows/export/export.cpp msgid "Invalid icon path:" @@ -20429,7 +20432,7 @@ msgstr "节点 B" #: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/resources/environment.cpp msgid "Bias" -msgstr "å倚" +msgstr "åç½®" #: scene/2d/joints_2d.cpp msgid "Disable Collision" @@ -20606,9 +20609,8 @@ msgstr "" "移除。请用“Navigation2DServer.map_get_path()â€æ›¿ä»£ã€‚" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Pathfinding" -msgstr "绑定" +msgstr "寻路" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Path Desired Distance" @@ -20623,9 +20625,8 @@ msgid "Path Max Distance" msgstr "路径最大è·ç¦»" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance" -msgstr "高级" +msgstr "é¿éšœ" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Avoidance Enabled" @@ -20686,7 +20687,7 @@ msgstr "移动消耗" msgid "Rotation Degrees" msgstr "旋转角度" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp msgid "Global Rotation" msgstr "全局旋转" @@ -21590,7 +21591,7 @@ msgstr "动æ€èŒƒå›´" #: scene/3d/gi_probe.cpp scene/3d/light.cpp msgid "Normal Bias" -msgstr "法线å倚" +msgstr "法线åç½®" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp @@ -21701,7 +21702,7 @@ msgstr "æ··åˆæ‹†åˆ†" #: scene/3d/light.cpp msgid "Bias Split Scale" -msgstr "å倚拆分缩放" +msgstr "å置拆分缩放" #: scene/3d/light.cpp msgid "Depth Range" @@ -21935,7 +21936,7 @@ msgstr "角度下é™" #: scene/3d/physics_body.cpp msgid "Angular Limit Bias" -msgstr "角度é™åˆ¶å倚" +msgstr "角度é™åˆ¶åç½®" #: scene/3d/physics_body.cpp msgid "Angular Limit Softness" @@ -22561,6 +22562,11 @@ msgstr "" "建议修改å节点的碰撞体形状尺寸。" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "å…¨å±€å˜æ¢" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "矩阵" @@ -23651,9 +23657,8 @@ msgid "Fold Gutter" msgstr "æŠ˜å æ " #: scene/gui/text_edit.cpp -#, fuzzy msgid "Drag And Drop Selection Enabled" -msgstr "å¯ç”¨é€‰æ‹©" +msgstr "å¯ç”¨æ‹–放选ä¸å†…容" #: scene/gui/text_edit.cpp msgid "Hiding Enabled" @@ -24024,6 +24029,9 @@ msgid "" "Effects.\n" "HDR will be disabled for this Viewport." msgstr "" +"这个 Viewport å¯ç”¨äº† HDR,但其 Usage 为 2D 或 2D No-Sampling。\n" +"HDR 仅在 Usage 为 3D 或 3D No-Effects çš„ Viewport 䏿”¯æŒã€‚\n" +"这个 Viewport å°†ç¦ç”¨ HDR。" #: scene/main/viewport.cpp msgid "ARVR" @@ -25662,7 +25670,7 @@ msgstr "A" #: scene/resources/shape_2d.cpp msgid "Custom Solver Bias" -msgstr "自定义求解器å倚" +msgstr "自定义求解器åç½®" #: scene/resources/skin.cpp msgid "Bind Count" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 201811d543..dcd0403c6a 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -479,6 +479,10 @@ msgid "Pressure" msgstr "é‡è¨ç¸®æ”¾æ¯”例" #: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp msgid "Relative" msgstr "" @@ -21926,7 +21930,7 @@ msgstr "" msgid "Rotation Degrees" msgstr "" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "常數" @@ -23919,6 +23923,11 @@ msgid "" msgstr "" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ç¿»è¯" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 9021c16fc8..d56bc9ec23 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -33,13 +33,16 @@ # Haoyu Qiu <timothyqiu32@gmail.com>, 2022. # Otis Kao <momoslim@gmail.com>, 2022. # YuChiang Chang <chiang.c.tw@gmail.com>, 2022. +# è˜è˜ <rrt467778@gmail.com>, 2022. +# marktwtn <marktwtn@gmail.com>, 2022. +# Shi-Xun Hong <jimmy3421@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-30 16:17+0000\n" -"Last-Translator: YuChiang Chang <chiang.c.tw@gmail.com>\n" +"PO-Revision-Date: 2022-07-18 08:11+0000\n" +"Last-Translator: è˜è˜ <rrt467778@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -47,7 +50,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -70,27 +73,22 @@ msgid "V-Sync Enabled" msgstr "å•Ÿç”¨åž‚ç›´åŒæ¥" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "V-Sync Via Compositor" msgstr "é€éŽåˆæˆå™¨åž‚ç›´åŒæ¥" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Delta Smoothing" -msgstr "變é‡å¹³æ»‘" +msgstr "å·®é‡å¹³æ»‘" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode Sleep (µsec)" msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼ç¡çœ (微秒)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Keep Screen On" msgstr "ä¿æŒèž¢å¹•開啟" @@ -157,9 +155,8 @@ msgid "Size" msgstr "大å°" #: core/bind/core_bind.cpp -#, fuzzy msgid "Endian Swap" -msgstr "切æ›ç«¯åº" +msgstr "切æ›å—節åº" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -178,9 +175,8 @@ msgid "Target FPS" msgstr "標準FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "TimeScale 節點" +msgstr "時間縮放" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -199,9 +195,8 @@ msgid "Error Line" msgstr "發生錯誤之行數" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "æœå°‹çµæžœ" +msgstr "çµæžœ" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" @@ -230,7 +225,6 @@ msgstr "多執行緒佇列大å°(KB)" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" msgstr "函å¼" @@ -260,17 +254,14 @@ msgid "Page Read Ahead" msgstr "é 先讀å–é æ•¸" #: core/io/http_client.cpp -#, fuzzy msgid "Blocking Mode Enabled" -msgstr "啟用阻礙模å¼" +msgstr "啟用阻塞模å¼" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" msgstr "連接" #: core/io/http_client.cpp -#, fuzzy msgid "Read Chunk Size" msgstr "讀å–å€å¡Šå¤§å°" @@ -287,12 +278,10 @@ msgid "Refuse New Network Connections" msgstr "拒絕新網路連接" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "å°ç‰ç¶²è·¯ä½¿ç”¨è€…" +msgstr "å°ç‰ç¶²è·¯" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" msgstr "æ ¹ç¯€é»ž" @@ -301,9 +290,8 @@ msgid "Refuse New Connections" msgstr "拒絕新網路連接" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "轉æ›é¡žåž‹" +msgstr "傳輸模å¼" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" @@ -353,9 +341,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "ä½å…ƒçµ„長度ä¸è¶³ä»¥é€²è¡Œè§£ç¢¼æˆ–æˆ–æ ¼å¼ç„¡æ•ˆã€‚" #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "é‹ç®—å¼ä¸çš„輸入 %i 無效 (未傳éžï¼‰" +msgstr "é‹ç®—å¼çš„輸入%d 無效(未傳éžï¼‰" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -387,7 +374,6 @@ msgid "Seed" msgstr "種å" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" msgstr "狀態" @@ -400,14 +386,12 @@ msgid "Max Size (KB)" msgstr "最大大å°ï¼ˆKB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "移動模å¼" +msgstr "æ»‘é¼ æ¨¡å¼" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "刪除輸入" +msgstr "使用累ç©è¼¸å…¥" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -435,14 +419,12 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (物ç†ï¼‰" +msgstr "物ç†" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" msgstr "按下" @@ -451,21 +433,18 @@ msgid "Scancode" msgstr "éµç›¤æŽƒæç¢¼" #: core/os/input_event.cpp -#, fuzzy msgid "Physical Scancode" -msgstr "實體éµç›¤æŽƒæç¢¼" +msgstr "ç‰©ç†æŽƒæç¢¼" #: core/os/input_event.cpp msgid "Unicode" msgstr "Unicode" #: core/os/input_event.cpp -#, fuzzy msgid "Echo" -msgstr "Echo" +msgstr "回è²" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" msgstr "按éµé®ç½©" @@ -474,7 +453,6 @@ msgid "Global Position" msgstr "全域ä½ç½®" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" msgstr "å› ç´ " @@ -491,12 +469,14 @@ msgid "Tilt" msgstr "傾斜" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "按壓" +msgstr "壓力" + +#: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" msgstr "相å°" @@ -532,12 +512,10 @@ msgid "Strength" msgstr "強度" #: core/os/input_event.cpp -#, fuzzy msgid "Delta" -msgstr "變é‡" +msgstr "å·®é‡" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" msgstr "é »é“" @@ -613,14 +591,12 @@ msgid "Main Scene" msgstr "ä¸»å ´æ™¯" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "ç¦ç”¨è‡ªå‹•圖塊" +msgstr "åœç”¨æ¨™æº–輸出" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "å·²åœç”¨çš„é …ç›®" +msgstr "åœç”¨æ¨™æº–錯誤輸出" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" @@ -637,15 +613,14 @@ msgstr "自訂使用者目錄å稱" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "全部顯示" +msgstr "顯示" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "寬" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -653,23 +628,20 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "燈光" +msgstr "高度" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "ç½®é ‚" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "左延展" +msgstr "測試寬度" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "測試" +msgstr "測試高度" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -688,33 +660,28 @@ msgid "Editor" msgstr "編輯器" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" msgstr "主執行引數" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "å ´æ™¯è·¯å¾‘ï¼š" +msgstr "å ´æ™¯å‘½å" #: core/project_settings.cpp -#, fuzzy msgid "Search In File Extensions" -msgstr "ä»¥å‰¯æª”åæœå°‹" +msgstr "ä»¥æª”æ¡ˆå‰¯æª”åæœå°‹" #: core/project_settings.cpp msgid "Script Templates Search Path" msgstr "è…³æœ¬æ¨£æ¿æœå°‹è·¯å¾‘" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "啟動時自動載入" +msgstr "啟動時自動載入版本控制" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "版本控制" +msgstr "版本控制外掛å稱" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -722,9 +689,8 @@ msgid "Input" msgstr "輸入" #: core/project_settings.cpp -#, fuzzy msgid "UI Accept" -msgstr "UI確定" +msgstr "確定 (UI)" #: core/project_settings.cpp msgid "UI Select" @@ -735,43 +701,36 @@ msgid "UI Cancel" msgstr "UIå–æ¶ˆ" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "èšç„¦è·¯å¾‘" +msgstr "èšç„¦ä¸‹ä¸€å€‹ (UI)" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "èšç„¦è·¯å¾‘" +msgstr "èšç„¦ä¸Šä¸€å€‹ (UI)" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "左上" +msgstr "å·¦ (UI)" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "å³ä¸Š" +msgstr "å³ (UI)" #: core/project_settings.cpp msgid "UI Up" msgstr "UI上" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "UI下" +msgstr "下 (UI)" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "UIé é¢å‘上滾動" +msgstr "é é¢ä¸Šæ»¾ (UI)" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Down" -msgstr "UIé é¢å‘下滾動" +msgstr "é é¢ä¸‹æ»¾ (UI)" #: core/project_settings.cpp msgid "UI Home" @@ -803,7 +762,6 @@ msgid "3D" msgstr "3D" #: core/project_settings.cpp -#, fuzzy msgid "Smooth Trimesh Collision" msgstr "å¹³æ»‘ä¸‰è§’ç¶²æ ¼ç¢°æ’ž" @@ -832,12 +790,10 @@ msgstr "å“質" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" msgstr "篩é¸å™¨" #: core/project_settings.cpp scene/main/viewport.cpp -#, fuzzy msgid "Sharpen Intensity" msgstr "銳化強度" @@ -864,9 +820,8 @@ msgid "Profiler" msgstr "分æžå·¥å…·" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "最大值函å¼" +msgstr "æœ€å¤§å‡½å¼æ•¸" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -881,18 +836,16 @@ msgid "Zstd" msgstr "Zstd" #: core/project_settings.cpp -#, fuzzy msgid "Long Distance Matching" -msgstr "é•·è·é…å°" +msgstr "é•·è·é›¢åŒ¹é…" #: core/project_settings.cpp msgid "Compression Level" msgstr "壓縮ç‰ç´š" #: core/project_settings.cpp -#, fuzzy msgid "Window Log Size" -msgstr "視窗日誌大å°" +msgstr "è¦–çª—å°æ•¸å¤§å°" #: core/project_settings.cpp msgid "Zlib" @@ -915,14 +868,12 @@ msgid "TCP" msgstr "TCP" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "連接逾時秒數" +msgstr "連線逾時秒數" #: core/register_core_types.cpp -#, fuzzy msgid "Packet Peer Stream" -msgstr "å°åŒ…å°ç‰ä¸²æµ" +msgstr "å°åŒ…å°ç‰æµ" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -933,7 +884,6 @@ msgid "SSL" msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" msgstr "憑è‰" @@ -944,9 +894,8 @@ msgid "Resource" msgstr "資æº" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "é—œé–‰å ´æ™¯" +msgstr "åƒ…é™æœ¬å ´æ™¯" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -964,14 +913,12 @@ msgid "Locale" msgstr "地å€" #: core/translation.cpp -#, fuzzy msgid "Test" msgstr "測試" #: core/translation.cpp scene/resources/font.cpp -#, fuzzy msgid "Fallback" -msgstr "éžè£œ" +msgstr "後備語言" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1033,27 +980,23 @@ msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" msgstr "å¸é™„" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "使用GPUåƒç´ å¸é™„" +msgstr "使用 GPU åƒç´ å¸é™„" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Immediate Buffer Size (KB)" msgstr "峿™‚ç·©è¡å€å¤§å°ï¼ˆKB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp -#, fuzzy msgid "Lightmapping" -msgstr "烘焙光照圖" +msgstr "光照貼圖" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1102,9 +1045,8 @@ msgid "Weight Samples" msgstr "æ¬Šé‡æŽ¡æ¨£" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Voxel Cone Tracing" -msgstr "é«”ç´ æ¤Žé«”ææ‘¹" +msgstr "é«”ç´ éŒè¿½è¸ª" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1186,9 +1128,8 @@ msgstr "更改動畫呼å«" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "å½±æ ¼ %" +msgstr "å½±æ ¼" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1199,16 +1140,14 @@ msgstr "時間" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "本地化" +msgstr "ä½ç½®" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "旋轉æ¥é•·ï¼š" +msgstr "旋轉" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1216,14 +1155,13 @@ msgid "Value" msgstr "數值" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "數é‡ï¼š" +msgstr "引數數é‡" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "åƒæ•¸" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1235,29 +1173,27 @@ msgstr "型別" #: editor/animation_track_editor.cpp #, fuzzy msgid "In Handle" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "輸入把手" #: editor/animation_track_editor.cpp #, fuzzy msgid "Out Handle" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "輸出把手" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "æµ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "起點åç§»" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "å移:" +msgstr "終點åç§»" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1270,7 +1206,6 @@ msgid "Animation" msgstr "å‹•ç•«" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" msgstr "緩入緩出" @@ -1381,19 +1316,16 @@ msgid "Remove this track." msgstr "移除該動畫軌。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "時間(秒) : " +msgstr "時間(秒):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "ä½ç½®" +msgstr "ä½ç½®ï¼š" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "旋轉æ¥é•·ï¼š" +msgstr "旋轉:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1410,14 +1342,12 @@ msgid "Type:" msgstr "型別:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "無效的輸出樣æ¿ï¼š" +msgstr "ï¼ˆç„¡æ•ˆï¼Œé æœŸåž‹åˆ¥ï¼š%s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "緩入緩出" +msgstr "緩入緩出:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1430,24 +1360,20 @@ msgid "Out-Handle:" msgstr "è¨å®šè™•ç†ç¨‹å¼" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "串æµä½¿ç”¨è€…" +msgstr "æµï¼š" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "釿–°é–‹å§‹ï¼ˆç§’):" +msgstr "開始(秒):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "淡入(秒):" +msgstr "çµæŸï¼ˆç§’):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "動畫:" +msgstr "動畫片段:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1501,9 +1427,8 @@ msgid "Duplicate Key(s)" msgstr "é‡è¤‡é—œéµç•«æ ¼" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "新增 %d å€‹å½±æ ¼" +msgstr "新增 RESET 值" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -1532,14 +1457,12 @@ msgstr "刪除動畫軌" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" msgstr "編輯器" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "新增動畫軌é“與關éµç•«æ ¼" +msgstr "ç¢ºèªæ’入軌é“" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1663,9 +1586,8 @@ msgid "Add Method Track Key" msgstr "新增方法軌é“é—œéµç•«æ ¼" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "åœ¨ç‰©ä»¶ä¸æ‰¾ä¸åˆ°æ–¹æ³•: " +msgstr "åœ¨ç‰©ä»¶ä¸æ‰¾ä¸åˆ°è©²æ–¹æ³•:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1706,9 +1628,8 @@ msgid "" msgstr "該é¸é …ä¸é©ç”¨è²èŒ²æ›²ç·šç·¨è¼¯ï¼Œå› 曲線僅有單一軌é“。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "動畫縮放關éµå½±æ ¼" +msgstr "新增動畫 RESET éµ" #: editor/animation_track_editor.cpp msgid "" @@ -1722,7 +1643,7 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"è©²å‹•ç•«å±¬æ–¼å¤–éƒ¨åŒ¯å…¥ä¹‹å ´æ™¯ï¼Œå¥—ç”¨æ–¼åŒ¯å…¥è»Œé“çš„ä¿®æ”¹å°‡ä¸æœƒè¢«ä¿å˜ã€‚\n" +"è©²å‹•ç•«å±¬æ–¼å¤–éƒ¨åŒ¯å…¥ä¹‹å ´æ™¯ï¼Œå¥—ç”¨æ–¼åŒ¯å…¥è»Œé“çš„ä¿®æ”¹å°‡ä¸æœƒè¢«å„²å˜ã€‚\n" "\n" "è‹¥è¦é–‹å•Ÿã€ŒåŠ å…¥å®¢åˆ¶è»Œã€çš„åŠŸèƒ½ï¼Œè«‹åœ¨å ´æ™¯åœ¨åŒ¯å…¥è¨å®šä¸å°‡ [Animation] -> " "[Storage] è¨å®šç‚º\n" @@ -2268,7 +2189,7 @@ msgstr "開啟" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "%s 的所有者(總計:%d)" #: editor/dependency_editor.cpp msgid "" @@ -2377,7 +2298,6 @@ msgstr "主è¦é–‹ç™¼è€…" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" msgstr "專案管ç†å“¡" @@ -2619,9 +2539,8 @@ msgid "There is no '%s' file." msgstr "檔案「%sã€ä¸å˜åœ¨ã€‚" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "ç•«é¢é…ç½®" +msgstr "佈局:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2655,7 +2574,7 @@ msgstr "å¦å˜æ–°æª”" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "å°‡è©²åŒ¯æµæŽ’é…ç½®ä¿å˜è‡³æª”案。" +msgstr "å°‡è©²åŒ¯æµæŽ’é…置儲å˜è‡³æª”案。" #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" @@ -2670,9 +2589,8 @@ msgid "Create a new Bus Layout." msgstr "å»ºç«‹æ–°åŒ¯æµæŽ’é…置。" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" -msgstr "é–‹å•ŸéŸ³è¨ŠåŒ¯æµæŽ’é…ç½®" +msgstr "éŸ³è¨ŠåŒ¯æµæŽ’ä½ˆå±€" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -2790,7 +2708,7 @@ msgstr "[空]" #: editor/plugins/text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "[unsaved]" -msgstr "[未ä¿å˜]" +msgstr "[未儲å˜]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." @@ -2825,22 +2743,19 @@ msgstr "鏿“‡" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "專案匯出平å°ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "複製節點路徑" +msgstr "已完æˆï¼Œå˜åœ¨éŒ¯èª¤ã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "å¥—ä»¶å®‰è£æˆåŠŸï¼" +msgstr "å¥—ä»¶å®‰è£æˆåŠŸã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "失敗:" +msgstr "失敗。" #: editor/editor_export.cpp msgid "Storing File:" @@ -2855,29 +2770,24 @@ msgid "Packing" msgstr "æ£åœ¨æ‰“包" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "å¦å˜æ–°æª”" +msgstr "å„²å˜ PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "無法新增資料夾。" +msgstr "無法建立「%sã€æª”案。" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "無法匯出專案檔案" +msgstr "無法匯出專案檔。" #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "無法開啟欲寫入的檔案:" +msgstr "ç„¡æ³•æ‰“é–‹ä½æ–¼ã€Œ%sã€çš„æª”案用於讀å–。" #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "å¦å˜æ–°æª”" +msgstr "å„²å˜ ZIP" #: editor/editor_export.cpp msgid "" @@ -2902,7 +2812,7 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"目標平å°ä¸Šçš„ GLES2 å›žé€€é©…å‹•å™¨åŠŸèƒ½å¿…é ˆä½¿ç”¨ã€ŒETCã€ç´‹ç†å£“縮。\n" +"目標平å°ä¸Šçš„ GLES2 å¾Œå‚™é©…å‹•å™¨åŠŸèƒ½å¿…é ˆä½¿ç”¨ã€ŒETCã€ç´‹ç†å£“縮。\n" "請在專案è¨å®šä¸å•Ÿç”¨ã€ŒImport Etcã€æˆ–是ç¦ç”¨ã€ŒDriver Fallback Enabledã€ã€‚" #: editor/editor_export.cpp @@ -2928,15 +2838,14 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"目標平å°ä¸Šçš„ GLES2 å›žé€€é©…å‹•å™¨åŠŸèƒ½å¿…é ˆä½¿ç”¨ã€ŒPVRTCã€ç´‹ç†å£“縮。\n" +"目標平å°ä¸Šçš„ GLES2 å¾Œå‚™é©…å‹•å™¨åŠŸèƒ½å¿…é ˆä½¿ç”¨ã€ŒPVRTCã€ç´‹ç†å£“縮。\n" "請在專案è¨å®šä¸å•Ÿç”¨ã€ŒImport Pvrtcã€æˆ–是ç¦ç”¨ã€ŒDriver Fallback Enabledã€ã€‚" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" -msgstr "編輯器主題" +msgstr "自訂模æ¿" #: editor/editor_export.cpp editor/project_export.cpp #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp @@ -2946,9 +2855,8 @@ msgid "Release" msgstr "發行" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "色彩é‹ç®—å。" +msgstr "äºŒé€²ä½æ ¼å¼" #: editor/editor_export.cpp msgid "64 Bits" @@ -2959,9 +2867,8 @@ msgid "Embed PCK" msgstr "內嵌PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "ç´‹ç†è²¼åœ–å€åŸŸ" +msgstr "ç´‹ç†è²¼åœ–æ ¼å¼" #: editor/editor_export.cpp msgid "BPTC" @@ -2980,9 +2887,8 @@ msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "ç„¡BPTC回è½" +msgstr "ç„¡ BPTC 後備" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2997,30 +2903,25 @@ msgid "Custom release template not found." msgstr "找ä¸åˆ°è‡ªå®šç¾©ç™¼è¡Œæ¨£æ¿ã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "ç®¡ç†æ¨£æ¿" +msgstr "ç®¡ç†æ¨¡æ¿" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "給定的匯出路徑ä¸å˜åœ¨ï¼š" +msgstr "給定的匯出路徑ä¸å˜åœ¨ã€‚" #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "找ä¸åˆ°æ¨£æ¿æª”案:" +msgstr "找ä¸åˆ°æ¨¡æ¿æª”案:「%sã€ã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "無效的輸出樣æ¿ï¼š" +msgstr "複製匯出模æ¿å¤±æ•—。" #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "å¡«å……" +msgstr "PCK 內嵌" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3228,9 +3129,8 @@ msgid "Manage Editor Feature Profiles" msgstr "管ç†ç·¨è¼¯å™¨åŠŸèƒ½è¨å®šæª”" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Godot 功能è¨å®šæª”" +msgstr "é è¨åŠŸèƒ½è¨å®šæª”" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3295,21 +3195,19 @@ msgstr "開啟檔案或資料夾" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" -msgstr "ä¿å˜" +msgstr "儲å˜" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" -msgstr "ä¿å˜æª”案" +msgstr "å„²å˜æª”案" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "æˆåŠŸï¼" +msgstr "å˜å–" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "æ’æ”¾æ¨¡å¼ï¼š" +msgstr "顯示模å¼" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3322,30 +3220,25 @@ msgstr "æ’æ”¾æ¨¡å¼ï¼š" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "平移模å¼" +msgstr "模å¼" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "ç›®å‰ï¼š" +msgstr "ç›®å‰ç›®éŒ„" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "ç›®å‰è¨å®šæª”:" +msgstr "所在檔案" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "ç›®å‰ï¼š" +msgstr "所在目錄" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "顯示ï¼å–æ¶ˆé¡¯ç¤ºéš±è—æª”案" +msgstr "顯示隱è—的檔案" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" @@ -3480,9 +3373,8 @@ msgid "Properties" msgstr "屬性" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "複寫:" +msgstr "覆蓋 %s:" #: editor/editor_help.cpp msgid "default:" @@ -3640,46 +3532,39 @@ msgid "Property:" msgstr "屬性:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" -msgstr "數值" +msgstr "標籤" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "僅顯示方法" +msgstr "åªè®€" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" -msgstr "æª¢æŸ¥é …ç›®" +msgstr "å¯å‹¾é¸" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "å·²æª¢æŸ¥çš„é …ç›®" +msgstr "已勾é¸" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "繪製呼å«ï¼š" +msgstr "繪製紅色" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "執行" +msgstr "輸入" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(數值)" +msgstr "固定值" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." -msgstr "釘é¸çš„æ•¸å€¼å°‡è¢«è¿«ä¿å˜ï¼Œå³ä½¿å…¶å€¼èˆ‡é è¨å€¼ç›¸åŒã€‚" +msgstr "釘é¸çš„æ•¸å€¼å°‡è¢«è¿«å„²å˜ï¼Œå³ä½¿å…¶å€¼èˆ‡é è¨å€¼ç›¸åŒã€‚" #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" @@ -3707,19 +3592,16 @@ msgid "Unpinned %s" msgstr "已解除釘é¸%s" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" msgstr "複製屬性" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" msgstr "貼上屬性" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "複製腳本路徑" +msgstr "複製屬性路徑" #: editor/editor_log.cpp msgid "Output:" @@ -3809,7 +3691,7 @@ msgstr "ç·¨è¼¯å™¨è¦–çª—é‡æ–°ç¹ªè£½æ™‚旋轉。" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "匯入的資æºç„¡æ³•ä¿å˜ã€‚" +msgstr "匯入的資æºç„¡æ³•儲å˜ã€‚" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -3825,7 +3707,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..." @@ -3884,22 +3766,22 @@ msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" -"è©²å ´æ™¯æœ‰å¾ªç’°æ€§å¯¦é«”åŒ–å•題,無法ä¿å˜ã€‚\n" +"è©²å ´æ™¯æœ‰å¾ªç’°æ€§å¯¦é«”åŒ–å•題,無法儲å˜ã€‚\n" "請先解決æ¤å•題後å†è©¦ä¸€æ¬¡ã€‚" #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." -msgstr "無法ä¿å˜å ´æ™¯ã€‚å¯èƒ½æ˜¯ç”±æ–¼ç›¸ä¾æ€§ï¼ˆå¯¦é«”或繼承)無法滿足。" +msgstr "無法儲å˜å ´æ™¯ã€‚å¯èƒ½æ˜¯ç”±æ–¼ç›¸ä¾æ€§ï¼ˆå¯¦é«”或繼承)無法滿足。" #: editor/editor_node.cpp msgid "Could not save one or more scenes!" -msgstr "無法ä¿å˜ä¸€æˆ–å¤šå€‹å ´æ™¯ï¼" +msgstr "無法儲å˜ä¸€æˆ–å¤šå€‹å ´æ™¯ï¼" #: editor/editor_node.cpp msgid "Save All Scenes" -msgstr "ä¿å˜æ‰€æœ‰å ´æ™¯" +msgstr "å„²å˜æ‰€æœ‰å ´æ™¯" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" @@ -3926,7 +3808,7 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" -"ä¿å˜ç·¨è¼¯å™¨ç•«é¢é…置時發生錯誤。\n" +"儲å˜ç·¨è¼¯å™¨ç•«é¢é…置時發生錯誤。\n" "請確èªç·¨è¼¯å™¨çš„使用者資料路徑是å¦å¯å¯«å…¥ã€‚" #: editor/editor_node.cpp @@ -3995,7 +3877,7 @@ msgstr "æœªå®šç¾©æ¬²åŸ·è¡Œä¹‹å ´æ™¯ã€‚" #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "執行å‰å…ˆä¿å˜å ´æ™¯..." +msgstr "執行å‰å…ˆå„²å˜å ´æ™¯..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -4022,38 +3904,36 @@ msgid "Quick Open Script..." msgstr "快速開啟腳本…" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" -msgstr "ä¿å˜ä¸¦é‡æ–°å•Ÿå‹•" +msgstr "儲å˜ä¸¦é‡æ–°è¼‰å…¥" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "é—œé–‰å‰æ˜¯å¦ä¿å˜å°ã€Œ%sã€çš„æ›´æ”¹ï¼Ÿ" +msgstr "是å¦åœ¨é‡æ–°è¼‰å…¥å‰å„²å˜å°ã€Œ%sã€çš„變更?" #: editor/editor_node.cpp msgid "Save & Close" -msgstr "ä¿å˜ä¸¦é—œé–‰" +msgstr "儲å˜ä¸¦é—œé–‰" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "é—œé–‰å‰æ˜¯å¦ä¿å˜å°ã€Œ%sã€çš„æ›´æ”¹ï¼Ÿ" +msgstr "é—œé–‰å‰æ˜¯å¦å„²å˜å°ã€Œ%sã€çš„æ›´æ”¹ï¼Ÿ" #: editor/editor_node.cpp msgid "%s no longer exists! Please specify a new save location." -msgstr "%sä¸å˜åœ¨ï¼è«‹æŒ‡å®šæ–°çš„ä¿å˜ä½ç½®ã€‚" +msgstr "%sä¸å˜åœ¨ï¼è«‹æŒ‡å®šæ–°çš„儲å˜ä½ç½®ã€‚" #: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." -msgstr "ç›®å‰çš„å ´æ™¯ç„¡æ ¹ç¯€é»žï¼Œä½†%d個被更改的外部資æºå·²è¢«ä¿å˜ã€‚" +msgstr "ç›®å‰çš„å ´æ™¯ç„¡æ ¹ç¯€é»žï¼Œä½†%d個被更改的外部資æºå·²è¢«å„²å˜ã€‚" #: editor/editor_node.cpp msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." -msgstr "å¿…é ˆæœ‰æ ¹ç¯€é»žæ‰å¯ä¿å˜å ´æ™¯ã€‚您å¯ä½¿ç”¨å ´æ™¯åœä½‡åˆ—ä»¥åŠ å…¥ä¸€å€‹æ ¹ç¯€é»žã€‚" +msgstr "å¿…é ˆæœ‰æ ¹ç¯€é»žæ‰å¯å„²å˜å ´æ™¯ã€‚您å¯ä½¿ç”¨å ´æ™¯åœä½‡åˆ—ä»¥åŠ å…¥ä¸€å€‹æ ¹ç¯€é»žã€‚" #: editor/editor_node.cpp msgid "Save Scene As..." @@ -4081,7 +3961,7 @@ msgstr "è«‹å…ˆé¸æ“‡ç¯€é»žä»¥åŸ·è¡Œè©²æ“作。" #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "尚未ä¿å˜ç›®å‰å ´æ™¯ã€‚ä»ç„¶è¦é–‹å•Ÿå—Žï¼Ÿ" +msgstr "尚未儲å˜ç›®å‰å ´æ™¯ã€‚ä»ç„¶è¦é–‹å•Ÿå—Žï¼Ÿ" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." @@ -4109,18 +3989,18 @@ msgstr "å–æ¶ˆå¾©åŽŸï¼š%s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "ç„¡æ³•é‡æ–°è¼‰å…¥å¾žæœªä¿å˜éŽçš„å ´æ™¯ã€‚" +msgstr "ç„¡æ³•é‡æ–°è¼‰å…¥å¾žæœªå„²å˜éŽçš„å ´æ™¯ã€‚" #: editor/editor_node.cpp msgid "Reload Saved Scene" -msgstr "釿–°è¼‰å…¥å·²ä¿å˜çš„å ´æ™¯" +msgstr "釿–°è¼‰å…¥å·²å„²å˜çš„å ´æ™¯" #: editor/editor_node.cpp msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" -"ç›®å‰å ´æ™¯æœ‰æœªä¿å˜çš„æ”¹å‹•。\n" +"ç›®å‰å ´æ™¯æœ‰æœªå„²å˜çš„æ”¹å‹•。\n" "ä»è¦é‡æ–°è¼‰å…¥å ´æ™¯å—Žï¼Ÿæ¤æ“作將無法復原。" #: editor/editor_node.cpp @@ -4144,21 +4024,20 @@ msgid "Open Project Manager?" msgstr "è¦é–‹å•Ÿå°ˆæ¡ˆç®¡ç†å“¡å—Žï¼Ÿ" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "退出å‰è¦å…ˆä¿å˜ä¸‹åˆ—å ´æ™¯å—Žï¼Ÿ" +msgstr "釿–°è¼‰å…¥å‰è¦å„²å˜ä¸‹åˆ—å ´æ™¯çš„è®Šæ›´å—Žï¼Ÿ" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "ä¿å˜ä¸¦é€€å‡º" +msgstr "儲å˜ä¸¦é€€å‡º" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "退出å‰è¦å…ˆä¿å˜ä¸‹åˆ—å ´æ™¯å—Žï¼Ÿ" +msgstr "退出å‰è¦å…ˆå„²å˜ä¸‹åˆ—å ´æ™¯å—Žï¼Ÿ" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before opening Project Manager?" -msgstr "開啟專案管ç†å“¡å‰è¦å…ˆä¿å˜ä»¥ä¸‹å ´æ™¯å—Žï¼Ÿ" +msgstr "開啟專案管ç†å“¡å‰è¦å…ˆå„²å˜ä»¥ä¸‹å ´æ™¯å—Žï¼Ÿ" #: editor/editor_node.cpp msgid "" @@ -4222,7 +4101,7 @@ msgid "" "open the scene, then save it inside the project path." msgstr "" "è¼‰å…¥å ´æ™¯æ™‚ç™¼ç”ŸéŒ¯èª¤ï¼Œå ´æ™¯å¿…é ˆç½®æ–¼å°ˆæ¡ˆè·¯å¾‘å…§ã€‚è«‹ä½¿ç”¨ [匯入] ä¾†é–‹å•Ÿè©²å ´æ™¯ï¼Œä¸¦å°‡" -"å…¶ä¿å˜æ–¼å°ˆæ¡ˆè·¯å¾‘內。" +"å…¶å„²å˜æ–¼å°ˆæ¡ˆè·¯å¾‘內。" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" @@ -4324,19 +4203,16 @@ msgstr "無法寫入檔案'%s',該檔案æ£è¢«ä½¿ç”¨ã€éŽ–å®šæˆ–å› æ¬Šé™ä¸è¶ #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Interface" -msgstr "使用者界é¢" +msgstr "界é¢" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "切æ›å ´æ™¯åˆ†é " +msgstr "å ´æ™¯åˆ†é " #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "æ°¸é é¡¯ç¤ºç¶²æ ¼" +msgstr "æ°¸é 顯示關閉按鈕" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" @@ -4351,14 +4227,12 @@ msgid "Output" msgstr "輸出" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "清除輸出" +msgstr "åŸ·è¡Œæ™‚æ°¸é æ¸…除輸出" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Open Output On Play" -msgstr "æ’æ”¾æ™‚æ°¸é 開啟輸出" +msgstr "執行時永é 開啟輸出" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" @@ -4366,41 +4240,35 @@ msgstr "åœæ¢æ™‚æ°¸é 關閉輸出" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "失去焦點時ä¿å˜" +msgstr "失去焦點時儲å˜" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "ä¿å˜åˆ†æ”¯ç‚ºå ´æ™¯" +msgstr "退出時儲å˜å„å ´æ™¯" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "檢視資訊" +msgstr "退出確èª" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "éš±è—æ›´æ–°æ—‹è½‰åœ–" +msgstr "顯示更新旋轉圖" #: editor/editor_node.cpp msgid "Update Continuously" msgstr "æŒçºŒæ›´æ–°" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "僅更新 Vital" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "本地化" +msgstr "在地化è¨å®š" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "TimeSeek 節點" +msgstr "載入時æ¢å¾©å ´æ™¯" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" @@ -4411,23 +4279,20 @@ msgid "Inspector" msgstr "å±¬æ€§é¢æ¿" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "專案路徑:" +msgstr "é è¨å±¬æ€§å稱樣å¼" #: editor/editor_node.cpp msgid "Default Float Step" msgstr "é è¨æµ®é»žæ•¸é–“éš”" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "å·²åœç”¨çš„æŒ‰éˆ•" +msgstr "åœç”¨æŠ˜ç–Š" #: editor/editor_node.cpp -#, fuzzy msgid "Auto Unfold Foreign Scenes" -msgstr "自動展開å°å¤–å ´æ™¯" +msgstr "è‡ªå‹•å±•é–‹å ´æ™¯" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" @@ -4438,14 +4303,12 @@ msgid "Horizontal Vector Types Editing" msgstr "æ°´å¹³Vector類別編輯" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "åœ¨å±¬æ€§é¢æ¿ä¸é–‹å•Ÿ" +msgstr "在目å‰çš„å±¬æ€§é¢æ¿æ‰“開資æº" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "åœ¨å±¬æ€§é¢æ¿ä¸é–‹å•Ÿ" +msgstr "åœ¨æ–°çš„å±¬æ€§é¢æ¿é–‹å•Ÿè³‡æº" #: editor/editor_node.cpp msgid "Default Color Picker Mode" @@ -4456,9 +4319,8 @@ msgid "Version Control" msgstr "版本控制" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "釿–°å‘½å" +msgstr "使用者å稱" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" @@ -4530,7 +4392,7 @@ msgstr "æœ€è¿‘é–‹å•Ÿçš„å ´æ™¯" #: editor/editor_node.cpp msgid "Save Scene" -msgstr "ä¿å˜å ´æ™¯" +msgstr "儲å˜å ´æ™¯" #: editor/editor_node.cpp msgid "Convert To..." @@ -4584,9 +4446,8 @@ msgid "Install Android Build Template..." msgstr "å®‰è£ Android 建置樣æ¿..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "開啟編輯器資料目錄" +msgstr "打開使用者資料資料夾" #: editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/tile_set_editor_plugin.cpp @@ -4662,12 +4523,10 @@ msgid "" msgstr "開啟該é¸é …å¾Œï¼Œå°Žèˆªç¶²æ ¼èˆ‡å¤šé‚Šå½¢å°‡åœ¨å°ˆæ¡ˆåŸ·è¡Œæ™‚å¯è¦‹ã€‚" #: editor/editor_node.cpp -#, fuzzy msgid "Force Shader Fallbacks" -msgstr "強制著色器回è½" +msgstr "強制著色器後備" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, shaders will be used in their fallback form " "(either visible via an ubershader or hidden) during all the run time.\n" @@ -4676,10 +4535,10 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" -"當該é¸é …啟用時,著色器將以回è½çš„形弿–¼åŸ·è¡Œæ™‚作用(é€éŽUbershader顯示或隱" +"啟用該é¸é …時,著色器在é‹è¡Œæ™‚會使用其後備形å¼ï¼ˆé€éŽ ubershader 顯示或隱" "è—)。\n" -"å¯ç”¨æ–¼é©—è‰å›žè½çš„外觀和效能,其在æ£å¸¸çš„æƒ…å½¢ä¸‹åªæœƒçŸæš«åœ°é¡¯ç¤ºã€‚\n" -"需啟用專案è¨å®šä¸çš„éžåŒæ¥è‘—色器編è¯ä»¥ä½¿è©²é¸é …ç™¼æ®æ•ˆæžœã€‚" +"å¯ç”¨æ–¼é©—è‰å¾Œå‚™å¤–觀和效能,æ£å¸¸æƒ…æ³ä¸‹åªæœƒçŸæš«é¡¯ç¤ºã€‚\n" +"å¿…é ˆåœ¨å°ˆæ¡ˆè¨å®šä¸å•Ÿç”¨éžåŒæ¥è‘—色器編è¯ï¼Œè©²é¸é …æ‰æœƒæœ‰æ•ˆæžœã€‚" #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -4706,7 +4565,7 @@ msgid "" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"開啟該é¸é …後,ä¿å˜è…³æœ¬æ™‚會於執行ä¸çš„éŠæˆ²å…§é‡æ–°è¼‰å…¥è…³æœ¬ã€‚\n" +"開啟該é¸é …後,儲å˜è…³æœ¬æ™‚會於執行ä¸çš„éŠæˆ²å…§é‡æ–°è¼‰å…¥è…³æœ¬ã€‚\n" "若在é 端è£ç½®ä¸Šä½¿ç”¨ï¼Œå¯ä½¿ç”¨ç¶²è·¯æª”案系統 NFS 以ç²å¾—最佳效能。" #: editor/editor_node.cpp @@ -4824,17 +4683,15 @@ msgstr "更改視訊驅動程å¼éœ€è¦é‡æ–°å•Ÿå‹•編輯器。" #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp msgid "Save & Restart" -msgstr "ä¿å˜ä¸¦é‡æ–°å•Ÿå‹•" +msgstr "儲å˜ä¸¦é‡æ–°å•Ÿå‹•" #: editor/editor_node.cpp -#, fuzzy msgid "Update All Changes" -msgstr "更改時更新" +msgstr "更新所有變更" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Changes" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "æ›´æ–° Vital æ›´å‹•" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -4852,7 +4709,7 @@ msgstr "å±•é–‹åº•éƒ¨é¢æ¿" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "ä¸ä¿å˜" +msgstr "ä¸å„²å˜" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." @@ -4938,7 +4795,7 @@ msgstr "釿–°è¼‰å…¥" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "釿–°ä¿å˜" +msgstr "釿–°å„²å˜" #: editor/editor_node.cpp msgid "New Inherited" @@ -5090,14 +4947,12 @@ msgid "Debugger" msgstr "除錯工具" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame History Size" -msgstr "效能分æžå·¥å…·å¹€æ•¸æ·å²æ—¥èªŒå¤§å°" +msgstr "分æžå·¥å…·å½±æ ¼æ·å²å¤§å°" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "釿–°å‘½å函å¼" +msgstr "分æžå·¥å…·å½±æ ¼æœ€å¤§å‡½å¼æ•¸" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5136,7 +4991,7 @@ msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." msgstr "" -"無法為欲ä¿å˜æˆæª”案之資æºå»ºç«‹ ViewportTexture。\n" +"ç„¡æ³•ç‚ºæ¬²å„²å˜æˆæª”案之資æºå»ºç«‹ ViewportTexture。\n" "資æºå¿…é ˆå±¬æ–¼ä¸€å€‹å ´æ™¯ã€‚" #: editor/editor_properties.cpp @@ -5164,9 +5019,8 @@ msgid "Size:" msgstr "大å°ï¼š" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "é : " +msgstr "é :" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5226,20 +5080,17 @@ msgstr "新增 %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "更改基礎型別" +msgstr "基礎型別" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "新增資æº" +msgstr "已經編輯資" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" -msgstr "å¯ç·¨è¼¯çš„é …ç›®" +msgstr "å¯ç·¨è¼¯" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" @@ -5250,9 +5101,8 @@ msgid "Extend Script" msgstr "擴充腳本" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "腳本å稱:" +msgstr "腳本所有者" #: editor/editor_run_native.cpp msgid "" @@ -5264,9 +5114,8 @@ msgstr "" "請在 [匯出] é¸å–®ä¸æ–°å¢žä¸€å€‹å¯åŸ·è¡Œçš„é è¨è¨å®šï¼Œæˆ–å°‡ç¾æœ‰çš„é è¨è¨å®šè¨ç‚ºå¯åŸ·è¡Œã€‚" #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "專案" +msgstr "執行專案" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5293,21 +5142,18 @@ msgid "Did you forget the '_run' method?" msgstr "æ˜¯å¦æœªæ–°å¢žã€Œ_runã€æ–¹æ³•?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "編輯器é…ç½®" +msgstr "編輯器語言" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "全部顯示" +msgstr "顯示縮放" #: editor/editor_settings.cpp msgid "Custom Display Scale" msgstr "自訂顯示縮放" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font Size" msgstr "主è¦å—體大å°" @@ -5324,32 +5170,28 @@ msgid "Font Hinting" msgstr "å—體微調" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "ä¸»å ´æ™¯" +msgstr "主è¦å—é«”" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "主è¦å—體粗體" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "æ–°å¢žç¯€é»žé ‚é»ž" +msgstr "程å¼ç¢¼å—é«”" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" msgstr "å°è©±æ¡†å½ˆå‡ºæ™‚使編輯器變暗" #: editor/editor_settings.cpp main/main.cpp -#, fuzzy msgid "Low Processor Mode Sleep (µsec)" -msgstr "低處ç†å™¨ä½¿ç”¨æ¨¡å¼ç¡çœ (微秒)" +msgstr "低處ç†å™¨ç¡çœ 模å¼ï¼ˆå¾®ç§’)" #: editor/editor_settings.cpp -#, fuzzy msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "éžèšç„¦ä½Žè™•ç†å™¨ä½¿ç”¨æ¨¡å¼ç¡çœ (微秒)" +msgstr "未èšç„¦ä½Žè™•ç†å™¨ç¡çœ 模å¼ï¼ˆå¾®ç§’)" #: editor/editor_settings.cpp #, fuzzy @@ -5361,9 +5203,8 @@ msgid "Automatically Open Screenshots" msgstr "自動開啟截圖" #: editor/editor_settings.cpp -#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "æ¯é 最大陣列å—å…¸é …ç›®æ•¸" +msgstr "æ¯é 最大陣列å—å…¸ç‰©å“æ•¸" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5380,131 +5221,108 @@ msgid "Icon And Font Color" msgstr "圖標åŠå—é«”é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "é¡è‰²" +msgstr "基礎é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "鏿“‡é¡è‰²" +msgstr "強調é¡è‰²" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" msgstr "å°æ¯”" #: editor/editor_settings.cpp -#, fuzzy msgid "Relationship Line Opacity" msgstr "關係線ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "æ£åœ¨ä¿å˜å…‰ç…§åœ–" +msgstr "çªé¡¯é¸é …å¡" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "邊界åƒç´ " +msgstr "邊框大å°" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" msgstr "使用圖形節點標題" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "é‡è¤‡å‹•ç•«" +msgstr "é¡å¤–é–“è·" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "編輯器主題" +msgstr "自訂主題" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "滾輪å‘峿Œ‰éµ" +msgstr "顯示腳本按鈕" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" msgstr "æ–¹å‘" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "專案路徑:" +msgstr "自動掃æå°ˆæ¡ˆè·¯å¾‘" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "專案路徑:" +msgstr "é è¨å°ˆæ¡ˆè·¯å¾‘" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "ä¿å˜" +msgstr "å„²å˜æ™‚" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "複製資æº" +msgstr "壓縮二進ä½è³‡æº" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" -msgstr "備份時安全ä¿å˜å¾Œé‡æ–°å‘½å" +msgstr "備份時安全儲å˜å¾Œé‡æ–°å‘½å" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "XForm å°è©±æ¡†" +msgstr "檔案å°è©±æ¡†" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "縮圖…" +msgstr "縮圖大å°" #: editor/editor_settings.cpp -#, fuzzy msgid "Docks" -msgstr "功能介é¢" +msgstr "颿¿" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "æ£åœ¨ç·¨è¼¯å ´æ™¯æ¨¹" +msgstr "å ´æ™¯æ¨¹" #: editor/editor_settings.cpp -#, fuzzy msgid "Start Create Dialog Fully Expanded" -msgstr "開始新建完全展開å°è©±" +msgstr "é è¨å®Œå…¨å±•開建立å°è©±æ¡†" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "æ°¸é é¡¯ç¤ºç¶²æ ¼" +msgstr "æ°¸é 顯示資料夾" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "群組編輯器" +msgstr "屬性編輯器" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Refresh Interval" -msgstr "自動刷新間隔" +msgstr "è‡ªå‹•æ›´æ–°é »çŽ‡" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "å資æº" +msgstr "å資æºå½©è‰²é¡¯ç¤º" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "編輯器主題" +msgstr "é¡è‰²ä¸»é¡Œ" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5513,52 +5331,44 @@ msgstr "行間è·" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "呿€§å…‰ç…§" +msgstr "çªå‡ºé¡¯ç¤º" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "高亮顯示語法" +msgstr "語法çªå‡ºé¡¯ç¤º" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" msgstr "凸顯所有符åˆé …ç›®" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Highlight Current Line" -msgstr "凸顯目å‰è¡Œ" +msgstr "çªé¡¯ç›®å‰è¡Œ" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Highlight Type Safe Lines" msgstr "凸顯型別安全的行" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "å‘左縮排" +msgstr "縮排" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "自動縮排" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "轉æ›ç¸®æŽ’為空白" +msgstr "å„²å˜æ™‚轉æ›ç¸®æŽ’" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "繪製呼å«ï¼š" +msgstr "繪製分é " #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "繪製呼å«ï¼š" +msgstr "ç¹ªè£½ç©ºæ ¼" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5576,42 +5386,36 @@ msgid "V Scroll Speed" msgstr "垂直滾動速度" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "顯示原點" +msgstr "é¡¯ç¤ºè¿·ä½ åœ°åœ–" #: editor/editor_settings.cpp msgid "Minimap Width" msgstr "è¿·ä½ åœ°åœ–å¯¬åº¦" #: editor/editor_settings.cpp -#, fuzzy msgid "Mouse Extra Buttons Navigate History" -msgstr "æ»‘é¼ é¡å¤–æŒ‰éµæ“作æ·å²ç´€éŒ„" +msgstr "使用é¡å¤–æ»‘é¼ æŒ‰éµæŸ¥çœ‹æ·å²" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "鏿“‡ç¶²æ ¼åœ°åœ–" +msgstr "æ‹–ç§»é¸æ“‡çš„æª”案" #: editor/editor_settings.cpp msgid "Appearance" msgstr "外觀" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "行號:" +msgstr "顯示行號" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "行號:" +msgstr "行號æ¸é›¶" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Bookmark Gutter" -msgstr "顯示書籤欄ä½" +msgstr "顯示書籤欄" #: editor/editor_settings.cpp #, fuzzy @@ -5619,44 +5423,38 @@ msgid "Show Breakpoint Gutter" msgstr "è·³éŽä¸æ–·é»ž" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Info Gutter" -msgstr "顯示資訊欄ä½" +msgstr "顯示資訊欄" #: editor/editor_settings.cpp msgid "Code Folding" msgstr "程å¼ç¢¼æŠ˜ç–Š" #: editor/editor_settings.cpp -#, fuzzy msgid "Word Wrap" -msgstr "æ›è¡Œ" +msgstr "自動æ›è¡Œ" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" msgstr "顯示行長度åƒè€ƒç·š" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Length Guideline Soft Column" -msgstr "行長度åƒè€ƒç·šè»Ÿåˆ—" +msgstr "行長度åƒè€ƒç·šè»Ÿåˆ—數" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Length Guideline Hard Column" -msgstr "行長度åƒè€ƒç·šç¡¬åˆ—" +msgstr "行長度åƒè€ƒç·šç¡¬åˆ—數" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "腳本編輯器" +msgstr "腳本列表" #: editor/editor_settings.cpp msgid "Show Members Overview" msgstr "顯示æˆå“¡æ¦‚è¦" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" msgstr "檔案" @@ -5667,7 +5465,7 @@ msgstr "移除後方空白å—å…ƒ" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "自動ä¿å˜é–“隔秒數" +msgstr "自動儲å˜é–“隔秒數" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" @@ -5675,11 +5473,11 @@ msgstr "載入時æ¢å¾©è…³æœ¬" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" -msgstr "" +msgstr "å„²å˜æ™‚è‡ªå‹•é‡æ–°è¼‰å…¥èˆ‡è§£æžè…³æœ¬" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "å¾žå¤–éƒ¨æ›´æ”¹æ™‚è‡ªå‹•é‡æ–°è¼‰å…¥è…³æœ¬" #: editor/editor_settings.cpp msgid "Create Signal Callbacks" @@ -5694,14 +5492,12 @@ msgid "Cursor" msgstr "游標" #: editor/editor_settings.cpp -#, fuzzy msgid "Scroll Past End Of File" -msgstr "æ»¾å‹•è¶…éŽæª”案çµå°¾" +msgstr "æ»¾å‹•è¶…éŽæª”案末尾" #: editor/editor_settings.cpp -#, fuzzy msgid "Block Caret" -msgstr "方形æ’入符" +msgstr "方形 Caret" #: editor/editor_settings.cpp msgid "Caret Blink" @@ -5719,7 +5515,6 @@ msgstr "å³éµé»žæ“Šä»¥æ–°å¢žæŽ§åˆ¶é»ž" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion" msgstr "自動完æˆ" @@ -5728,22 +5523,20 @@ msgid "Idle Parse Delay" msgstr "閒置解æžå»¶é²" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Brace Complete" msgstr "自動補齊括號" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Complete Delay" -msgstr "程å¼ç¢¼å®Œæˆå»¶é²" +msgstr "程å¼ç¢¼è‡ªå‹•完æˆå»¶é²" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "å°‡å‘¼å«æç¤ºå·¥å…·æç¤ºæ¡†ç½®æ–¼ç•¶å‰è¡Œä¹‹ä¸‹" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "å‘¼å«æç¤ºå·¥å…·æç¤ºæ¡†åç§»é‡" #: editor/editor_settings.cpp #, fuzzy @@ -5751,80 +5544,71 @@ msgid "Complete File Paths" msgstr "複製節點路徑" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "新增類別" +msgstr "新增類別æç¤º" #: editor/editor_settings.cpp msgid "Use Single Quotes" msgstr "使用單引號" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Help Index" -msgstr "顯示輔助資訊" +msgstr "顯示輔助索引" #: editor/editor_settings.cpp msgid "Help Font Size" -msgstr "" +msgstr "幫助å—體大å°" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "" +msgstr "幫助æºå—體大å°" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "" +msgstr "幫助標題å—體大å°" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" msgstr "ç¶²æ ¼åœ°åœ–" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "拾å–è·é›¢" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "é 覽" +msgstr "é 覽大å°" #: editor/editor_settings.cpp msgid "Primary Grid Color" -msgstr "" +msgstr "主è¦ç¶²æ ¼é¡è‰²" #: editor/editor_settings.cpp msgid "Secondary Grid Color" -msgstr "" +msgstr "次è¦ç¶²æ ¼é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Selection Box Color" -msgstr "僅æœå°‹æ‰€é¸å€åŸŸ" +msgstr "所é¸å€åŸŸé¡è‰²" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "3D Gizmos" -msgstr "Gizmo" +msgstr "3D æŽ§åˆ¶é …" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Gizmo Colors" -msgstr "發射色彩" +msgstr "æŽ§åˆ¶é …é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Instanced" -msgstr "實體" +msgstr "已實體化" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "點" +msgstr "交點" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5833,110 +5617,95 @@ msgstr "點" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "形狀" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "ç¶²æ ¼å¤§å°ï¼š" +msgstr "ä¸»ç¶²æ ¼æ¥é•·" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "ç¶²æ ¼å¤§å°ï¼š" +msgstr "ç¶²æ ¼å¤§å°" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "ç¶²æ ¼åŠƒåˆ†ç´šåˆ¥æœ€å¤§å€¼" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "ç¶²æ ¼åŠƒåˆ†ç´šåˆ¥æœ€å°å€¼" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "ç¶²æ ¼åŠƒåˆ†ç´šåˆ¥å差值" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "ç¶²æ ¼åœ°åœ–ç¹ªåœ–" +msgstr "ç¶²æ ¼XZå¹³é¢" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "ç¶²æ ¼åœ°åœ–ç¹ªåœ–" +msgstr "ç¶²æ ¼XYå¹³é¢" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "ç¶²æ ¼åœ°åœ–ç¹ªåœ–" +msgstr "ç¶²æ ¼YZå¹³é¢" #: editor/editor_settings.cpp -#, fuzzy msgid "Default FOV" -msgstr "é è¨" +msgstr "é è¨FOV" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Near" -msgstr "é è¨ä¸»é¡Œ" +msgstr "é è¨Z近處" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Far" -msgstr "é è¨" +msgstr "é è¨Zé 處" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "光照圖烘焙ä¸å¤®è™•ç†å™¨ç·šç¨‹æ•¸" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "導航模å¼" +msgstr "導引模å¼" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert Y Axis" -msgstr "編輯 Y 軸" +msgstr "翻轉 Y 軸" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert X Axis" -msgstr "編輯 X 軸" +msgstr "翻轉 X 軸" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Style" -msgstr "縮å°" +msgstr "縮放樣å¼" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "模擬數å—éµç›¤" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "æ¨¡æ“¬ä¸‰éµæ»‘é¼ " #: editor/editor_settings.cpp -#, fuzzy msgid "Orbit Modifier" -msgstr "按最早修改時間排åº" +msgstr "軌é“修改器" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "平移模å¼" +msgstr "平移修改器" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Modifier" -msgstr "已修改" +msgstr "縮放修改器" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "å½Žæ›²æ»‘é¼ å¹³ç§»" #: editor/editor_settings.cpp #, fuzzy @@ -5945,235 +5714,205 @@ msgstr "導航模å¼" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "軌é“éˆæ•度" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "è»Œé“æ…£æ€§" #: editor/editor_settings.cpp -#, fuzzy msgid "Translation Inertia" -msgstr "ç¿»è¯" +msgstr "平移慣性" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Inertia" -msgstr "放大" +msgstr "變焦慣性" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "自由視圖 上" +msgstr "自由觀看" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "å»ºç«‹å°Žèˆªç¶²æ ¼" +msgstr "自由觀看ç€è¦½æ¨¡å¼" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "自由視圖 å·¦" +msgstr "è‡ªç”±è§€çœ‹éˆæ•度" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "自由視圖 å·¦" +msgstr "自由觀看慣性" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "åŠ é€Ÿè‡ªç”±è¦–åœ–é€Ÿåº¦" +msgstr "自由觀看基本速度" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "放慢自由視圖速度" +msgstr "自由觀看啟動修飾符" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Speed Zoom Link" -msgstr "åŠ é€Ÿè‡ªç”±è¦–åœ–é€Ÿåº¦" +msgstr "自由觀看速度縮放連çµ" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Grid Color" -msgstr "鏿“‡é¡è‰²" +msgstr "ç¶²æ ¼é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Guides Color" -msgstr "鏿“‡é¡è‰²" +msgstr "åƒè€ƒç·šé¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Smart Snapping Line Color" -msgstr "智慧型å¸é™„" +msgstr "æ™ºæ…§æ•æ‰ç·šé¡è‰²" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "骨骼寬度" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 1" -msgstr "釿–°å‘½åé¡è‰²é …ç›®" +msgstr "骨骼é¡è‰²1" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 2" -msgstr "釿–°å‘½åé¡è‰²é …ç›®" +msgstr "骨骼é¡è‰²2" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "è¨å®šæ‰€é¸ä¹‹è¨å®šæª”:" +msgstr "所é¸ä¹‹éª¨éª¼é¡è‰²" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "骨骼IKé¡è‰²" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "骨骼輪廓é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "輪廓尺寸:" +msgstr "骨骼輪廓大å°" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "檢視å€é‚Šæ¡†é¡è‰²" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "é™åˆ¶ç·¨è¼¯å™¨è¦–圖" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "簡易平移" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "滾動以平移" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Speed" -msgstr "速度:" +msgstr "平移速度" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Poly Editor" -msgstr "Polygon2D UV 編輯器" +msgstr "多邊形編輯器" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "點抓å–åŠå¾‘" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "上一個平é¢" +msgstr "顯示上一個大綱" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Autorename Animation Tracks" -msgstr "釿–°å‘½åå‹•ç•«" +msgstr "è‡ªå‹•é‡æ–°å‘½å動畫軌é“" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "é è¨å»ºç«‹è²èŒ²è»Œé“" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Create Reset Tracks" -msgstr "貼上關éµç•«æ ¼" +msgstr "é è¨å»ºç«‹é‡ç½®è»Œé“" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" -msgstr "" +msgstr "洋蔥層先å‰é¡è‰²" #: editor/editor_settings.cpp msgid "Onion Layers Future Color" -msgstr "" +msgstr "洋蔥層未來é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Visual Editors" -msgstr "群組編輯器" +msgstr "視覺化編輯器" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "è¿·ä½ åœ°åœ–ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "視窗擺放" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "全矩形" +msgstr "矩形" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "è¨å®šæ›²ç·šå¤–控制點ä½ç½®" +msgstr "矩形自定義ä½ç½®" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "螢幕" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Save" -msgstr "自動剪è£" +msgstr "自動ä¿å˜" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "執行å‰å…ˆä¿å˜å ´æ™¯..." +msgstr "執行å‰å„²å˜" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Size" -msgstr "å‰è¦–圖" +msgstr "å—體大å°" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" -msgstr "é 端 " +msgstr "é 端主機" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "移除控制點" +msgstr "é 端阜" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "編輯器è¨å®š" +msgstr "編輯SSLèªè‰" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "HTTP 代ç†ç¨‹å¼" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "主機" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "é€£æŽ¥åŸ " #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6182,55 +5921,50 @@ msgstr "專案管ç†å“¡" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "釿–°å‘½å資料夾:" +msgstr "æŽ’åºæ–¹å¼" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "符號é¡è‰²" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "é—œéµå—é¡è‰²" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "控制æµé—œéµå—é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "更改基礎型別" +msgstr "基礎型別é¡è‰²" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "引擎類別é¡è‰²" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "使用者類別é¡è‰²" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "註解é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "å„²å˜æª”案:" +msgstr "å—串é¡è‰²" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "無效的背景é¡è‰²ã€‚" +msgstr "背景é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "無效的背景é¡è‰²ã€‚" +msgstr "自動補全背景é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6239,128 +5973,111 @@ msgstr "匯入所é¸" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "完æˆå˜åœ¨ä¸é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "å®Œæˆæ»¾å‹•é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "完æˆå—åž‹é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "下一個地æ¿" +msgstr "æ–‡å—é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "行號:" +msgstr "行號é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "行號:" +msgstr "安全行號é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "跳脫å—å…ƒé¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "無效的背景é¡è‰²ã€‚" +msgstr "跳脫å—元背景é¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "刪除所é¸" +msgstr "æ‰€é¸æ–‡å—é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "僅æœå°‹æ‰€é¸å€åŸŸ" +msgstr "所é¸é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "大括號ä¸å°ç¨±é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "ç›®å‰å ´æ™¯" +msgstr "ç›®å‰è¡Œé¡è‰²" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "線長導引é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "高亮顯示語法" +msgstr "å–®å—醒目顯示é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "數å—é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "函å¼" +msgstr "函å¼é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "釿–°å‘½å變數" +msgstr "æˆå“¡è®Šæ•¸é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "鏿“‡é¡è‰²" +msgstr "標記é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "書籤" +msgstr "書籤é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "䏿–·é»ž" +msgstr "䏿–·é»žé¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "執行列é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "程å¼ç¢¼æ‘ºç–Šé¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "æœå°‹çµæžœ" +msgstr "æœå°‹çµæžœé¡è‰²" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "æœå°‹çµæžœ" +msgstr "æœå°‹çµæžœé‚Šç•Œé¡è‰²" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." msgstr "æŒ‰ä½ %s 以喿•´æ•¸ã€‚æŒ‰ä½ Shift 以進行更精確的更動。" #: editor/editor_spin_slider.cpp scene/gui/button.cpp -#, fuzzy msgid "Flat" -msgstr "å¹³é¢0" +msgstr "å¹³é¢" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "碰撞模å¼" +msgstr "éš±è—æ‹–曳æ¢" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6380,9 +6097,8 @@ msgstr "自節點ä¸åŒ¯å…¥ï¼š" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "錯誤" +msgstr "%s 錯誤" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -6646,13 +6362,13 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "檔案伺æœå™¨" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp #: platform/uwp/export/export.cpp platform/windows/export/export.cpp msgid "Password" -msgstr "" +msgstr "密碼" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -6710,6 +6426,9 @@ msgid "" "After renaming to an unknown extension, the file won't be shown in the " "editor anymore." msgstr "" +"編輯器無法辨è˜è©²æª”案副檔å。\n" +"å¦‚æžœä½ ä»è¦é‡æ–°å‘½å,請使用系統的檔案管ç†å“¡ã€‚\n" +"釿–°å‘½å為未知副檔åå¾Œï¼Œè©²æª”æ¡ˆä¸æœƒåœ¨ç·¨è¼¯å™¨ä¸é¡¯ç¤ºã€‚" #: editor/filesystem_dock.cpp msgid "" @@ -6929,14 +6648,12 @@ msgid "Replace..." msgstr "å–代..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "å–代全部" +msgstr "在檔案ä¸å–代" #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "å–代全部" +msgstr "å–代全部(ä¸å¯å¾©åŽŸï¼‰" #: editor/find_in_files.cpp msgid "Searching..." @@ -7009,21 +6726,20 @@ msgstr "管ç†ç¾¤çµ„" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "使用環境通é“" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "建立資料夾" +msgstr "從æŸè™•建立" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "臨界值" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7036,16 +6752,15 @@ msgstr "元件" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "分隔符號" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "é¡è‰²å‡½å¼ã€‚" +msgstr "é¡è‰²æ ¡æ£" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "å‡è¨æ˜¯RGBä¸ä½¿ç”¨BPTC" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7053,36 +6768,34 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "旗標" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "é‡è¦†" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "篩é¸ï¼š" +msgstr "篩é¸" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "訊號" +msgstr "Mipmap" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "ç•°å‘æ€§" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7093,17 +6806,15 @@ msgstr "自動剪è£" #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Horizontal" -msgstr "水平:" +msgstr "æ°´å¹³" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Vertical" -msgstr "垂直:" +msgstr "垂直" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -7111,14 +6822,12 @@ msgid "Generate Tangents" msgstr "產生點" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "縮放模å¼" +msgstr "ç¸®æ”¾ç¶²æ ¼" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "å移:" +msgstr "Mesh åç§»" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -7127,9 +6836,8 @@ msgid "Octahedral Compression" msgstr "è¨å®šè¡¨ç¤ºå¼" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "大å°ï¼š " +msgstr "優化 Mesh 標誌" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7173,51 +6881,42 @@ msgstr "åŒ¯å…¥ç‚ºå¤šå€‹å ´æ™¯ + ç´ æ" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" msgstr "節點" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "æˆå“¡åž‹åˆ¥" +msgstr "æ ¹åž‹åˆ¥" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "é 端 " +msgstr "æ ¹å稱" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "縮放" +msgstr "æ ¹ç¸®æ”¾" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "剪下節點" +msgstr "自訂腳本" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "å„²å˜æª”案:" +msgstr "儲å˜" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "使用既有å稱" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "æè³ª" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "釿–°åŒ¯å…¥" +msgstr "ä¿æŒæˆ–釿–°åŒ¯å…¥" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" msgstr "ç¶²æ ¼" @@ -7227,9 +6926,8 @@ msgid "Ensure Tangents" msgstr "修改曲線切線" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Light Baking" -msgstr "烘焙光照圖" +msgstr "光照烘焙" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7238,7 +6936,7 @@ msgstr "烘焙光照圖" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Skin" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7246,16 +6944,14 @@ msgid "Use Named Skins" msgstr "使用縮放å¸é™„" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "開啟檔案" +msgstr "é¡å¤–檔案" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "å„²å˜æ–¼å目錄" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" msgstr "篩é¸è…³æœ¬" @@ -7265,9 +6961,8 @@ msgid "Keep Custom Tracks" msgstr "變æ›" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "最佳化" +msgstr "最佳化器" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7281,41 +6976,34 @@ msgstr "最佳化" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp #: scene/gui/rich_text_label.cpp scene/resources/curve.cpp #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Enabled" -msgstr "啟用" +msgstr "已啟用" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "最大線性誤差:" +msgstr "最大線性誤差" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "最大角度誤差:" +msgstr "最大角度誤差" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "數值" +msgstr "最大角度" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "刪除動畫軌" +msgstr "移除未使用的動畫軌" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" msgstr "動畫片段" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp #: scene/3d/particles.cpp scene/resources/environment.cpp -#, fuzzy msgid "Amount" -msgstr "數é‡ï¼š" +msgstr "數é‡" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7331,9 +7019,8 @@ msgid "Generating Lightmaps" msgstr "æ£åœ¨ç”¢ç”Ÿå…‰ç…§åœ–" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "æ£åœ¨ç”¢ç”Ÿç¶²æ ¼ï¼š " +msgstr "ç”Ÿæˆ Mesh ä¸ï¼š" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7364,159 +7051,144 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: 嵿¸¬åˆ°ä½¿ç”¨åœ¨3D上的法線貼圖。啟用紅-ç¶ æè³ªå£“縮來減少記憶體用é‡(è—色通é“å·²" +"è¢«æ¨æ£„)。" #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." -msgstr "" +msgstr "%s: 嵿¸¬åˆ°ä½¿ç”¨åœ¨3D上的æè³ªã€‚啟用濾é¡ã€é‡è¦†ã€Mipmap產生和VRAMæè³ªå£“縮。" #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2Dï¼Œåµæ¸¬3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "實體åƒç´ " +msgstr "2Dåƒç´ " #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "低å“質" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "鏿“‡æ¨¡å¼" +msgstr "HDR模å¼" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "法線貼圖" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Process" -msgstr "後處ç†" +msgstr "處ç†" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "ä¿®æ£Alpha邊界" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Premult Alpha" -msgstr "編輯多邊形" +msgstr "é 乘 Alpha" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr作為SRGB" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Invert Color" -msgstr "é ‚é»ž" +msgstr "翻轉é¡è‰²" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "隨機縮放:" +msgstr "法線貼圖å轉 Y" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Size Limit" -msgstr "大å°ï¼š " +msgstr "大å°é™åˆ¶" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "嵿¸¬3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"注æ„,專案è¨å®šå…§å•Ÿç”¨äº†éžé©åˆçš„PC VRAMå£“ç¸®ã€‚æ¤æè³ªå°‡ç„¡æ³•åœ¨PC上æ£ç¢ºé¡¯ç¤ºã€‚" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "輪廓尺寸:" +msgstr "åˆé›†æª”案" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "匯出模å¼ï¼š" +msgstr "匯入模å¼" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Crop To Region" -msgstr "鏿“‡åœ–塊å€åŸŸ" +msgstr "è£å‰ªè‡³å€åŸŸ" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "從å€åŸŸç°¡åŒ–Alpha邊界" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "來æºç¶²æ ¼ï¼š" +msgstr "強制" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8ä½å…ƒçµ„" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Mono" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate" -msgstr "Mix 節點" +msgstr "æœ€å¤§é »çŽ‡" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate Hz" -msgstr "Mix 節點" +msgstr "æœ€å¤§é »çŽ‡Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "簡化" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "æ ¼å¼" +msgstr "æ£è¦åŒ–" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "移動模å¼" +msgstr "é‡è¦†æ¨¡å¼" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "移動模å¼" +msgstr "é–‹å§‹é‡è¦†" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "移動模å¼" +msgstr "çµæŸé‡è¦†" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7567,7 +7239,7 @@ msgstr "匯入為:" #: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" -msgstr "ä¿å˜å ´æ™¯ã€é‡æ–°åŒ¯å…¥ã€ä¸¦é‡æ–°å•Ÿå‹•" +msgstr "儲å˜å ´æ™¯ã€é‡æ–°åŒ¯å…¥ã€ä¸¦é‡æ–°å•Ÿå‹•" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -7582,34 +7254,31 @@ msgstr "è¦å‘Šï¼šæœ‰ç´ æä½¿ç”¨è©²è³‡æºï¼Œå°‡ç„¡æ³•æ£ç¢ºåŠ è¼‰ã€‚" msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." -msgstr "" +msgstr "從檔案系統ä¸é¸æ“‡è³‡æºæª”ï¼Œæˆ–æ˜¯åœ¨é¢æ¿ä¸Šèª¿æ•´åŒ¯å…¥è¨å®šã€‚" #: editor/inspector_dock.cpp msgid "Failed to load resource." msgstr "åŠ è¼‰è³‡æºå¤±æ•—。" #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "專案å稱:" +msgstr "屬性å稱樣å¼" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" msgstr "原始" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" msgstr "首嗿¯å¤§å¯«" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "地å€" +msgstr "已本地化" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "ç›®å‰çš„èªžè¨€ä¸æ”¯æ´æœ¬åœ°åŒ–。" #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -7633,7 +7302,7 @@ msgstr "從ç£ç¢Ÿä¸è¼‰å…¥ç¾æœ‰çš„資æºä¸¦ç·¨è¼¯ã€‚" #: editor/inspector_dock.cpp msgid "Save the currently edited resource." -msgstr "ä¿å˜ç›®å‰ç·¨è¼¯çš„資æºã€‚" +msgstr "儲å˜ç›®å‰ç·¨è¼¯çš„資æºã€‚" #: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp @@ -8146,9 +7815,8 @@ msgid "New" msgstr "新增" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "%s 類別åƒç…§" +msgstr "複製為åƒç…§" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8337,9 +8005,8 @@ 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_state_machine_editor.cpp msgid "Play Mode:" @@ -8476,7 +8143,7 @@ msgstr "篩é¸..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "使用執行緒" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8524,7 +8191,7 @@ msgstr "è¦æ±‚失敗,回傳代碼:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Cannot save response to:" -msgstr "無法ä¿å˜å›žè¦†è‡³ï¼š" +msgstr "無法儲å˜å›žè¦†è‡³ï¼š" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." @@ -8603,9 +8270,8 @@ msgid "Download Error" msgstr "下載錯誤" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Available URLs" -msgstr "å¯ç”¨è¨å®šæª”:" +msgstr "å¯ç”¨ URL" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8640,28 +8306,24 @@ msgid "Loading..." msgstr "æ£åœ¨è¼‰å…¥..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" -msgstr "首é " +msgstr "第一個" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" -msgstr "上一é " +msgstr "上一個" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" -msgstr "下一é " +msgstr "下一個" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" -msgstr "最後" +msgstr "最後一個" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -8709,7 +8371,7 @@ msgstr "測試" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "無法å–得倉儲è¨å®šã€‚" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8724,8 +8386,8 @@ msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" -"無法判斷光照圖的ä¿å˜è·¯å¾‘。\n" -"è«‹ä¿å˜å ´æ™¯ä¸¦é‡è©¦ã€‚" +"無法判斷光照圖的儲å˜è·¯å¾‘。\n" +"請儲å˜å ´æ™¯ä¸¦é‡è©¦ã€‚" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -8760,7 +8422,7 @@ msgstr "烘焙光照圖" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "LightMap Bake" -msgstr "" +msgstr "光照貼圖烘培" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -9069,9 +8731,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+拖移:移動所é¸çš„節點。" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+拖移:移動所é¸çš„節點。" +msgstr "Alt+拖曳:縮放所é¸çš„節點。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -9202,9 +8863,8 @@ msgstr "在其ä½ç½®ä¸ŠéŽ–å®šæ‰€é¸ç‰©ä»¶ï¼ˆç„¡æ³•移動)。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "鎖定所é¸" +msgstr "鎖定所é¸çš„節點" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9213,9 +8873,8 @@ msgstr "解鎖所é¸ç‰©ä»¶ï¼ˆå¯ç§»å‹•)。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "å–æ¶ˆéŽ–å®šæ‰€é¸" +msgstr "å–æ¶ˆéŽ–å®šæ‰€é¸çš„節點" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9224,9 +8883,8 @@ msgstr "確ä¿ç‰©ä»¶çš„åç´šé …ç›®ç„¡æ³•è¢«é¸æ“‡ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "為所é¸çš„é …ç›®å»ºç«‹ç¾¤çµ„" +msgstr "為所é¸çš„節點建立群組" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9235,9 +8893,8 @@ msgstr "æ¢å¾©è®“物件的åç´šé …ç›®å¯é¸æ“‡ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "移除所é¸é …目的群組" +msgstr "å–æ¶ˆæ‰€é¸ç¯€é»žçš„群組" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -9262,23 +8919,20 @@ msgid "View" msgstr "檢視" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "é¡¯ç¤ºç¶²æ ¼" +msgstr "顯示" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "智慧型å¸é™„" +msgstr "ç•¶å¸é™„時顯示" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "éš±è—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid" -msgstr "åˆ‡æ›æ¨¡å¼" +msgstr "切æ›ç¶²æ ¼" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9556,7 +9210,7 @@ msgstr "å¹³é¢0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "" +msgstr "å¹³é¢ 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -9635,9 +9289,8 @@ msgid "Swap Gradient Fill Points" msgstr "" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "åˆ‡æ›æ¨¡å¼" +msgstr "切æ›ç¶²æ ¼å¸é™„" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9656,13 +9309,12 @@ msgstr "圖示" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "分隔:" +msgstr "分隔線" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -9891,9 +9543,8 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" -msgstr "ç¶²æ ¼åº«" +msgstr "ç¶²æ ¼è³‡æºåº«" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -9916,14 +9567,12 @@ msgid "Update from Scene" msgstr "è‡ªå ´æ™¯æ›´æ–°" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "套用MeshInstance變æ›" +msgstr "ä¸åŒ…å«è®Šæ›çš„套用" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "套用MeshInstance變æ›" +msgstr "包å«è®Šæ›çš„套用" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -10089,9 +9738,8 @@ msgid "Volume" msgstr "é«”ç©" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "發射æºï¼š " +msgstr "發射æºï¼š" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10522,7 +10170,7 @@ msgstr "清除最近的檔案" #: editor/plugins/script_editor_plugin.cpp msgid "Close and save changes?" -msgstr "關閉並ä¿å˜ä¿®æ”¹å—Žï¼Ÿ" +msgstr "關閉並儲å˜ä¿®æ”¹å—Žï¼Ÿ" #: editor/plugins/script_editor_plugin.cpp msgid "Error writing TextFile:" @@ -10595,7 +10243,7 @@ msgstr "ä¿å˜éŒ¯èª¤" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "ä¿å˜ä¸»é¡Œç‚º..." +msgstr "儲å˜ä¸»é¡Œç‚º..." #: editor/plugins/script_editor_plugin.cpp msgid "%s Class Reference" @@ -10662,7 +10310,7 @@ msgstr "釿–°æ‰“開關閉的腳本" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "全部ä¿å˜" +msgstr "全部儲å˜" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" @@ -10690,7 +10338,7 @@ msgstr "釿–°è¼‰å…¥ä¸»é¡Œ" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "ä¿å˜ä¸»é¡Œ" +msgstr "儲å˜ä¸»é¡Œ" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" @@ -10776,50 +10424,43 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "é¡å¤–çš„" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Use External Editor" -msgstr "使用外部編輯器進行除錯" +msgstr "使用外部編輯器" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Exec Path" -msgstr "匯出路徑" +msgstr "執行路徑" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script Temperature Enabled" -msgstr "鏿“‡æ¨£æ¿æª”案" +msgstr "啟用腳本樣å¼" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "強調顯示目å‰çš„腳本" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "無效的背景é¡è‰²ã€‚" +msgstr "ç›®å‰è…³æœ¬èƒŒæ™¯é¡è‰²" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Group Help Pages" -msgstr "為所é¸çš„é …ç›®å»ºç«‹ç¾¤çµ„" +msgstr "幫助é 分組" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort Scripts By" -msgstr "建立腳本" +msgstr "排åºè…³æœ¬æ ¹æ“š" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "腳本å稱:" +msgstr "將腳本å稱列為" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -10976,9 +10617,8 @@ msgid "Find in Files..." msgstr "åœ¨æª”æ¡ˆä¸æœå°‹..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "å–代..." +msgstr "在檔案ä¸å–代..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -11182,15 +10822,13 @@ msgstr "移動" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "縮放: " +msgstr "縮放:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" -msgstr "移動: " +msgstr "移動:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -11238,7 +10876,7 @@ msgstr "é ‚é»žï¼š" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s 毫秒)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -11338,13 +10976,12 @@ msgstr "效果é 覽" #: editor/plugins/spatial_editor_plugin.cpp msgid "(Not in GLES2)" -msgstr "" +msgstr "(ä¸åœ¨GLES2ä¸)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Debug draw modes are only available when using the GLES3 renderer, not GLES2." -msgstr "使用 GLES2 算繪引擎時無法使用。" +msgstr "除錯繪製模å¼åƒ…在使用 GLES3 算繪引擎時å¯ç”¨ï¼ŒGLES2 ä¸å¯ç”¨ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -11507,16 +11144,15 @@ msgstr "開啟ï¼é—œé–‰è‡ªç”±è¦–圖" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "減少å¯è¦–範åœ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "å¢žåŠ å¯è¦–範åœ" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "é‡è¨ç‚ºé è¨å€¼" +msgstr "é‡è¨ç‚ºé è¨è¦–野" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" @@ -11730,19 +11366,16 @@ msgid "Sprite" msgstr "拼åˆåœ–" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "簡化: " +msgstr "簡化:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "收縮(åƒç´ ): " +msgstr "收縮(åƒç´ ):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "擴展(åƒç´ ): " +msgstr "擴展(åƒç´ ):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -12288,9 +11921,8 @@ msgid "Available Node-based types:" msgstr "å¯ç”¨è¨å®šæª”:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "檔案å稱為空。" +msgstr "型別å稱為空ï¼" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -12987,9 +12619,8 @@ msgstr "å¸é™„é¸é …" #: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Offset" -msgstr "å移:" +msgstr "åç§»" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -13000,9 +12631,8 @@ msgstr "æ¥é•·" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "分隔:" +msgstr "é–“è·" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13021,16 +12651,14 @@ msgid "Texture" msgstr "純文å—" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "ç´‹ç†åç§»" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Material" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "æè³ª" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp @@ -13049,9 +12677,8 @@ msgid "Autotile Bitmask Mode" msgstr "優先模å¼" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "輪廓尺寸:" +msgstr "å圖塊大å°" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13069,9 +12696,8 @@ msgid "Navigation Offset" msgstr "導航模å¼" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "å移:" +msgstr "形狀åç§»" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13120,7 +12746,7 @@ msgstr "ç„¡å¯ç”¨çš„版本控制 (VCS) 擴充功能。" #: editor/plugins/version_control_editor_plugin.cpp msgid "" "Remote settings are empty. VCS features that use the network may not work." -msgstr "" +msgstr "é 端è¨å®šæ˜¯ç©ºçš„。使用網路的VCS功能æç„¡æ³•é‹ä½œã€‚" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13132,32 +12758,28 @@ msgid "Commit" msgstr "æäº¤" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "著色器變更:" +msgstr "æš«å˜è®Šæ›´" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "著色器變更:" +msgstr "未暫å˜è®Šæ›´" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "æäº¤" +msgstr "æäº¤ï¼š" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "日期:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "忍¹" +msgstr "副標題:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "ä½ ç¢ºå®šè¦ç§»é™¤ %s 分支?" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13184,34 +12806,31 @@ msgstr "移除控制點" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "鏿“‡SSH公鑰的路徑" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "鏿“‡SSHç§é‘°çš„路徑" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH 通關片段" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "嵿¸¬æ–°æ”¹å‹•" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "關閉並ä¿å˜ä¿®æ”¹å—Žï¼Ÿ" +msgstr "æ¨æ£„所有變更" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "æ£åœ¨å„²å˜è®Šæ›´..." +msgstr "é å˜æ‰€æœ‰è®Šæ›´" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "æ’¤éŠ·æš«å˜æ‰€æœ‰è®Šæ›´" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13229,12 +12848,11 @@ msgstr "æäº¤" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "簽入列表大å°" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "ç¬¦åˆæ¢ä»¶ï¼š" +msgstr "分支" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13248,7 +12866,7 @@ msgstr "刪除動畫軌" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "分支å稱" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13266,31 +12884,28 @@ msgid "Remove Remote" msgstr "ç§»é™¤é …ç›®" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "é 端 " +msgstr "é 端å稱" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "é 端 " +msgstr "é 端網å€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "æå–" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "拉é€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "推é€" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "來æºç¶²æ ¼ï¼š" +msgstr "強制推é€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -13310,12 +12925,11 @@ msgstr "æ ¼å¼æ›´æ”¹" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "未åˆä½µ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "檢視" +msgstr "檢視:" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -14304,28 +13918,24 @@ msgid "More Info..." msgstr "移動至..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "匯出 PCK/ZIP" +msgstr "匯出 PCK/ZIP..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "匯出專案" +msgstr "匯出專案..." #: editor/project_export.cpp msgid "Export All" msgstr "全部匯出" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "è«‹é¸æ“‡ä¸€å€‹ç©ºè³‡æ–™å¤¾ã€‚" +msgstr "鏿“‡åŒ¯å‡ºæ¨¡å¼ï¼š" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "全部匯出" +msgstr "全部匯出..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -14630,8 +14240,8 @@ msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" -"語言已更改。\n" -"界é¢å°‡æœƒåœ¨é‡æ–°å•Ÿå‹•編輯器或專案管ç†å“¡å¾Œæ›´æ–°ã€‚" +"語言已變更。\n" +"釿–°å•Ÿå‹•編輯器或專案管ç†å“¡å¾Œå°‡æœƒå¥—ç”¨ç•Œé¢æ›´æ–°ã€‚" #: editor/project_manager.cpp msgid "" @@ -14908,7 +14518,7 @@ msgstr "ä¿å˜è¨å®šæ™‚發生錯誤。" #: editor/project_settings_editor.cpp msgid "Settings saved OK." -msgstr "è¨å®šä¿å˜æˆåŠŸã€‚" +msgstr "è¨å®šå„²å˜æˆåŠŸã€‚" #: editor/project_settings_editor.cpp msgid "Moved Input Action Event" @@ -14992,7 +14602,7 @@ msgstr "索引:" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "本地化" +msgstr "在地化" #: editor/project_settings_editor.cpp msgid "Translations" @@ -15367,7 +14977,7 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" -"無法ä¿å˜ä½œç‚ºå¯¦é«”åŒ–å ´æ™¯çš„æ ¹ç¯€é»žåˆ†æ”¯ã€‚\n" +"無法儲å˜ä½œç‚ºå¯¦é«”åŒ–å ´æ™¯çš„æ ¹ç¯€é»žåˆ†æ”¯ã€‚\n" "請使用檔案系統åœä½‡åˆ—çš„å³éµé¸å–®ä¾†è¤‡è£½å®ƒï¼Œä»¥æ‹·è²ç›®å‰å ´æ™¯åŠ ä»¥ç·¨è¼¯ã€‚\n" "æˆ–æ˜¯ä½¿ç”¨å ´æ™¯ > æ–°å¢žç¹¼æ‰¿å ´æ™¯...ä»¥å»ºç«‹ä¸€å€‹ç¹¼æ‰¿å ´æ™¯ã€‚" @@ -15377,7 +14987,7 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" -"無法ä¿å˜å·²å¯¦é«”åŒ–å ´æ™¯çš„åˆ†æ”¯ã€‚\n" +"無法儲å˜å·²å¯¦é«”åŒ–å ´æ™¯çš„åˆ†æ”¯ã€‚\n" "è‹¥è¦å»ºç«‹å ´æ™¯è®Šé«”,您å¯ä½¿ç”¨å ´æ™¯ > æ–°å¢žç¹¼æ‰¿å ´æ™¯...æ ¹æ“šå¯¦é«”åŒ–çš„å ´æ™¯å»ºç«‹ä¸€å€‹ç¹¼æ‰¿" "å ´æ™¯ã€‚" @@ -15422,14 +15032,12 @@ msgid "Another node already uses this unique name in the scene." msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Enable Scene Unique Name" -msgstr "節點å稱:" +msgstr "å•Ÿç”¨å ´æ™¯ç¨ç«‹å稱" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy msgid "Disable Scene Unique Name" -msgstr "節點å稱:" +msgstr "åœç”¨å ´æ™¯ç¨ç«‹å稱" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15487,7 +15095,7 @@ msgstr "更改節點的型別" msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." -msgstr "無法ä¿å˜æ–°å ´æ™¯ã€‚å¯èƒ½æ˜¯ç”±æ–¼ç„¡æ³•滿足其ä¾è³´æ€§ï¼ˆå¯¦é«”)。" +msgstr "ç„¡æ³•å„²å˜æ–°å ´æ™¯ã€‚å¯èƒ½æ˜¯ç”±æ–¼ç„¡æ³•滿足其ä¾è³´æ€§ï¼ˆå¯¦é«”)。" #: editor/scene_tree_dock.cpp msgid "Error saving scene." @@ -15495,7 +15103,7 @@ msgstr "ä¿å˜å ´æ™¯æ™‚發生錯誤。" #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "è¤‡è£½å ´æ™¯ä»¥é€²è¡Œä¿å˜æ™‚發生錯誤。" +msgstr "è¤‡è£½å ´æ™¯ä»¥é€²è¡Œå„²å˜æ™‚發生錯誤。" #: editor/scene_tree_dock.cpp msgid "Sub-Resources" @@ -15552,7 +15160,7 @@ msgstr "åˆä½µè‡ªå ´æ™¯" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" -msgstr "ä¿å˜åˆ†æ”¯ç‚ºå ´æ™¯" +msgstr "儲å˜åˆ†æ”¯ç‚ºå ´æ™¯" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" @@ -15843,9 +15451,8 @@ msgid "Attach Node Script" msgstr "é™„åŠ ç¯€é»žè…³æœ¬" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "é 端 " +msgstr "é 端 %s:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -16297,9 +15904,8 @@ msgid "Driver" msgstr "" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "腳本å稱:" +msgstr "é©…å‹•å稱" #: main/main.cpp msgid "Fallback To GLES2" @@ -16384,9 +15990,8 @@ msgid "Physics FPS" msgstr "物ç†å½±æ ¼ %" #: main/main.cpp -#, fuzzy msgid "Force FPS" -msgstr "來æºç¶²æ ¼ï¼š" +msgstr "強制 FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" @@ -16500,9 +16105,8 @@ msgid "Fullsize" msgstr "" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "篩é¸ï¼š" +msgstr "使用篩é¸å™¨" #: main/main.cpp scene/resources/style_box.cpp #, fuzzy @@ -16549,9 +16153,8 @@ msgid "Custom Image Hotspot" msgstr "" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "旋轉åç§»é‡ï¼š" +msgstr "工具æç¤ºä½ç½®åç§»" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16564,9 +16167,8 @@ msgid "Wait For Debugger" msgstr "除錯工具" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait Timeout" -msgstr "逾時。" +msgstr "ç‰å¾…逾時" #: main/main.cpp msgid "Runtime" @@ -16680,14 +16282,12 @@ msgstr "轉æ›å¤§å°å¯«" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "åŠå¾‘:" +msgstr "åŠå¾‘" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Radial Segments" -msgstr "ä¸»å ´æ™¯å¼•æ•¸ï¼š" +msgstr "徑呿®µæ•¸" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -16756,9 +16356,8 @@ msgid "Path Simplify Angle" msgstr "" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "隨機旋轉:" +msgstr "路徑旋轉" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16771,14 +16370,12 @@ msgid "Path Continuous U" msgstr "連續" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "路徑 U è·é›¢" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Joined" -msgstr "隨機旋轉:" +msgstr "路徑接åˆ" #: modules/enet/networked_multiplayer_enet.cpp #, fuzzy @@ -16826,9 +16423,8 @@ msgid "Use FBX" msgstr "" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "å„²å˜æª”案:" +msgstr "組態檔案" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -16842,9 +16438,8 @@ msgid "Singleton" msgstr "骨架" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Symbol Prefix" -msgstr "å‰ç½®ï¼š" +msgstr "符號å‰ç¶´" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -16902,19 +16497,16 @@ msgid "Disabled GDNative Singleton" msgstr "ç¦ç”¨ GDNative 單例" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "函å¼åº«ï¼š " +msgstr "函å¼åº«ï¼š" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Class Name" -msgstr "類別å稱:" +msgstr "類別å稱" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "腳本å稱:" +msgstr "腳本類別" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy @@ -16993,9 +16585,8 @@ msgid "Object can't provide a length." msgstr "物件無法æä¾›é•·åº¦ã€‚" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Language Server" -msgstr "語言:" +msgstr "語言伺æœå™¨" #: modules/gdscript/language_server/gdscript_language_server.cpp #, fuzzy @@ -17024,9 +16615,8 @@ msgid "Buffer View" msgstr "後視圖" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "å—節åç§»" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17039,9 +16629,8 @@ msgid "Normalized" msgstr "æ ¼å¼" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Count" -msgstr "數é‡ï¼š" +msgstr "數é‡" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp #, fuzzy @@ -17067,9 +16656,8 @@ msgid "Sparse Indices Byte Offset" msgstr "" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "æ£åœ¨è§£æžå¤šé‚Šå½¢..." +msgstr "稀ç–é ‚é»žå…ƒä»¶åž‹åˆ¥" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -17099,9 +16687,8 @@ msgid "Indices" msgstr "所有è£ç½®" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "大å°ï¼š" +msgstr "FOV 大å°" #: modules/gltf/gltf_camera.cpp msgid "Zfar" @@ -17148,9 +16735,8 @@ msgid "Blend Weights" msgstr "烘焙光照圖" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Instance Materials" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "實體æè³ª" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp #, fuzzy @@ -17238,9 +16824,8 @@ msgid "Gloss Factor" msgstr "" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Specular Factor" -msgstr "ç´”é‡é‹ç®—å。" +msgstr "é¡é¢å射係數" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" @@ -17279,9 +16864,8 @@ msgid "Accessors" msgstr "" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Scene Name" -msgstr "å ´æ™¯è·¯å¾‘ï¼š" +msgstr "å ´æ™¯å稱" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17308,9 +16892,8 @@ msgid "Lights" msgstr "燈光" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Unique Animation Names" -msgstr "新增動畫å稱:" +msgstr "ç¨ç«‹å‹•ç•«å稱" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17323,9 +16906,8 @@ msgid "Skeleton To Node" msgstr "鏿“‡ä¸€å€‹ç¯€é»ž" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "動畫:" +msgstr "å‹•ç•«" #: modules/gltf/gltf_texture.cpp #, fuzzy @@ -17570,9 +17152,8 @@ msgstr "" #: modules/minimp3/resource_importer_mp3.cpp #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp -#, fuzzy msgid "Loop Offset" -msgstr "å移:" +msgstr "循環åç§»" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17691,9 +17272,8 @@ msgid "Seamless" msgstr "" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "As Normal Map" -msgstr "隨機縮放:" +msgstr "作為法線貼圖" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" @@ -17704,9 +17284,8 @@ msgid "Noise" msgstr "" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Noise Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "噪è²åç§»" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17735,9 +17314,8 @@ msgid "Names" msgstr "å稱" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "è¨å®šï¼š" +msgstr "å—串" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -17798,18 +17376,16 @@ msgid "" msgstr "回傳值需被指定為é‹ç®—è¨˜æ†¶é«”ç¯€é»žçš„ç¬¬ä¸€å€‹å…ƒç´ ï¼è«‹ä¿®æ£è©²ç¯€é»žã€‚" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "節點回傳了一個無效的連續輸出: " +msgstr "節點回傳了一個無效的åºåˆ—輸出:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" msgstr "發ç¾äº†é€£çºŒä½å…ƒ (Sequance Bit) 但並éžåœ¨å †ç–Šä¸çš„ç¯€é»žï¼Œè«‹å›žå ±è©²éŒ¯èª¤ï¼" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "å †ç–Šæ·±åº¦çš„å †ç–Šæº¢å‡ºï¼š " +msgstr "å †ç–Šæ·±åº¦çš„å †ç–Šæº¢å‡ºï¼š" #: modules/visual_script/visual_script.cpp #, fuzzy @@ -18176,18 +17752,16 @@ msgid "for (elem) in (input):" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "輸入型別éžå¯è¿ä»£åž‹åˆ¥ï¼š " +msgstr "輸入型別éžå¯è¿ä»£åž‹åˆ¥ï¼š" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "è¿ä»£å™¨å·²ä¸å¯ç”¨" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "è¿ä»£å™¨å·²ä¸å¯ç”¨ï¼š " +msgstr "è¿ä»£å™¨ç„¡æ•ˆï¼š" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18204,18 +17778,16 @@ msgid "Steps" msgstr "æ¥é•·" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "仰角:" +msgstr "切æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "類別:" +msgstr "型別轉æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -18261,9 +17833,8 @@ msgid "Use Default Args" msgstr "é‡è¨ç‚ºé è¨" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Validate" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "é©—è‰" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18355,19 +17926,16 @@ msgstr "調整陣列大å°" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "ç–ŠåŠ é‹ç®—å。" +msgstr "é‹ç®—å" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ": 無效的引數型別: " +msgstr "無效的引數型別:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": 無效的引數: " +msgstr "無效的引數:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18379,14 +17947,12 @@ msgid "Var Name" msgstr "å稱" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" -msgstr "è…³æœ¬ä¸æœªæ‰¾åˆ° VariableGet(å–得變數): " +msgstr "è…³æœ¬ä¸æœªæ‰¾åˆ° VariableGet(å–得變數):" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" -msgstr "è…³æœ¬ä¸æœªæ‰¾åˆ° VariableSet(è¨å®šè®Šæ•¸ï¼‰ï¼š " +msgstr "è…³æœ¬ä¸æœªæ‰¾åˆ° VariableSet(è¨å®šè®Šæ•¸ï¼‰ï¼š" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -18501,7 +18067,7 @@ msgstr "產生" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "ç‰å¾…" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -18606,9 +18172,8 @@ msgid "CA Chain" msgstr "清除 IK éˆ" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "逾時。" +msgstr "Handshake 逾時" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18616,14 +18181,12 @@ msgid "Session Mode" msgstr "å€åŸŸæ¨¡å¼" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Required Features" -msgstr "主è¦åŠŸèƒ½ï¼š" +msgstr "å¿…è¦ç‰¹æ€§" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Optional Features" -msgstr "主è¦åŠŸèƒ½ï¼š" +msgstr "å¯é¸ç‰¹æ€§" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18728,9 +18291,8 @@ msgid "Export Format" msgstr "匯出路徑" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Min SDK" -msgstr "輪廓尺寸:" +msgstr "æœ€å° SDK" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18785,9 +18347,8 @@ msgid "Package" msgstr "æ£åœ¨æ‰“包" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "節點å稱:" +msgstr "ç¨ç«‹å稱" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18795,9 +18356,8 @@ msgid "Signed" msgstr "訊號" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "類別å稱:" +msgstr "åˆ†é¡žç‚ºéŠæˆ²" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" @@ -18809,9 +18369,8 @@ msgid "Exclude From Recents" msgstr "刪除節點" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "圖形" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18881,9 +18440,8 @@ msgid "Command Line" msgstr "社群" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Extra Args" -msgstr "é¡å¤–呼å«å¼•數:" +msgstr "é¡å¤–引數" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19080,14 +18638,12 @@ msgid "Code Signing" msgstr "訊號" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"找ä¸åˆ°ã€Œapksigner'ã€ã€‚\n" -"è«‹ç¢ºèªæ¤å‘½ä»¤å¯ç”¨æ–¼Android SDK build-tools的目錄。\n" -"%s 未簽署。" +"找ä¸åˆ°ã€Œapksignerã€ã€‚請檢查 Android SDK çš„ build-tools è³‡æ–™å¤¾ä¸æ˜¯å¦æœ‰æ¤æŒ‡ä»¤ã€‚" +"「%sã€æœªç°½ç½²ã€‚" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19102,9 +18658,8 @@ msgid "Could not find keystore, unable to export." msgstr "找ä¸åˆ°é‡‘鑰儲å˜å€ï¼Œç„¡æ³•匯出。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "無法啟動å處ç†ç¨‹åºï¼" +msgstr "無法啟動 apksigner å¯åŸ·è¡Œæª”案。" #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19135,9 +18690,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "無效的檔案å稱ï¼Android APK å¿…é ˆè¦æœ‰ *.apk 副檔å。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "䏿”¯æ´çš„åŒ¯å‡ºæ ¼å¼ï¼\n" +msgstr "䏿”¯æ´çš„åŒ¯å‡ºæ ¼å¼ï¼" #: platform/android/export/export_plugin.cpp msgid "" @@ -19147,26 +18701,21 @@ msgstr "" "嘗試自自定建置樣æ¿é€²è¡Œå»ºç½®ï¼Œä½†ç„¡ç‰ˆæœ¬è³‡è¨Šå¯ç”¨ã€‚請自「專案ã€é¸å–®ä¸é‡æ–°å®‰è£ã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Android 建置版本ä¸ç¬¦åˆï¼š\n" -" 已安è£çš„æ¨£æ¿ï¼š%s\n" -" Godot 版本:%s\n" -"請自「專案ã€ç›®éŒ„ä¸é‡æ–°å®‰è£ Android 建置樣æ¿ã€‚" +"Android 建構版本ä¸åŒ¹é…ï¼šå·²å®‰è£æ¨¡æ¿ï¼š %s,Godot 版本:%s。請從專案é¸å–®é‡æ–°å®‰" +"è£ Android 構建模æ¿ã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." -msgstr "無法以專案å稱覆蓋檔案res://android/build/res/*.xml" +msgstr "無法以專案å稱覆蓋 res://android/build/res/*.xml 檔案。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "無法匯出專案檔至Gradle專案。\n" +msgstr "無法匯出專案檔至 Gradle 專案。" #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19177,13 +18726,12 @@ msgid "Building Android Project (gradle)" msgstr "建置 Android 專案(Gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"建置 Android 專案失敗,請檢查輸出以確èªéŒ¯èª¤ã€‚\n" -"也å¯ä»¥ç€è¦½ docs.godotengine.org 以ç€è¦½ Android 建置說明文件。" +"建置 Android 專案失敗,請檢查輸出以確èªéŒ¯èª¤ã€‚也å¯ä»¥ç€è¦½ docs.godotengine.org " +"檢視 Android 建置說明文件。" #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19196,39 +18744,33 @@ msgid "" msgstr "無法複製並更å匯出的檔案,請於 Gradle 專案資料夾內確èªè¼¸å‡ºã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "未找到套件:「%sã€" +msgstr "未找到套件:「%sã€ã€‚" #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "æ£åœ¨å»ºç«‹APK……" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"找ä¸åˆ°æ¨£æ¿APK以匯出:\n" -"%s" +msgstr "找ä¸åˆ° APK 模æ¿ä»¥åŒ¯å‡ºï¼šã€Œ%sã€ã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"éºå¤±æ‰€é¸å–架構(%s)的匯出樣æ¿å‡½å¼åº«ã€‚\n" -"請使用所有必è¦çš„函å¼åº«å»ºæ§‹æ¨£æ¿ï¼Œæˆ–在匯出é è¨è¨å®šä¸å–消勾é¸éºå¤±çš„æž¶æ§‹ã€‚" +"éºå¤±æ‰€é¸æž¶æ§‹ï¼ˆ%s)的匯出模æ¿å‡½å¼åº«ã€‚請使用所有必è¦çš„函å¼åº«å»ºæ§‹æ¨¡æ¿ï¼Œæˆ–在匯出" +"é è¨è¨å®šä¸å–消勾é¸éºå¤±çš„æž¶æ§‹ã€‚" #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "æ£åœ¨åŠ å…¥æª”æ¡ˆ %s……" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "無法匯出專案檔案" +msgstr "無法匯出專案檔。" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19324,9 +18866,8 @@ msgid "Code Sign Identity Release" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "匯出模å¼ï¼š" +msgstr "發行匯出模å¼" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19337,9 +18878,8 @@ msgid "Info" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "無效的è˜åˆ¥ç¬¦ï¼š" +msgstr "標è˜ç¬¦" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19363,14 +18903,12 @@ msgid "Capabilities" msgstr "貼上屬性" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "æˆåŠŸï¼" +msgstr "å˜å– Wi-Fi" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Push Notifications" -msgstr "隨機旋轉:" +msgstr "推é€é€šçŸ¥" #: platform/iphone/export/export.cpp #, fuzzy @@ -19502,19 +19040,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "在系統的é è¨ç€è¦½å™¨ä¸åŸ·è¡Œå·²åŒ¯å‡ºçš„ HTML。" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "無法開啟樣æ¿ä»¥è¼¸å‡ºï¼š" +msgstr "無法開啟模æ¿ä»¥åŒ¯å‡ºï¼šã€Œ%sã€ã€‚" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "無效的輸出樣æ¿ï¼š" +msgstr "無效的匯出模æ¿ï¼šã€Œ%sã€ã€‚" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "無法寫入檔案:" +msgstr "無法寫入檔案:「%sã€ã€‚" #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19522,18 +19057,16 @@ msgid "Icon Creation" msgstr "è¨å®šå¤–邊è·" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "ç„¡æ³•è®€å–æª”案:" +msgstr "ç„¡æ³•è®€å–æª”案:「%sã€ã€‚" #: platform/javascript/export/export.cpp msgid "PWA" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "分隔:" +msgstr "變體" #: platform/javascript/export/export.cpp #, fuzzy @@ -19605,19 +19138,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "無法讀å–HTML殼層:" +msgstr "ç„¡æ³•è®€å– HTML 殼層:「%sã€ã€‚" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "無法建立HTTP伺æœå™¨ç›®éŒ„:" +msgstr "無法建立 HTTP 伺æœå™¨ç›®éŒ„:%s。" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "啟動HTTP伺æœå™¨æ™‚發生錯誤:" +msgstr "啟動 HTTP 伺æœå™¨æ™‚發生錯誤:%d。" #: platform/javascript/export/export.cpp msgid "Web" @@ -19721,9 +19251,8 @@ msgid "Unknown object type." msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "分類:" +msgstr "App 分類" #: platform/osx/export/export.cpp msgid "High Res" @@ -19899,9 +19428,8 @@ msgid "Custom Options" msgstr "åŒ¯æµæŽ’é¸é …" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization" -msgstr "本地化" +msgstr "å…¬è‰" #: platform/osx/export/export.cpp msgid "Apple ID Name" @@ -19916,19 +19444,16 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "無法匯出專案檔案" +msgstr "無法開啟符號檔 「%sã€ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "無法啟動å處ç†ç¨‹åºï¼" +msgstr "無法啟動 xcrun å¯åŸ·è¡Œæª”案。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "本地化" +msgstr "å…¬è‰å¤±æ•—。" #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -19981,9 +19506,8 @@ msgid "No identity found." msgstr "未發ç¾ä»»ä½•圖示。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "無法ä¿å˜æª”案:%s" +msgstr "無法簽署檔案 %s。" #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -19995,9 +19519,8 @@ msgid "DMG Creation" msgstr "æ–¹å‘" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "無法啟動å處ç†ç¨‹åºï¼" +msgstr "無法啟動 hdiutil å¯åŸ·è¡Œæª”案。" #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20013,16 +19536,12 @@ msgid "Creating app bundle" msgstr "æ£åœ¨å»ºç«‹ç¸®åœ–" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "" -"找ä¸åˆ°æ¨£æ¿APK以匯出:\n" -"%s" +msgstr "找ä¸åˆ° app 模æ¿ä»¥åŒ¯å‡ºï¼šã€Œ%sã€ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "無效的輸出樣æ¿ï¼š" +msgstr "ç„¡æ•ˆçš„åŒ¯å‡ºæ ¼å¼ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -20078,9 +19597,8 @@ msgid "ZIP Creation" msgstr "專案" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "無法匯出專案檔至Gradle專案。\n" +msgstr "ç„¡æ³•æ‰“é–‹ä½æ–¼ã€Œ%sã€çš„æª”案進行讀å–。" #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20207,23 +19725,20 @@ msgid "Display Name" msgstr "全部顯示" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Short Name" -msgstr "腳本å稱:" +msgstr "çŸå稱" #: platform/uwp/export/export.cpp msgid "Publisher" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher Display Name" -msgstr "無效的套件發佈者顯示å稱。" +msgstr "發布者顯示å稱" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Product GUID" -msgstr "ç„¡æ•ˆçš„ç”¢å“ GUID。" +msgstr "ç”¢å“ GUID" #: platform/uwp/export/export.cpp #, fuzzy @@ -20236,9 +19751,8 @@ msgid "Signing" msgstr "訊號" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "é ‚é»žï¼š" +msgstr "憑è‰" #: platform/uwp/export/export.cpp #, fuzzy @@ -20306,9 +19820,8 @@ msgid "Wide 310 X 150 Logo" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Splash Screen" -msgstr "繪製呼å«ï¼š" +msgstr "啟動畫é¢" #: platform/uwp/export/export.cpp #, fuzzy @@ -20398,9 +19911,8 @@ msgid "Debug Algorithm" msgstr "除錯工具" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "無法移除臨時檔案:" +msgstr "ç„¡æ³•é‡æ–°å‘½åæ¨¡æ¿æª”案 「%sã€ã€‚" #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20426,19 +19938,16 @@ msgid "File Version" msgstr "版本" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Version" -msgstr "ç„¡æ•ˆçš„ç”¢å“ GUID。" +msgstr "產å“版本" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "節點å稱:" +msgstr "å…¬å¸å稱" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "專案å稱:" +msgstr "產å“å稱" #: platform/windows/export/export.cpp #, fuzzy @@ -20450,9 +19959,8 @@ msgid "Trademarks" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "隨機旋轉:" +msgstr "資æºä¿®æ”¹" #: platform/windows/export/export.cpp #, fuzzy @@ -20487,9 +19995,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "找ä¸åˆ°é‡‘鑰儲å˜å€ï¼Œç„¡æ³•匯出。" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "無效的è˜åˆ¥ç¬¦ï¼š" +msgstr "身份類型無效。" #: platform/windows/export/export.cpp #, fuzzy @@ -20509,9 +20016,8 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "無法移除臨時檔案:" +msgstr "ç„¡æ³•ç§»é™¤æ¨¡æ¿æª”案 「%sã€ã€‚" #: platform/windows/export/export.cpp msgid "" @@ -20520,19 +20026,16 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid icon path:" -msgstr "無效的路徑。" +msgstr "無效符號路徑:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid file version:" -msgstr "無效的副檔å。" +msgstr "無效的檔案版本:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid product version:" -msgstr "ç„¡æ•ˆçš„ç”¢å“ GUID。" +msgstr "無效的產å“版本:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." @@ -20701,9 +20204,8 @@ msgstr "" #: scene/3d/light.cpp scene/3d/reflection_probe.cpp #: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Max Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "最大è·é›¢" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20731,15 +20233,13 @@ msgid "Anchor Mode" msgstr "圖示模å¼" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "旋轉æ¥é•·ï¼š" +msgstr "旋轉" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Current" -msgstr "ç›®å‰ï¼š" +msgstr "ç›®å‰" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp #, fuzzy @@ -20821,14 +20321,12 @@ msgid "Drag Margin" msgstr "è¨å®šå¤–邊è·" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Screen" -msgstr "繪製呼å«ï¼š" +msgstr "繪製螢幕" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Limits" -msgstr "繪製呼å«ï¼š" +msgstr "繪製é™åˆ¶" #: scene/2d/camera_2d.cpp #, fuzzy @@ -21005,9 +20503,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Emitting" -msgstr "è¨å®šï¼š" +msgstr "發射" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -21033,9 +20530,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "éš¨æ©Ÿé‡æ–°é–‹å§‹ï¼ˆç§’):" +msgstr "隨機性" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21077,9 +20573,8 @@ msgstr "發射é®ç½©" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Sphere Radius" -msgstr "發射æºï¼š " +msgstr "çƒé«”åŠå¾‘" #: scene/2d/cpu_particles_2d.cpp #, fuzzy @@ -21147,9 +20642,8 @@ msgstr "線性" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel" -msgstr "æˆåŠŸï¼" +msgstr "åŠ é€Ÿåº¦" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21208,9 +20702,8 @@ msgid "Angle Curve" msgstr "關閉曲線" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" -msgstr "數é‡ï¼š" +msgstr "縮放é‡" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21234,27 +20727,23 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Hue Variation" -msgstr "分隔:" +msgstr "色相變化" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation" -msgstr "分隔:" +msgstr "變化" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Random" -msgstr "分隔:" +msgstr "隨機變化" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Curve" -msgstr "分隔:" +msgstr "變化曲線" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21270,9 +20759,8 @@ msgstr "拆分控制點" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Random" -msgstr "å移:" +msgstr "隨機åç§»" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21465,14 +20953,12 @@ msgid "Begin Cap Mode" msgstr "å€åŸŸæ¨¡å¼" #: scene/2d/line_2d.cpp -#, fuzzy msgid "End Cap Mode" -msgstr "å¸é™„模å¼ï¼š" +msgstr "尾端模å¼" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border" -msgstr "釿–°å‘½å資料夾:" +msgstr "邊框" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21499,9 +20985,8 @@ msgid "Cell Size" msgstr "" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp -#, fuzzy msgid "Edge Connection Margin" -msgstr "編輯連接內容:" +msgstr "邊界連接邊è·" #: scene/2d/navigation_2d.cpp msgid "" @@ -21516,18 +21001,16 @@ msgid "Pathfinding" msgstr "ç¶å®š" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Desired Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "路徑所需è·é›¢" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "路徑最大è·é›¢" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21553,9 +21036,8 @@ msgid "Time Horizon" msgstr "水平翻轉" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "速度:" +msgstr "最大速度" #: scene/2d/navigation_agent_2d.cpp msgid "" @@ -21597,24 +21079,21 @@ msgstr "行程" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Rotation Degrees" -msgstr "旋轉 %s 度。" +msgstr "旋轉角度" -#: scene/2d/node_2d.cpp +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy msgid "Global Rotation" msgstr "常數" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Rotation Degrees" -msgstr "旋轉 %s 度。" +msgstr "全域旋轉角度" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "隨機縮放:" +msgstr "全域縮放" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21632,9 +21111,8 @@ msgid "Scroll" msgstr "" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Offset" -msgstr "å移:" +msgstr "基礎åç§»" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21724,19 +21202,16 @@ msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "PathFollow2D 僅在其為 Path2D çš„å節點時有效。" #: scene/2d/path_2d.cpp scene/3d/path.cpp -#, fuzzy msgid "Unit Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "å–®ä½åç§»" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "H Offset" -msgstr "å移:" +msgstr "H åç§»" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "V Offset" -msgstr "å移:" +msgstr "V åç§»" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21797,9 +21272,8 @@ msgid "Mass" msgstr "" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "垂直:" +msgstr "慣性" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21836,9 +21310,8 @@ msgid "Sleeping" msgstr "智慧型å¸é™„" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Can Sleep" -msgstr "速度:" +msgstr "å¯ä»¥ç¡çœ " #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" @@ -21862,9 +21335,8 @@ msgid "Safe Margin" msgstr "è¨å®šå¤–邊è·" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Sync To Physics" -msgstr " (物ç†ï¼‰" +msgstr "與物ç†åŒæ¥" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21884,9 +21356,8 @@ msgid "Normal" msgstr "æ ¼å¼" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Remainder" -msgstr "算繪引擎:" +msgstr "餘é‡" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22076,9 +21547,8 @@ msgid "Compatibility Mode" msgstr "優先模å¼" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Centered Textures" -msgstr "主è¦åŠŸèƒ½ï¼š" +msgstr "ç´‹ç†å±…ä¸" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" @@ -22197,9 +21667,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROrigin å¿…é ˆæœ‰ä¸€å€‹ ARVRCamera å節點。" #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "隨機縮放:" +msgstr "世界縮放" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22228,9 +21697,8 @@ msgid "Emission Angle" msgstr "發射色彩" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Degrees" -msgstr "旋轉 %s 度。" +msgstr "角度" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22312,9 +21780,8 @@ msgid "Bounce Indirect Energy" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Denoiser" -msgstr "篩é¸ï¼š" +msgstr "使用é™å™ªå™¨" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" @@ -22341,9 +21808,8 @@ msgid "Generate" msgstr "一般" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "大å°ï¼š" +msgstr "最大大å°" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22351,9 +21817,8 @@ msgid "Custom Sky" msgstr "剪下節點" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky Rotation Degrees" -msgstr "旋轉 %s 度。" +msgstr "自定義天空旋轉角度" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -22385,9 +21850,8 @@ msgid "Light Data" msgstr "åŒ…å«æ•¸æ“š" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Bone Name" -msgstr "節點å稱:" +msgstr "骨骼å稱" #: scene/3d/camera.cpp msgid "Keep Aspect" @@ -22412,9 +21876,8 @@ msgid "FOV" msgstr "" #: scene/3d/camera.cpp -#, fuzzy msgid "Frustum Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "視éŒåç§»" #: scene/3d/camera.cpp #, fuzzy @@ -22666,9 +22129,8 @@ msgid "Font" msgstr "å—é«”" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "水平:" +msgstr "æ°´å¹³å°é½Š" #: scene/3d/label_3d.cpp #, fuzzy @@ -22732,9 +22194,8 @@ msgid "Split 3" msgstr "拆分路徑" #: scene/3d/light.cpp -#, fuzzy msgid "Blend Splits" -msgstr "æ··åˆæ™‚間:" +msgstr "æ··åˆæ‹†åˆ†" #: scene/3d/light.cpp #, fuzzy @@ -22778,9 +22239,8 @@ msgid "Software Skinning" msgstr "" #: scene/3d/mesh_instance.cpp -#, fuzzy msgid "Transform Normals" -msgstr "已䏿¢è®Šæ›ã€‚" +msgstr "è®Šæ›æ³•ç·š" #: scene/3d/navigation.cpp msgid "" @@ -22869,14 +22329,12 @@ msgid "Visibility AABB" msgstr "切æ›å¯è¦‹ï¼éš±è—" #: scene/3d/particles.cpp -#, fuzzy msgid "Draw Passes" -msgstr "繪製呼å«ï¼š" +msgstr "繪製階段" #: scene/3d/particles.cpp -#, fuzzy msgid "Passes" -msgstr "繪製呼å«ï¼š" +msgstr "階段" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -22972,9 +22430,8 @@ msgstr "" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Relaxation" -msgstr "分隔:" +msgstr "鬆弛" #: scene/3d/physics_body.cpp #, fuzzy @@ -22987,9 +22444,8 @@ msgid "Angular Limit Upper" msgstr "線性" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Lower" -msgstr "最大角度誤差:" +msgstr "角度下é™" #: scene/3d/physics_body.cpp #, fuzzy @@ -23120,9 +22576,8 @@ msgid "Angular Equilibrium Point" msgstr "" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Body Offset" -msgstr "å移:" +msgstr "形體åç§»" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -23154,9 +22609,8 @@ msgid "Exclude Nodes" msgstr "刪除節點" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Params" -msgstr "å·²æ›´æ”¹åƒæ•¸ï¼š" +msgstr "引數" #: scene/3d/physics_joint.cpp msgid "Angular Limit" @@ -23182,9 +22636,8 @@ msgid "Target Velocity" msgstr "å‘å³ç’°è¦–" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Max Impulse" -msgstr "速度:" +msgstr "最大è¡é‡" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23192,14 +22645,12 @@ msgid "Linear Limit" msgstr "線性" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "è·é›¢ä¸Šé™" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "è·é›¢ä¸‹é™" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23232,9 +22683,8 @@ msgid "Angular Motion" msgstr "å‹•ç•«" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Angular Ortho" -msgstr "最大角度誤差:" +msgstr "角度æ£äº¤" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23247,9 +22697,8 @@ msgid "Linear Motor X" msgstr "åˆå§‹åŒ–" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Force Limit" -msgstr "繪製呼å«ï¼š" +msgstr "力度é™åˆ¶" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23347,9 +22796,8 @@ msgid "Two Way" msgstr "" #: scene/3d/portal.cpp -#, fuzzy msgid "Linked Room" -msgstr "峿™‚ç·¨è¼¯æ ¹ç¯€é»žï¼š" +msgstr "連接房間" #: scene/3d/portal.cpp #, fuzzy @@ -23366,9 +22814,8 @@ msgid "Dispatch Mode" msgstr "" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Grid Radius" -msgstr "åŠå¾‘:" +msgstr "ç¶²æ ¼åŠå¾‘" #: scene/3d/ray_cast.cpp #, fuzzy @@ -23385,9 +22832,8 @@ msgid "Update Mode" msgstr "旋轉模å¼" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Origin Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "原點åç§»" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23649,14 +23095,12 @@ msgid "Parent Collision Ignore" msgstr "建立碰撞多邊形" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Simulation Precision" -msgstr "無效的動畫樹。" +msgstr "模擬精度" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Total Mass" -msgstr "總計:" +msgstr "總質é‡" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" @@ -23700,13 +23144,17 @@ msgstr "" "請改為修改其å節點的碰撞形狀之大å°ã€‚" #: scene/3d/spatial.cpp +#, fuzzy +msgid "Global Translation" +msgstr "ä¿æŒå…¨åŸŸè®Šæ›" + +#: scene/3d/spatial.cpp msgid "Matrix" msgstr "" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Gizmo" +msgstr "控制器" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23765,18 +23213,16 @@ msgid "VehicleBody Motion" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Use As Traction" -msgstr "分隔:" +msgstr "用作牽引" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Wheel" -msgstr "滾輪å‘上。" +msgstr "車輪" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" @@ -23812,9 +23258,8 @@ msgid "Material Override" msgstr "複寫" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Overlay" -msgstr "æè³ªè®Šæ›´ï¼š" +msgstr "æè³ªè¦†è“‹å±¤" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23822,9 +23267,8 @@ msgid "Cast Shadow" msgstr "建立著色器節點" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Extra Cull Margin" -msgstr "é¡å¤–呼å«å¼•數:" +msgstr "é¡å¤–剔除邊è·" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23846,9 +23290,8 @@ msgstr "" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Min Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "最å°è·é›¢" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" @@ -24349,18 +23792,16 @@ msgid "Mouse" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Default Cursor Shape" -msgstr "載入é è¨åŒ¯æµæŽ’é…置。" +msgstr "é è¨æ¸¸æ¨™å½¢ç‹€" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Size Flags" -msgstr "大å°ï¼š " +msgstr "å¤§å° Flag:" #: scene/gui/control.cpp #, fuzzy @@ -24726,9 +24167,8 @@ msgid "Max Value" msgstr "數值" #: scene/gui/range.cpp -#, fuzzy msgid "Page" -msgstr "é : " +msgstr "é " #: scene/gui/range.cpp #, fuzzy @@ -24916,9 +24356,8 @@ msgid "All Tabs In Front" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Drag To Rearrange Enabled" -msgstr "æ‹–æ”¾ä»¥é‡æ–°æŽ’列。" +msgstr "å•Ÿç”¨æ‹–ç§»é‡æ–°æŽ’列" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" @@ -25055,9 +24494,8 @@ msgid "Initial Angle" msgstr "åˆå§‹åŒ–" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Degrees" -msgstr "旋轉 %s 度。" +msgstr "填充角度" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25164,9 +24602,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "逾時。" +msgstr "逾時" #: scene/main/node.cpp msgid "" @@ -25294,9 +24731,8 @@ msgid "Draw 2D Outlines" msgstr "建立輪廓" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "æ–¹å‘" +msgstr "åå°„" #: scene/main/scene_tree.cpp #, fuzzy @@ -25933,9 +25369,8 @@ msgid "Labeled Separator Right" msgstr "帶å稱的分隔線" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "色彩é‹ç®—å。" +msgstr "分隔線å—é«”" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25943,9 +25378,8 @@ msgid "Font Color Accel" msgstr "釿–°å‘½åé¡è‰²é …ç›®" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Separator" -msgstr "色彩é‹ç®—å。" +msgstr "分隔線å—é«”é¡è‰²" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26233,9 +25667,8 @@ msgid "Label Width" msgstr "左延展" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Screen Picker" -msgstr "濾色é‹ç®—å。" +msgstr "å±å¹•å–色器" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26450,9 +25883,8 @@ msgid "Sky Rotation" msgstr "旋轉æ¥é•·ï¼š" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation Degrees" -msgstr "旋轉 %s 度。" +msgstr "天空旋轉角度" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26632,9 +26064,8 @@ msgid "Distance" msgstr "鏿“‡è·é›¢ï¼š" #: scene/resources/environment.cpp -#, fuzzy msgid "Transition" -msgstr "è½‰å ´ï¼š " +msgstr "è½‰å ´æ•ˆæžœ" #: scene/resources/environment.cpp msgid "DOF Near Blur" @@ -26717,9 +26148,8 @@ msgid "Saturation" msgstr "分隔:" #: scene/resources/environment.cpp -#, fuzzy msgid "Color Correction" -msgstr "é¡è‰²å‡½å¼ã€‚" +msgstr "é¡è‰²æ ¡æ£" #: scene/resources/font.cpp #, fuzzy @@ -26801,9 +26231,8 @@ msgid "Disable Ambient Light" msgstr "å‘å³ç¸®æŽ’" #: scene/resources/material.cpp -#, fuzzy msgid "Ensure Correct Normals" -msgstr "已䏿¢è®Šæ›ã€‚" +msgstr "ç¢ºä¿æ£ç¢ºæ³•ç·š" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" @@ -26970,9 +26399,8 @@ msgid "Subsurf Scatter" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Transmission" -msgstr "è½‰å ´ï¼š " +msgstr "è½‰å ´" #: scene/resources/material.cpp #, fuzzy @@ -27040,14 +26468,12 @@ msgid "NavMesh Transform" msgstr "清除變æ›" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Color Format" -msgstr "色彩é‹ç®—å。" +msgstr "é¡è‰²æ ¼å¼" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Transform Format" -msgstr "已䏿¢è®Šæ›ã€‚" +msgstr "è®Šæ›æ ¼å¼" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27063,9 +26489,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "縮放: " +msgstr "縮放:" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27073,9 +26498,8 @@ msgid "Partition Type" msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Parsed Geometry Type" -msgstr "æ£åœ¨è§£æžå¤šé‚Šå½¢..." +msgstr "è§£æžå¹¾ä½•體類型" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" @@ -27209,9 +26633,8 @@ msgid "Point Texture" msgstr "發射點:" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Normal Texture" -msgstr "發射æºï¼š " +msgstr "法線紋ç†è²¼åœ–" #: scene/resources/particles_material.cpp #, fuzzy @@ -27415,9 +26838,8 @@ msgid "Base Texture" msgstr "移除紋ç†" #: scene/resources/texture.cpp -#, fuzzy msgid "Image Size" -msgstr "é : " +msgstr "圖片大å°" #: scene/resources/texture.cpp #, fuzzy @@ -27829,9 +27251,8 @@ msgid "Pan Pullout" msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp -#, fuzzy msgid "Time Pullout (ms)" -msgstr "逾時。" +msgstr "撤離時間(毫秒)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" @@ -27886,119 +27307,105 @@ msgstr "é€è¦–" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" -msgstr "" +msgstr "線性ç¡çœ 速度閾值" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Angular" -msgstr "" +msgstr "ç¡çœ 角速度閾值" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "ç¡çœ 剿™‚é–“" #: servers/physics_2d/physics_2d_server_sw.cpp -#, fuzzy msgid "BP Hash Table Size" -msgstr "大å°ï¼š" +msgstr "BP 雜湊表大å°" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "Large Object Surface Threshold In Cells" -msgstr "" +msgstr "大物件表é¢å–®ä½æ ¼é–¾å€¼" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "逆質é‡" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "自由視圖 å·¦" +msgstr "逆慣性" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" -msgstr "" +msgstr "總角速度減幅" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Linear Damp" -msgstr "線性" +msgstr "總線性速度減幅" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Gravity" -msgstr "é è¨é 覽" +msgstr "總é‡åŠ›" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Linear Velocity" -msgstr "åˆå§‹åŒ–" +msgstr "線性速度" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "排除" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" -msgstr "" +msgstr "形狀RID" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collide With Bodies" -msgstr "碰撞模å¼" +msgstr "形體間碰撞" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "å€åŸŸé–“碰撞" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" -msgstr "" +msgstr "é‹å‹•剩餘é‡" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Point" -msgstr "碰撞模å¼" +msgstr "碰撞點" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Normal" -msgstr "碰撞模å¼" +msgstr "碰撞法線" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Depth" -msgstr "碰撞模å¼" +msgstr "碰撞深度" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Safe Fraction" -msgstr "碰撞模å¼" +msgstr "碰撞安全比值" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Unsafe Fraction" -msgstr "碰撞模å¼" +msgstr "碰撞éžå®‰å…¨æ¯”值" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "物ç†å½±æ ¼ %" +msgstr "物ç†å¼•擎" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "ä¸å·¦" +msgstr "質é‡ä¸å¿ƒ" #: servers/physics_server.cpp msgid "Principal Inertia Axes" -msgstr "" +msgstr "主慣性軸" #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." -msgstr "Varying 變數ä¸å¯åœ¨å‡½å¼ã€Œ%sã€ä¸è¢«æŒ‡æ´¾ã€‚" +msgstr "Varying變數ä¸å¯åœ¨ã€Œ%sã€å‡½å¼ä¸è¢«æŒ‡æ´¾ã€‚" #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." @@ -28007,7 +27414,6 @@ msgstr "" "指派。" #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." @@ -28028,39 +27434,32 @@ msgid "Constants cannot be modified." msgstr "ä¸å¯ä¿®æ”¹å¸¸æ•¸ã€‚" #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "Spatial Partitioning" -msgstr "æ£åœ¨åˆ†å‰²..." +msgstr "空間分割" #: servers/visual_server.cpp -#, fuzzy msgid "Render Loop Enabled" -msgstr "篩é¸è¨Šè™Ÿ" +msgstr "啟用算繪迴圈" #: servers/visual_server.cpp -#, fuzzy msgid "VRAM Compression" -msgstr "è¨å®šè¡¨ç¤ºå¼" +msgstr "VRAM壓縮" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "匯入" +msgstr "匯入BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "匯入" +msgstr "匯入S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "匯入" +msgstr "匯入ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "匯入" +msgstr "匯入ETC2" #: servers/visual_server.cpp #, fuzzy @@ -28072,9 +27471,8 @@ msgid "Lossless Compression" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "來æºç¶²æ ¼ï¼š" +msgstr "強制 PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" @@ -28118,7 +27516,7 @@ msgstr "篩é¸ç¯€é»ž" #: servers/visual_server.cpp #, fuzzy msgid "Texture Array Reflections" -msgstr "ç½®ä¸æ‰€é¸" +msgstr "ç´‹ç†è²¼åœ–陣列åå°„" #: servers/visual_server.cpp msgid "High Quality GGX" @@ -28175,20 +27573,24 @@ msgid "Use Nearest Mipmap Filter" msgstr "" #: servers/visual_server.cpp +#, fuzzy msgid "Skinning" -msgstr "" +msgstr "外觀變更" #: servers/visual_server.cpp +#, fuzzy msgid "Software Skinning Fallback" -msgstr "" +msgstr "軟體外觀變更後備" #: servers/visual_server.cpp +#, fuzzy msgid "Force Software Skinning" -msgstr "" +msgstr "強制軟體外觀變更" #: servers/visual_server.cpp +#, fuzzy msgid "Use Software Skinning" -msgstr "" +msgstr "使用軟體外觀變更" #: servers/visual_server.cpp #, fuzzy @@ -28218,9 +27620,8 @@ msgid "Legacy Stream" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Batching" -msgstr "æ£åœ¨æœå°‹..." +msgstr "分批" #: servers/visual_server.cpp msgid "Use Batching" @@ -28250,7 +27651,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Max Join Items" -msgstr "管ç†é …目……" +msgstr "æœ€å¤§åŠ å…¥é …ç›®æ•¸" #: servers/visual_server.cpp msgid "Batch Buffer Size" @@ -28306,7 +27707,7 @@ msgstr "使用縮放å¸é™„" #: servers/visual_server.cpp msgid "PVS Logging" -msgstr "" +msgstr "PVS 日誌" #: servers/visual_server.cpp #, fuzzy @@ -28338,9 +27739,8 @@ msgid "Max Active Polygons" msgstr "移動多邊形" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Compilation Mode" -msgstr "æ’值模å¼" +msgstr "è‘—è‰²å™¨ç·¨è¯æ¨¡å¼" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" @@ -28351,6 +27751,5 @@ msgid "Log Active Async Compiles Count" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Cache Size (MB)" -msgstr "更改相機尺寸" +msgstr "著色器快å–å¤§å° ï¼ˆMB)" diff --git a/main/main.cpp b/main/main.cpp index eb401cd9ef..2bb67f17f1 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2198,6 +2198,13 @@ bool Main::start() { #endif } + uint64_t minimum_time_msec = GLOBAL_DEF("application/boot_splash/minimum_display_time", 0); + ProjectSettings::get_singleton()->set_custom_property_info("application/boot_splash/minimum_display_time", + PropertyInfo(Variant::INT, + "application/boot_splash/minimum_display_time", + PROPERTY_HINT_RANGE, + "0,100,1,or_greater,suffix:ms")); // No negative numbers. + #ifdef TOOLS_ENABLED if (!doc_tool_path.is_empty()) { // Needed to instance editor-only classes for their default values @@ -2718,6 +2725,15 @@ bool Main::start() { if (movie_writer) { movie_writer->begin(DisplayServer::get_singleton()->window_get_size(), fixed_fps, write_movie_path); } + + if (minimum_time_msec) { + uint64_t minimum_time = 1000 * minimum_time_msec; + uint64_t elapsed_time = OS::get_singleton()->get_ticks_usec(); + if (elapsed_time < minimum_time) { + OS::get_singleton()->delay_usec(minimum_time - elapsed_time); + } + } + return true; } diff --git a/misc/scripts/install_vulkan_sdk_macos.sh b/misc/scripts/install_vulkan_sdk_macos.sh new file mode 100755 index 0000000000..817302d77f --- /dev/null +++ b/misc/scripts/install_vulkan_sdk_macos.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -euo pipefail +IFS=$'\n\t' + +# Download and install the Vulkan SDK. +curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.dmg" -o /tmp/vulkan-sdk.dmg +hdiutil attach /tmp/vulkan-sdk.dmg -mountpoint /Volumes/vulkan-sdk +/Volumes/vulkan-sdk/InstallVulkan.app/Contents/MacOS/InstallVulkan \ + --accept-licenses --default-answer --confirm-command install +hdiutil detach /Volumes/vulkan-sdk +rm -f /tmp/vulkan-sdk.dmg + +echo 'Vulkan SDK installed successfully! You can now build Godot by running "scons".' diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 049be47ca8..e995cce651 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -285,16 +285,15 @@ <description> </description> </annotation> - <annotation name="@export_exp_easing"> + <annotation name="@export_exp_easing" qualifiers="vararg"> <return type="void" /> - <argument index="0" name="hint1" type="String" default="null" /> - <argument index="1" name="hint2" type="String" default="null" /> + <argument index="0" name="hints" type="String" default="""" /> <description> </description> </annotation> <annotation name="@export_file" qualifiers="vararg"> <return type="void" /> - <argument index="0" name="filter" type="String" default="null" /> + <argument index="0" name="filter" type="String" default="""" /> <description> </description> </annotation> @@ -341,14 +340,14 @@ </annotation> <annotation name="@export_global_file" qualifiers="vararg"> <return type="void" /> - <argument index="0" name="filter" type="String" default="null" /> + <argument index="0" name="filter" type="String" default="""" /> <description> </description> </annotation> <annotation name="@export_group"> <return type="void" /> <argument index="0" name="name" type="String" /> - <argument index="1" name="prefix" type="String" default="null" /> + <argument index="1" name="prefix" type="String" default="""" /> <description> </description> </annotation> @@ -359,7 +358,7 @@ </annotation> <annotation name="@export_node_path" qualifiers="vararg"> <return type="void" /> - <argument index="0" name="type" type="String" default="null" /> + <argument index="0" name="type" type="String" default="""" /> <description> </description> </annotation> @@ -368,21 +367,19 @@ <description> </description> </annotation> - <annotation name="@export_range"> + <annotation name="@export_range" qualifiers="vararg"> <return type="void" /> <argument index="0" name="min" type="float" /> <argument index="1" name="max" type="float" /> - <argument index="2" name="step" type="float" default="null" /> - <argument index="3" name="slider1" type="String" default="null" /> - <argument index="4" name="slider2" type="String" default="null" /> - <argument index="5" name="slider3" type="String" default="null" /> + <argument index="2" name="step" type="float" default="1.0" /> + <argument index="3" name="extra_hints" type="String" default="""" /> <description> </description> </annotation> <annotation name="@export_subgroup"> <return type="void" /> <argument index="0" name="name" type="String" /> - <argument index="1" name="prefix" type="String" default="null" /> + <argument index="1" name="prefix" type="String" default="""" /> <description> </description> </annotation> @@ -399,10 +396,10 @@ </annotation> <annotation name="@rpc" qualifiers="vararg"> <return type="void" /> - <argument index="0" name="mode" type="String" default="null" /> - <argument index="1" name="sync" type="String" default="null" /> - <argument index="2" name="transfer_mode" type="String" default="null" /> - <argument index="3" name="transfer_channel" type="int" default="null" /> + <argument index="0" name="mode" type="String" default="""" /> + <argument index="1" name="sync" type="String" default="""" /> + <argument index="2" name="transfer_mode" type="String" default="""" /> + <argument index="3" name="transfer_channel" type="int" default="0" /> <description> </description> </annotation> diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index bf83353ead..e7aa3214b4 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1524,7 +1524,6 @@ void GDScriptInstance::get_method_list(List<MethodInfo> *p_list) const { for (const KeyValue<StringName, GDScriptFunction *> &E : sptr->member_functions) { MethodInfo mi; mi.name = E.key; - mi.flags |= METHOD_FLAG_FROM_SCRIPT; for (int i = 0; i < E.value->get_argument_count(); i++) { mi.arguments.push_back(PropertyInfo(Variant::NIL, "arg" + itos(i))); } diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index af8e4b3746..e36252ada5 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -43,7 +43,7 @@ bool GDScriptCompiler::_is_class_member_property(CodeGen &codegen, const StringN return false; } - if (codegen.locals.has(p_name)) { + if (codegen.parameters.has(p_name) || codegen.locals.has(p_name)) { return false; //shadowed } diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 233da87aee..01a672c330 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -117,18 +117,18 @@ GDScriptParser::GDScriptParser() { register_annotation(MethodInfo("@onready"), AnnotationInfo::VARIABLE, &GDScriptParser::onready_annotation); // Export annotations. register_annotation(MethodInfo("@export"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_NONE, Variant::NIL>); - register_annotation(MethodInfo("@export_enum", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_ENUM, Variant::INT>, 0, true); - register_annotation(MethodInfo("@export_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_FILE, Variant::STRING>, 1, true); + register_annotation(MethodInfo("@export_enum", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_ENUM, Variant::INT>, varray(), true); + register_annotation(MethodInfo("@export_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_FILE, Variant::STRING>, varray(""), true); register_annotation(MethodInfo("@export_dir"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_DIR, Variant::STRING>); - register_annotation(MethodInfo("@export_global_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_GLOBAL_FILE, Variant::STRING>, 1, true); + register_annotation(MethodInfo("@export_global_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_GLOBAL_FILE, Variant::STRING>, varray(""), true); register_annotation(MethodInfo("@export_global_dir"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_GLOBAL_DIR, Variant::STRING>); register_annotation(MethodInfo("@export_multiline"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_MULTILINE_TEXT, Variant::STRING>); register_annotation(MethodInfo("@export_placeholder"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_PLACEHOLDER_TEXT, Variant::STRING>); - register_annotation(MethodInfo("@export_range", PropertyInfo(Variant::FLOAT, "min"), PropertyInfo(Variant::FLOAT, "max"), PropertyInfo(Variant::FLOAT, "step"), PropertyInfo(Variant::STRING, "slider1"), PropertyInfo(Variant::STRING, "slider2"), PropertyInfo(Variant::STRING, "slider3")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_RANGE, Variant::FLOAT>, 4); - register_annotation(MethodInfo("@export_exp_easing", PropertyInfo(Variant::STRING, "hint1"), PropertyInfo(Variant::STRING, "hint2")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_EXP_EASING, Variant::FLOAT>, 2); + register_annotation(MethodInfo("@export_range", PropertyInfo(Variant::FLOAT, "min"), PropertyInfo(Variant::FLOAT, "max"), PropertyInfo(Variant::FLOAT, "step"), PropertyInfo(Variant::STRING, "extra_hints")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_RANGE, Variant::FLOAT>, varray(1.0, ""), true); + register_annotation(MethodInfo("@export_exp_easing", PropertyInfo(Variant::STRING, "hints")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_EXP_EASING, Variant::FLOAT>, varray(""), true); register_annotation(MethodInfo("@export_color_no_alpha"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_COLOR_NO_ALPHA, Variant::COLOR>); - register_annotation(MethodInfo("@export_node_path", PropertyInfo(Variant::STRING, "type")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_NODE_PATH_VALID_TYPES, Variant::NODE_PATH>, 1, true); - register_annotation(MethodInfo("@export_flags", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_FLAGS, Variant::INT>, 0, true); + register_annotation(MethodInfo("@export_node_path", PropertyInfo(Variant::STRING, "type")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_NODE_PATH_VALID_TYPES, Variant::NODE_PATH>, varray(""), true); + register_annotation(MethodInfo("@export_flags", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_FLAGS, Variant::INT>, varray(), true); register_annotation(MethodInfo("@export_flags_2d_render"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_LAYERS_2D_RENDER, Variant::INT>); register_annotation(MethodInfo("@export_flags_2d_physics"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_LAYERS_2D_PHYSICS, Variant::INT>); register_annotation(MethodInfo("@export_flags_2d_navigation"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_LAYERS_2D_NAVIGATION, Variant::INT>); @@ -137,12 +137,12 @@ GDScriptParser::GDScriptParser() { register_annotation(MethodInfo("@export_flags_3d_navigation"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_LAYERS_3D_NAVIGATION, Variant::INT>); // Export grouping annotations. register_annotation(MethodInfo("@export_category", PropertyInfo(Variant::STRING, "name")), AnnotationInfo::STANDALONE, &GDScriptParser::export_group_annotations<PROPERTY_USAGE_CATEGORY>); - register_annotation(MethodInfo("@export_group", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::STRING, "prefix")), AnnotationInfo::STANDALONE, &GDScriptParser::export_group_annotations<PROPERTY_USAGE_GROUP>, 1); - register_annotation(MethodInfo("@export_subgroup", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::STRING, "prefix")), AnnotationInfo::STANDALONE, &GDScriptParser::export_group_annotations<PROPERTY_USAGE_SUBGROUP>, 1); + register_annotation(MethodInfo("@export_group", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::STRING, "prefix")), AnnotationInfo::STANDALONE, &GDScriptParser::export_group_annotations<PROPERTY_USAGE_GROUP>, varray("")); + register_annotation(MethodInfo("@export_subgroup", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::STRING, "prefix")), AnnotationInfo::STANDALONE, &GDScriptParser::export_group_annotations<PROPERTY_USAGE_SUBGROUP>, varray("")); // Warning annotations. - register_annotation(MethodInfo("@warning_ignore", PropertyInfo(Variant::STRING, "warning")), AnnotationInfo::CLASS | AnnotationInfo::VARIABLE | AnnotationInfo::SIGNAL | AnnotationInfo::CONSTANT | AnnotationInfo::FUNCTION | AnnotationInfo::STATEMENT, &GDScriptParser::warning_annotations, 0, true); + register_annotation(MethodInfo("@warning_ignore", PropertyInfo(Variant::STRING, "warning")), AnnotationInfo::CLASS | AnnotationInfo::VARIABLE | AnnotationInfo::SIGNAL | AnnotationInfo::CONSTANT | AnnotationInfo::FUNCTION | AnnotationInfo::STATEMENT, &GDScriptParser::warning_annotations, varray(), true); // Networking. - register_annotation(MethodInfo("@rpc", PropertyInfo(Variant::STRING, "mode"), PropertyInfo(Variant::STRING, "sync"), PropertyInfo(Variant::STRING, "transfer_mode"), PropertyInfo(Variant::INT, "transfer_channel")), AnnotationInfo::FUNCTION, &GDScriptParser::network_annotations<Multiplayer::RPC_MODE_AUTHORITY>, 4, true); + register_annotation(MethodInfo("@rpc", PropertyInfo(Variant::STRING, "mode"), PropertyInfo(Variant::STRING, "sync"), PropertyInfo(Variant::STRING, "transfer_mode"), PropertyInfo(Variant::INT, "transfer_channel")), AnnotationInfo::FUNCTION, &GDScriptParser::network_annotations<Multiplayer::RPC_MODE_AUTHORITY>, varray("", "", "", 0), true); } GDScriptParser::~GDScriptParser() { @@ -162,6 +162,7 @@ void GDScriptParser::clear() { for_completion = false; errors.clear(); multiline_stack.clear(); + nodes_in_progress.clear(); } void GDScriptParser::push_error(const String &p_message, const Node *p_origin) { @@ -413,6 +414,9 @@ GDScriptTokenizer::Token GDScriptParser::advance() { push_error(current.literal); current = tokenizer.scan(); } + for (Node *n : nodes_in_progress) { + update_extents(n); + } return previous; } @@ -609,6 +613,7 @@ void GDScriptParser::parse_program() { } parse_class_body(true); + complete_extents(head); #ifdef TOOLS_ENABLED for (const KeyValue<int, GDScriptTokenizer::CommentData> &E : tokenizer.get_comments()) { @@ -649,6 +654,7 @@ GDScriptParser::ClassNode *GDScriptParser::parse_class() { if (multiline && !consume(GDScriptTokenizer::Token::INDENT, R"(Expected indented block after class declaration.)")) { current_class = previous_class; + complete_extents(n_class); return n_class; } @@ -661,6 +667,7 @@ GDScriptParser::ClassNode *GDScriptParser::parse_class() { } parse_class_body(multiline); + complete_extents(n_class); if (multiline) { consume(GDScriptTokenizer::Token::DEDENT, R"(Missing unindent at the end of the class body.)"); @@ -870,11 +877,13 @@ GDScriptParser::VariableNode *GDScriptParser::parse_variable() { } GDScriptParser::VariableNode *GDScriptParser::parse_variable(bool p_allow_property) { + VariableNode *variable = alloc_node<VariableNode>(); + if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected variable name after "var".)")) { + complete_extents(variable); return nullptr; } - VariableNode *variable = alloc_node<VariableNode>(); variable->identifier = parse_identifier(); variable->export_info.name = variable->identifier->name; @@ -882,10 +891,10 @@ GDScriptParser::VariableNode *GDScriptParser::parse_variable(bool p_allow_proper if (check(GDScriptTokenizer::Token::NEWLINE)) { if (p_allow_property) { advance(); - return parse_property(variable, true); } else { push_error(R"(Expected type after ":")"); + complete_extents(variable); return nullptr; } } else if (check((GDScriptTokenizer::Token::EQUAL))) { @@ -924,6 +933,7 @@ GDScriptParser::VariableNode *GDScriptParser::parse_variable(bool p_allow_proper } } + complete_extents(variable); end_statement("variable declaration"); return variable; @@ -932,6 +942,7 @@ GDScriptParser::VariableNode *GDScriptParser::parse_variable(bool p_allow_proper GDScriptParser::VariableNode *GDScriptParser::parse_property(VariableNode *p_variable, bool p_need_indent) { if (p_need_indent) { if (!consume(GDScriptTokenizer::Token::INDENT, R"(Expected indented block for property after ":".)")) { + complete_extents(p_variable); return nullptr; } } @@ -941,6 +952,7 @@ GDScriptParser::VariableNode *GDScriptParser::parse_property(VariableNode *p_var make_completion_context(COMPLETION_PROPERTY_DECLARATION, property); if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected "get" or "set" for property declaration.)")) { + complete_extents(p_variable); return nullptr; } @@ -997,6 +1009,7 @@ GDScriptParser::VariableNode *GDScriptParser::parse_property(VariableNode *p_var } function = parse_identifier(); } + complete_extents(p_variable); if (p_variable->property == VariableNode::PROP_SETGET) { end_statement("property declaration"); @@ -1011,37 +1024,37 @@ GDScriptParser::VariableNode *GDScriptParser::parse_property(VariableNode *p_var void GDScriptParser::parse_property_setter(VariableNode *p_variable) { switch (p_variable->property) { case VariableNode::PROP_INLINE: { - consume(GDScriptTokenizer::Token::PARENTHESIS_OPEN, R"(Expected "(" after "set".)"); - if (consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected parameter name after "(".)")) { - p_variable->setter_parameter = parse_identifier(); - } - consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after parameter name.)*"); - consume(GDScriptTokenizer::Token::COLON, R"*(Expected ":" after ")".)*"); - + FunctionNode *function = alloc_node<FunctionNode>(); IdentifierNode *identifier = alloc_node<IdentifierNode>(); + complete_extents(identifier); identifier->name = "@" + p_variable->identifier->name + "_setter"; - - FunctionNode *function = alloc_node<FunctionNode>(); function->identifier = identifier; - FunctionNode *previous_function = current_function; - current_function = function; + consume(GDScriptTokenizer::Token::PARENTHESIS_OPEN, R"(Expected "(" after "set".)"); ParameterNode *parameter = alloc_node<ParameterNode>(); - parameter->identifier = p_variable->setter_parameter; - - if (parameter->identifier != nullptr) { + if (consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected parameter name after "(".)")) { + reset_extents(parameter, previous); + p_variable->setter_parameter = parse_identifier(); + parameter->identifier = p_variable->setter_parameter; function->parameters_indices[parameter->identifier->name] = 0; function->parameters.push_back(parameter); + } + complete_extents(parameter); + consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after parameter name.)*"); + consume(GDScriptTokenizer::Token::COLON, R"*(Expected ":" after ")".)*"); + + FunctionNode *previous_function = current_function; + current_function = function; + if (p_variable->setter_parameter != nullptr) { SuiteNode *body = alloc_node<SuiteNode>(); body->add_local(parameter, function); - function->body = parse_suite("setter declaration", body); p_variable->setter = function; } - current_function = previous_function; + complete_extents(function); break; } case VariableNode::PROP_SETGET: @@ -1059,12 +1072,13 @@ void GDScriptParser::parse_property_setter(VariableNode *p_variable) { void GDScriptParser::parse_property_getter(VariableNode *p_variable) { switch (p_variable->property) { case VariableNode::PROP_INLINE: { + FunctionNode *function = alloc_node<FunctionNode>(); + consume(GDScriptTokenizer::Token::COLON, R"(Expected ":" after "get".)"); IdentifierNode *identifier = alloc_node<IdentifierNode>(); + complete_extents(identifier); identifier->name = "@" + p_variable->identifier->name + "_getter"; - - FunctionNode *function = alloc_node<FunctionNode>(); function->identifier = identifier; FunctionNode *previous_function = current_function; @@ -1072,9 +1086,10 @@ void GDScriptParser::parse_property_getter(VariableNode *p_variable) { SuiteNode *body = alloc_node<SuiteNode>(); function->body = parse_suite("getter declaration", body); - p_variable->getter = function; + current_function = previous_function; + complete_extents(function); break; } case VariableNode::PROP_SETGET: @@ -1090,11 +1105,12 @@ void GDScriptParser::parse_property_getter(VariableNode *p_variable) { } GDScriptParser::ConstantNode *GDScriptParser::parse_constant() { + ConstantNode *constant = alloc_node<ConstantNode>(); + if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected constant name after "const".)")) { return nullptr; } - ConstantNode *constant = alloc_node<ConstantNode>(); constant->identifier = parse_identifier(); if (match(GDScriptTokenizer::Token::COLON)) { @@ -1113,12 +1129,15 @@ GDScriptParser::ConstantNode *GDScriptParser::parse_constant() { if (constant->initializer == nullptr) { push_error(R"(Expected initializer expression for constant.)"); + complete_extents(constant); return nullptr; } } else { + complete_extents(constant); return nullptr; } + complete_extents(constant); end_statement("constant declaration"); return constant; @@ -1148,15 +1167,18 @@ GDScriptParser::ParameterNode *GDScriptParser::parse_parameter() { parameter->default_value = parse_expression(false); } + complete_extents(parameter); return parameter; } GDScriptParser::SignalNode *GDScriptParser::parse_signal() { + SignalNode *signal = alloc_node<SignalNode>(); + if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected signal name after "signal".)")) { + complete_extents(signal); return nullptr; } - SignalNode *signal = alloc_node<SignalNode>(); signal->identifier = parse_identifier(); if (check(GDScriptTokenizer::Token::PARENTHESIS_OPEN)) { @@ -1188,6 +1210,7 @@ GDScriptParser::SignalNode *GDScriptParser::parse_signal() { consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected closing ")" after signal parameters.)*"); } + complete_extents(signal); end_statement("signal declaration"); return signal; @@ -1299,6 +1322,7 @@ GDScriptParser::EnumNode *GDScriptParser::parse_enum() { } #endif // TOOLS_ENABLED + complete_extents(enum_node); end_statement("enum"); return enum_node; @@ -1350,19 +1374,22 @@ void GDScriptParser::parse_function_signature(FunctionNode *p_function, SuiteNod } GDScriptParser::FunctionNode *GDScriptParser::parse_function() { + FunctionNode *function = alloc_node<FunctionNode>(); + bool _static = false; if (previous.type == GDScriptTokenizer::Token::STATIC) { // TODO: Improve message if user uses "static" with "var" or "const" if (!consume(GDScriptTokenizer::Token::FUNC, R"(Expected "func" after "static".)")) { + complete_extents(function); return nullptr; } _static = true; } - FunctionNode *function = alloc_node<FunctionNode>(); make_completion_context(COMPLETION_OVERRIDE_METHOD, function); if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected function name after "func".)")) { + complete_extents(function); return nullptr; } @@ -1384,6 +1411,7 @@ GDScriptParser::FunctionNode *GDScriptParser::parse_function() { function->body = parse_suite("function declaration", body); current_function = previous_function; + complete_extents(function); return function; } @@ -1431,6 +1459,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali } pop_completion_call(); } + complete_extents(annotation); match(GDScriptTokenizer::Token::NEWLINE); // Newline after annotation is optional. @@ -1449,12 +1478,12 @@ void GDScriptParser::clear_unused_annotations() { annotation_stack.clear(); } -bool GDScriptParser::register_annotation(const MethodInfo &p_info, uint32_t p_target_kinds, AnnotationAction p_apply, int p_optional_arguments, bool p_is_vararg) { +bool GDScriptParser::register_annotation(const MethodInfo &p_info, uint32_t p_target_kinds, AnnotationAction p_apply, const Vector<Variant> &p_default_arguments, bool p_is_vararg) { ERR_FAIL_COND_V_MSG(valid_annotations.has(p_info.name), false, vformat(R"(Annotation "%s" already registered.)", p_info.name)); AnnotationInfo new_annotation; new_annotation.info = p_info; - new_annotation.info.default_arguments.resize(p_optional_arguments); + new_annotation.info.default_arguments = p_default_arguments; if (p_is_vararg) { new_annotation.info.flags |= METHOD_FLAG_VARARG; } @@ -1480,9 +1509,11 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context, if (multiline) { if (!consume(GDScriptTokenizer::Token::INDENT, vformat(R"(Expected indented block after %s.)", p_context))) { current_suite = suite->parent_block; + complete_extents(suite); return suite; } } + reset_extents(suite, current); int error_count = 0; @@ -1532,6 +1563,8 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context, } while ((multiline || previous.type == GDScriptTokenizer::Token::SEMICOLON) && !check(GDScriptTokenizer::Token::DEDENT) && !lambda_ended && !is_at_end()); + complete_extents(suite); + if (multiline) { if (!lambda_ended) { consume(GDScriptTokenizer::Token::DEDENT, vformat(R"(Missing unindent at the end of %s.)", p_context)); @@ -1562,6 +1595,7 @@ GDScriptParser::Node *GDScriptParser::parse_statement() { case GDScriptTokenizer::Token::PASS: advance(); result = alloc_node<PassNode>(); + complete_extents(result); end_statement(R"("pass")"); break; case GDScriptTokenizer::Token::VAR: @@ -1609,6 +1643,7 @@ GDScriptParser::Node *GDScriptParser::parse_statement() { // If this fails the expression will be nullptr, but that's the same as no return, so it's fine. n_return->return_value = parse_expression(false); } + complete_extents(n_return); result = n_return; current_suite->has_return = true; @@ -1619,6 +1654,7 @@ GDScriptParser::Node *GDScriptParser::parse_statement() { case GDScriptTokenizer::Token::BREAKPOINT: advance(); result = alloc_node<BreakpointNode>(); + complete_extents(result); end_statement(R"("breakpoint")"); break; case GDScriptTokenizer::Token::ASSERT: @@ -1644,10 +1680,12 @@ GDScriptParser::Node *GDScriptParser::parse_statement() { lambda_ended = true; has_ended_lambda = true; } else { + advance(); push_error(vformat(R"(Expected statement, found "%s" instead.)", previous.get_name())); } + } else { + end_statement("expression"); } - end_statement("expression"); lambda_ended = lambda_ended || has_ended_lambda; result = expression; @@ -1710,6 +1748,7 @@ GDScriptParser::AssertNode *GDScriptParser::parse_assert() { assert->condition = parse_expression(false); if (assert->condition == nullptr) { push_error("Expected expression to assert."); + complete_extents(assert); return nullptr; } @@ -1718,12 +1757,14 @@ GDScriptParser::AssertNode *GDScriptParser::parse_assert() { assert->message = parse_expression(false); if (assert->message == nullptr) { push_error(R"(Expected error message for assert after ",".)"); + complete_extents(assert); return nullptr; } } consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after assert expression.)*"); + complete_extents(assert); end_statement(R"("assert")"); return assert; @@ -1733,8 +1774,10 @@ GDScriptParser::BreakNode *GDScriptParser::parse_break() { if (!can_break) { push_error(R"(Cannot use "break" outside of a loop.)"); } + BreakNode *break_node = alloc_node<BreakNode>(); + complete_extents(break_node); end_statement(R"("break")"); - return alloc_node<BreakNode>(); + return break_node; } GDScriptParser::ContinueNode *GDScriptParser::parse_continue() { @@ -1742,9 +1785,10 @@ GDScriptParser::ContinueNode *GDScriptParser::parse_continue() { push_error(R"(Cannot use "continue" outside of a loop or pattern matching block.)"); } current_suite->has_continue = true; - end_statement(R"("continue")"); ContinueNode *cont = alloc_node<ContinueNode>(); cont->is_for_match = is_continue_match; + complete_extents(cont); + end_statement(R"("continue")"); return cont; } @@ -1786,6 +1830,7 @@ GDScriptParser::ForNode *GDScriptParser::parse_for() { suite->parent_for = n_for; n_for->loop = parse_suite(R"("for" block)", suite); + complete_extents(n_for); // Reset break/continue state. can_break = could_break; @@ -1813,15 +1858,16 @@ GDScriptParser::IfNode *GDScriptParser::parse_if(const String &p_token) { } if (match(GDScriptTokenizer::Token::ELIF)) { - IfNode *elif = parse_if("elif"); - SuiteNode *else_block = alloc_node<SuiteNode>(); + IfNode *elif = parse_if("elif"); else_block->statements.push_back(elif); + complete_extents(else_block); n_if->false_block = else_block; } else if (match(GDScriptTokenizer::Token::ELSE)) { consume(GDScriptTokenizer::Token::COLON, R"(Expected ":" after "else".)"); n_if->false_block = parse_suite(R"("else" block)"); } + complete_extents(n_if); if (n_if->false_block != nullptr && n_if->false_block->has_return && n_if->true_block->has_return) { current_suite->has_return = true; @@ -1845,6 +1891,7 @@ GDScriptParser::MatchNode *GDScriptParser::parse_match() { consume(GDScriptTokenizer::Token::NEWLINE, R"(Expected a newline after "match" statement.)"); if (!consume(GDScriptTokenizer::Token::INDENT, R"(Expected an indented block after "match" statement.)")) { + complete_extents(match); return match; } @@ -1862,7 +1909,7 @@ GDScriptParser::MatchNode *GDScriptParser::parse_match() { } #ifdef DEBUG_ENABLED - if (have_wildcard_without_continue) { + if (have_wildcard_without_continue && !branch->patterns.is_empty()) { push_warning(branch->patterns[0], GDScriptWarning::UNREACHABLE_PATTERN); } @@ -1878,6 +1925,7 @@ GDScriptParser::MatchNode *GDScriptParser::parse_match() { #endif match->branches.push_back(branch); } + complete_extents(match); consume(GDScriptTokenizer::Token::DEDENT, R"(Expected an indented block after "match" statement.)"); @@ -1892,6 +1940,7 @@ GDScriptParser::MatchNode *GDScriptParser::parse_match() { GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() { MatchBranchNode *branch = alloc_node<MatchBranchNode>(); + reset_extents(branch, current); bool has_bind = false; @@ -1919,6 +1968,7 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() { } if (!consume(GDScriptTokenizer::Token::COLON, R"(Expected ":" after "match" patterns.)")) { + complete_extents(branch); return nullptr; } @@ -1939,6 +1989,7 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() { } branch->block = parse_suite("match pattern block", suite); + complete_extents(branch); // Restore continue state. can_continue = could_continue; @@ -1949,12 +2000,14 @@ GDScriptParser::MatchBranchNode *GDScriptParser::parse_match_branch() { GDScriptParser::PatternNode *GDScriptParser::parse_match_pattern(PatternNode *p_root_pattern) { PatternNode *pattern = alloc_node<PatternNode>(); + reset_extents(pattern, current); switch (current.type) { case GDScriptTokenizer::Token::VAR: { // Bind. advance(); if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected bind name after "var".)")) { + complete_extents(pattern); return nullptr; } pattern->pattern_type = PatternNode::PT_BIND; @@ -1965,12 +2018,14 @@ GDScriptParser::PatternNode *GDScriptParser::parse_match_pattern(PatternNode *p_ if (p_root_pattern != nullptr) { if (p_root_pattern->has_bind(pattern->bind->name)) { push_error(vformat(R"(Bind variable name "%s" was already used in this pattern.)", pattern->bind->name)); + complete_extents(pattern); return nullptr; } } if (current_suite->has_local(pattern->bind->name)) { push_error(vformat(R"(There's already a %s named "%s" in this scope.)", current_suite->get_local(pattern->bind->name).get_name(), pattern->bind->name)); + complete_extents(pattern); return nullptr; } @@ -2023,6 +2078,7 @@ GDScriptParser::PatternNode *GDScriptParser::parse_match_pattern(PatternNode *p_ push_error(R"(The ".." pattern must be the last element in the pattern dictionary.)"); } else { PatternNode *sub_pattern = alloc_node<PatternNode>(); + complete_extents(sub_pattern); sub_pattern->pattern_type = PatternNode::PT_REST; pattern->dictionary.push_back({ nullptr, sub_pattern }); pattern->rest_used = true; @@ -2071,6 +2127,7 @@ GDScriptParser::PatternNode *GDScriptParser::parse_match_pattern(PatternNode *p_ break; } } + complete_extents(pattern); return pattern; } @@ -2104,6 +2161,7 @@ GDScriptParser::WhileNode *GDScriptParser::parse_while() { is_continue_match = false; n_while->loop = parse_suite(R"("while" block)"); + complete_extents(n_while); // Reset break/continue state. can_break = could_break; @@ -2176,6 +2234,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_identifier(ExpressionNode ERR_FAIL_V_MSG(nullptr, "Parser bug: parsing literal node without literal token."); } IdentifierNode *identifier = alloc_node<IdentifierNode>(); + complete_extents(identifier); identifier->name = previous.get_identifier(); if (current_suite != nullptr && current_suite->has_local(identifier->name)) { @@ -2227,6 +2286,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_literal(ExpressionNode *p_ } LiteralNode *literal = alloc_node<LiteralNode>(); + complete_extents(literal); literal->value = previous.literal; return literal; } @@ -2236,6 +2296,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_self(ExpressionNode *p_pre push_error(R"(Cannot use "self" inside a static function.)"); } SelfNode *self = alloc_node<SelfNode>(); + complete_extents(self); self->current_class = current_class; return self; } @@ -2243,6 +2304,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_self(ExpressionNode *p_pre GDScriptParser::ExpressionNode *GDScriptParser::parse_builtin_constant(ExpressionNode *p_previous_operand, bool p_can_assign) { GDScriptTokenizer::Token::Type op_type = previous.type; LiteralNode *constant = alloc_node<LiteralNode>(); + complete_extents(constant); switch (op_type) { case GDScriptTokenizer::Token::CONST_PI: @@ -2303,30 +2365,38 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_unary_operator(ExpressionN } break; default: + complete_extents(operation); return nullptr; // Unreachable. } + complete_extents(operation); return operation; } GDScriptParser::ExpressionNode *GDScriptParser::parse_binary_not_in_operator(ExpressionNode *p_previous_operand, bool p_can_assign) { // check that NOT is followed by IN by consuming it before calling parse_binary_operator which will only receive a plain IN + UnaryOpNode *operation = alloc_node<UnaryOpNode>(); + reset_extents(operation, p_previous_operand); + update_extents(operation); consume(GDScriptTokenizer::Token::IN, R"(Expected "in" after "not" in content-test operator.)"); ExpressionNode *in_operation = parse_binary_operator(p_previous_operand, p_can_assign); - UnaryOpNode *operation = alloc_node<UnaryOpNode>(); operation->operation = UnaryOpNode::OP_LOGIC_NOT; operation->variant_op = Variant::OP_NOT; operation->operand = in_operation; + complete_extents(operation); return operation; } GDScriptParser::ExpressionNode *GDScriptParser::parse_binary_operator(ExpressionNode *p_previous_operand, bool p_can_assign) { GDScriptTokenizer::Token op = previous; BinaryOpNode *operation = alloc_node<BinaryOpNode>(); + reset_extents(operation, p_previous_operand); + update_extents(operation); Precedence precedence = (Precedence)(get_rule(op.type)->precedence + 1); operation->left_operand = p_previous_operand; operation->right_operand = parse_precedence(precedence, false); + complete_extents(operation); if (operation->right_operand == nullptr) { push_error(vformat(R"(Expected expression after "%s" operator.")", op.get_name())); @@ -2429,8 +2499,10 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_binary_operator(Expression GDScriptParser::ExpressionNode *GDScriptParser::parse_ternary_operator(ExpressionNode *p_previous_operand, bool p_can_assign) { // Only one ternary operation exists, so no abstraction here. TernaryOpNode *operation = alloc_node<TernaryOpNode>(); - operation->true_expr = p_previous_operand; + reset_extents(operation, p_previous_operand); + update_extents(operation); + operation->true_expr = p_previous_operand; operation->condition = parse_precedence(PREC_TERNARY, false); if (operation->condition == nullptr) { @@ -2445,6 +2517,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_ternary_operator(Expressio push_error(R"(Expected expression after "else".)"); } + complete_extents(operation); return operation; } @@ -2497,6 +2570,9 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_assignment(ExpressionNode } AssignmentNode *assignment = alloc_node<AssignmentNode>(); + reset_extents(assignment, p_previous_operand); + update_extents(assignment); + make_completion_context(COMPLETION_ASSIGN, assignment); #ifdef DEBUG_ENABLED bool has_operator = true; @@ -2561,6 +2637,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_assignment(ExpressionNode if (assignment->assigned_value == nullptr) { push_error(R"(Expected an expression after "=".)"); } + complete_extents(assignment); #ifdef DEBUG_ENABLED if (source_variable != nullptr) { @@ -2582,6 +2659,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_await(ExpressionNode *p_pr push_error(R"(Expected signal or coroutine after "await".)"); } await->to_await = element; + complete_extents(await); if (current_function) { // Might be null in a getter or setter. current_function->is_coroutine = true; @@ -2610,6 +2688,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_array(ExpressionNode *p_pr } pop_multiline(); consume(GDScriptTokenizer::Token::BRACKET_CLOSE, R"(Expected closing "]" after array elements.)"); + complete_extents(array); return array; } @@ -2701,6 +2780,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_dictionary(ExpressionNode } pop_multiline(); consume(GDScriptTokenizer::Token::BRACE_CLOSE, R"(Expected closing "}" after dictionary elements.)"); + complete_extents(dictionary); return dictionary; } @@ -2718,6 +2798,8 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_grouping(ExpressionNode *p GDScriptParser::ExpressionNode *GDScriptParser::parse_attribute(ExpressionNode *p_previous_operand, bool p_can_assign) { SubscriptNode *attribute = alloc_node<SubscriptNode>(); + reset_extents(attribute, p_previous_operand); + update_extents(attribute); if (for_completion) { bool is_builtin = false; @@ -2737,17 +2819,21 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_attribute(ExpressionNode * attribute->base = p_previous_operand; if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected identifier after "." for attribute access.)")) { + complete_extents(attribute); return attribute; } attribute->is_attribute = true; attribute->attribute = parse_identifier(); + complete_extents(attribute); return attribute; } GDScriptParser::ExpressionNode *GDScriptParser::parse_subscript(ExpressionNode *p_previous_operand, bool p_can_assign) { SubscriptNode *subscript = alloc_node<SubscriptNode>(); + reset_extents(subscript, p_previous_operand); + update_extents(subscript); make_completion_context(COMPLETION_SUBSCRIPT, subscript); @@ -2760,15 +2846,19 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_subscript(ExpressionNode * pop_multiline(); consume(GDScriptTokenizer::Token::BRACKET_CLOSE, R"(Expected "]" after subscription index.)"); + complete_extents(subscript); return subscript; } GDScriptParser::ExpressionNode *GDScriptParser::parse_cast(ExpressionNode *p_previous_operand, bool p_can_assign) { CastNode *cast = alloc_node<CastNode>(); + reset_extents(cast, p_previous_operand); + update_extents(cast); cast->operand = p_previous_operand; cast->cast_type = parse_type(); + complete_extents(cast); if (cast->cast_type == nullptr) { push_error(R"(Expected type specifier after "as".)"); @@ -2780,6 +2870,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_cast(ExpressionNode *p_pre GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_previous_operand, bool p_can_assign) { CallNode *call = alloc_node<CallNode>(); + reset_extents(call, p_previous_operand); if (previous.type == GDScriptTokenizer::Token::SUPER) { // Super call. @@ -2790,6 +2881,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre if (current_function == nullptr) { push_error(R"(Cannot use implicit "super" call outside of a function.)"); pop_multiline(); + complete_extents(call); return nullptr; } if (current_function->identifier) { @@ -2802,6 +2894,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre make_completion_context(COMPLETION_SUPER_METHOD, call, true); if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected function name after ".".)")) { pop_multiline(); + complete_extents(call); return nullptr; } IdentifierNode *identifier = parse_identifier(); @@ -2858,6 +2951,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre pop_multiline(); consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected closing ")" after call arguments.)*"); + complete_extents(call); return call; } @@ -2901,6 +2995,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p if (previous.type == GDScriptTokenizer::Token::PERCENT) { if (path_state != PATH_STATE_START && path_state != PATH_STATE_SLASH) { push_error(R"("%" is only valid in the beginning of a node name (either after "$" or after "/"))"); + complete_extents(get_node); return nullptr; } get_node->full_path += "%"; @@ -2909,6 +3004,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p } else if (previous.type == GDScriptTokenizer::Token::SLASH) { if (path_state != PATH_STATE_START && path_state != PATH_STATE_NODE_NAME) { push_error(R"("/" is only valid at the beginning of the path or after a node name.)"); + complete_extents(get_node); return nullptr; } @@ -2936,6 +3032,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p break; } push_error(vformat(R"(Expected node path as string or identifier after "%s".)", previous_token)); + complete_extents(get_node); return nullptr; } @@ -2949,10 +3046,12 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p path_state = PATH_STATE_NODE_NAME; } else if (!check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) { push_error(vformat(R"(Unexpected "%s" in node path.)", current.get_name())); + complete_extents(get_node); return nullptr; } } while (match(GDScriptTokenizer::Token::SLASH) || match(GDScriptTokenizer::Token::PERCENT)); + complete_extents(get_node); return get_node; } @@ -2976,6 +3075,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_preload(ExpressionNode *p_ pop_multiline(); consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after preload path.)*"); + complete_extents(preload); return preload; } @@ -3025,6 +3125,8 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_lambda(ExpressionNode *p_p in_lambda = true; function->body = parse_suite("lambda declaration", body, true); + complete_extents(function); + complete_extents(lambda); pop_multiline(); @@ -3069,13 +3171,15 @@ GDScriptParser::TypeNode *GDScriptParser::parse_type(bool p_allow_void) { if (!match(GDScriptTokenizer::Token::IDENTIFIER)) { if (match(GDScriptTokenizer::Token::VOID)) { if (p_allow_void) { - TypeNode *void_type = alloc_node<TypeNode>(); + complete_extents(type); + TypeNode *void_type = type; return void_type; } else { push_error(R"("void" is only allowed for a function return type.)"); } } // Leave error message to the caller who knows the context. + complete_extents(type); return nullptr; } @@ -3088,11 +3192,15 @@ GDScriptParser::TypeNode *GDScriptParser::parse_type(bool p_allow_void) { type->container_type = parse_type(false); // Don't allow void for array element type. if (type->container_type == nullptr) { push_error(R"(Expected type for collection after "[".)"); + complete_extents(type); type = nullptr; } else if (type->container_type->container_type != nullptr) { push_error("Nested typed collections are not supported."); } consume(GDScriptTokenizer::Token::BRACKET_CLOSE, R"(Expected closing "]" after collection type.)"); + if (type != nullptr) { + complete_extents(type); + } return type; } @@ -3105,6 +3213,7 @@ GDScriptParser::TypeNode *GDScriptParser::parse_type(bool p_allow_void) { } } + complete_extents(type); return type; } @@ -3313,7 +3422,16 @@ void GDScriptParser::get_class_doc_comment(int p_line, String &p_brief, String & p_tutorials.append(Pair<String, String>(title, link)); break; case DONE: - return; + break; + } + } + if (current_class->members.size() > 0) { + const ClassNode::Member &m = current_class->members[0]; + int first_member_line = m.get_line(); + if (first_member_line == line) { + p_brief = ""; + p_desc = ""; + p_tutorials.clear(); } } } @@ -3922,6 +4040,46 @@ GDScriptParser::DataType GDScriptParser::DataType::get_typed_container_type() co return type; } +void GDScriptParser::complete_extents(Node *p_node) { + while (!nodes_in_progress.is_empty() && nodes_in_progress.back()->get() != p_node) { + ERR_PRINT("Parser bug: Mismatch in extents tracking stack."); + nodes_in_progress.pop_back(); + } + if (nodes_in_progress.is_empty()) { + ERR_PRINT("Parser bug: Extents tracking stack is empty."); + } else { + nodes_in_progress.pop_back(); + } +} + +void GDScriptParser::update_extents(Node *p_node) { + p_node->end_line = previous.end_line; + p_node->end_column = previous.end_column; + p_node->leftmost_column = MIN(p_node->leftmost_column, previous.leftmost_column); + p_node->rightmost_column = MAX(p_node->rightmost_column, previous.rightmost_column); +} + +void GDScriptParser::reset_extents(Node *p_node, GDScriptTokenizer::Token p_token) { + p_node->start_line = p_token.start_line; + p_node->end_line = p_token.end_line; + p_node->start_column = p_token.start_column; + p_node->end_column = p_token.end_column; + p_node->leftmost_column = p_token.leftmost_column; + p_node->rightmost_column = p_token.rightmost_column; +} + +void GDScriptParser::reset_extents(Node *p_node, Node *p_from) { + if (p_from == nullptr) { + return; + } + p_node->start_line = p_from->start_line; + p_node->end_line = p_from->end_line; + p_node->start_column = p_from->start_column; + p_node->end_column = p_from->end_column; + p_node->leftmost_column = p_from->leftmost_column; + p_node->rightmost_column = p_from->rightmost_column; +} + /*---------- PRETTY PRINT FOR DEBUG ----------*/ #ifdef DEBUG_ENABLED diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index 8d3295f25b..9c97f98fbc 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -1301,6 +1301,12 @@ private: }; static ParseRule *get_rule(GDScriptTokenizer::Token::Type p_token_type); + List<Node *> nodes_in_progress; + void complete_extents(Node *p_node); + void update_extents(Node *p_node); + void reset_extents(Node *p_node, GDScriptTokenizer::Token p_token); + void reset_extents(Node *p_node, Node *p_from); + template <class T> T *alloc_node() { T *node = memnew(T); @@ -1308,13 +1314,8 @@ private: node->next = list; list = node; - // TODO: Properly set positions for all nodes. - node->start_line = previous.start_line; - node->end_line = previous.end_line; - node->start_column = previous.start_column; - node->end_column = previous.end_column; - node->leftmost_column = previous.leftmost_column; - node->rightmost_column = previous.rightmost_column; + reset_extents(node, previous); + nodes_in_progress.push_back(node); return node; } @@ -1359,7 +1360,7 @@ private: SuiteNode *parse_suite(const String &p_context, SuiteNode *p_suite = nullptr, bool p_for_lambda = false); // Annotations AnnotationNode *parse_annotation(uint32_t p_valid_targets); - bool register_annotation(const MethodInfo &p_info, uint32_t p_target_kinds, AnnotationAction p_apply, int p_optional_arguments = 0, bool p_is_vararg = false); + bool register_annotation(const MethodInfo &p_info, uint32_t p_target_kinds, AnnotationAction p_apply, const Vector<Variant> &p_default_arguments = Vector<Variant>(), bool p_is_vararg = false); bool validate_annotation_arguments(AnnotationNode *p_annotation); void clear_unused_annotations(); bool tool_annotation(const AnnotationNode *p_annotation, Node *p_target); diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp index 1d56dae982..e0beed367a 100644 --- a/modules/gdscript/gdscript_vm.cpp +++ b/modules/gdscript/gdscript_vm.cpp @@ -1032,11 +1032,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a #endif #ifdef DEBUG_ENABLED if (!valid) { - if (src->has_method(*index)) { - err_text = "Invalid get index '" + index->operator String() + "' (on base: '" + _get_var_type(src) + "'). Did you mean '." + index->operator String() + "()' or funcref(obj, \"" + index->operator String() + "\") ?"; - } else { - err_text = "Invalid get index '" + index->operator String() + "' (on base: '" + _get_var_type(src) + "')."; - } + err_text = "Invalid get index '" + index->operator String() + "' (on base: '" + _get_var_type(src) + "')."; OPCODE_BREAK; } *dst = ret; diff --git a/modules/glslang/register_types.cpp b/modules/glslang/register_types.cpp index 64891d9ee8..b1c2140039 100644 --- a/modules/glslang/register_types.cpp +++ b/modules/glslang/register_types.cpp @@ -38,7 +38,8 @@ #include <glslang/Public/ShaderLang.h> #include <glslang/SPIRV/GlslangToSpv.h> -static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage, const String &p_source_code, RenderingDevice::ShaderLanguage p_language, String *r_error, const RenderingDevice::Capabilities *p_capabilities) { +static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage, const String &p_source_code, RenderingDevice::ShaderLanguage p_language, String *r_error, const RenderingDevice *p_render_device) { + const RD::Capabilities *capabilities = p_render_device->get_device_capabilities(); Vector<uint8_t> ret; ERR_FAIL_COND_V(p_language == RenderingDevice::SHADER_LANGUAGE_HLSL, ret); @@ -58,12 +59,12 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage glslang::EShTargetLanguageVersion TargetVersion = glslang::EShTargetSpv_1_5; glslang::TShader::ForbidIncluder includer; - if (p_capabilities->device_family == RenderingDevice::DeviceFamily::DEVICE_VULKAN) { - if (p_capabilities->version_major == 1 && p_capabilities->version_minor == 0) { + if (capabilities->device_family == RenderingDevice::DeviceFamily::DEVICE_VULKAN) { + if (capabilities->version_major == 1 && capabilities->version_minor == 0) { ClientVersion = glslang::EShTargetVulkan_1_0; TargetVersion = glslang::EShTargetSpv_1_0; check_subgroup_support = false; // subgroups are not supported in Vulkan 1.0 - } else if (p_capabilities->version_major == 1 && p_capabilities->version_minor == 1) { + } else if (capabilities->version_major == 1 && capabilities->version_minor == 1) { ClientVersion = glslang::EShTargetVulkan_1_1; TargetVersion = glslang::EShTargetSpv_1_3; } else { @@ -90,34 +91,36 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage if (check_subgroup_support) { uint32_t stage_bit = 1 << p_stage; - if ((p_capabilities->subgroup_in_shaders & stage_bit) == stage_bit) { + uint32_t subgroup_in_shaders = uint32_t(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)); + uint32_t subgroup_operations = uint32_t(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)); + if ((subgroup_in_shaders & stage_bit) == stage_bit) { // stage supports subgroups preamble += "#define has_GL_KHR_shader_subgroup_basic 1\n"; - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_VOTE_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_VOTE_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_vote 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_ARITHMETIC_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_ARITHMETIC_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_arithmetic 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_BALLOT_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_BALLOT_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_ballot 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_SHUFFLE_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_SHUFFLE_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_shuffle 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_SHUFFLE_RELATIVE_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_SHUFFLE_RELATIVE_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_shuffle_relative 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_CLUSTERED_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_CLUSTERED_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_clustered 1\n"; } - if (p_capabilities->subgroup_operations & RenderingDevice::SUBGROUP_QUAD_BIT) { + if (subgroup_operations & RenderingDevice::SUBGROUP_QUAD_BIT) { preamble += "#define has_GL_KHR_shader_subgroup_quad 1\n"; } } } - if (p_capabilities->supports_multiview) { + if (p_render_device->has_feature(RD::SUPPORTS_MULTIVIEW)) { preamble += "#define has_VK_KHR_multiview 1\n"; } @@ -184,9 +187,10 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage return ret; } -static String _get_cache_key_function_glsl(const RenderingDevice::Capabilities *p_capabilities) { +static String _get_cache_key_function_glsl(const RenderingDevice *p_render_device) { + const RD::Capabilities *capabilities = p_render_device->get_device_capabilities(); String version; - version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(p_capabilities->version_major) + ", minor=" + itos(p_capabilities->version_minor) + " , subgroup_size=" + itos(p_capabilities->subgroup_operations) + " , subgroup_ops=" + itos(p_capabilities->subgroup_operations) + " , subgroup_in_shaders=" + itos(p_capabilities->subgroup_in_shaders); + version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(capabilities->version_major) + ", minor=" + itos(capabilities->version_minor) + " , subgroup_size=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_SIZE)) + " , subgroup_ops=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)) + " , subgroup_in_shaders=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)); return version; } diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index 676862ea5a..033591a0b9 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -449,8 +449,8 @@ bool EditorFileSystemImportFormatSupportQueryBlend::query() { EditorNode::get_singleton()->get_gui_base()->add_child(configure_blender_dialog); - configure_blender_dialog->get_ok_button()->set_text(TTR("Confirm Path")); - configure_blender_dialog->get_cancel_button()->set_text(TTR("Disable '.blend' Import")); + configure_blender_dialog->set_ok_button_text(TTR("Confirm Path")); + configure_blender_dialog->set_cancel_button_text(TTR("Disable '.blend' Import")); configure_blender_dialog->get_cancel_button()->set_tooltip(TTR("Disables Blender '.blend' files import for this project. Can be re-enabled in Project Settings.")); configure_blender_dialog->connect("confirmed", callable_mp(this, &EditorFileSystemImportFormatSupportQueryBlend::_path_confirmed)); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2i.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2i.cs index 412a885daa..b61954a84c 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2i.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2i.cs @@ -461,7 +461,7 @@ namespace Godot } /// <summary> - /// Multiplies each component of the <see cref="Vector2i"/> + /// Divides each component of the <see cref="Vector2i"/> /// by the given <see langword="int"/>. /// </summary> /// <param name="vec">The dividend vector.</param> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3i.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3i.cs index abfd2ae720..0d4894f206 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3i.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3i.cs @@ -449,7 +449,7 @@ namespace Godot } /// <summary> - /// Multiplies each component of the <see cref="Vector3i"/> + /// Divides each component of the <see cref="Vector3i"/> /// by the given <see langword="int"/>. /// </summary> /// <param name="vec">The dividend vector.</param> diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 6076b87203..fe2279df69 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -1372,13 +1372,13 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontAdvanced *p_f } p_font_data->style_flags = 0; if (fd->face->style_flags & FT_STYLE_FLAG_BOLD) { - p_font_data->style_flags |= FONT_BOLD; + p_font_data->style_flags.set_flag(FONT_BOLD); } if (fd->face->style_flags & FT_STYLE_FLAG_ITALIC) { - p_font_data->style_flags |= FONT_ITALIC; + p_font_data->style_flags.set_flag(FONT_ITALIC); } if (fd->face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) { - p_font_data->style_flags |= FONT_FIXED_WIDTH; + p_font_data->style_flags.set_flag(FONT_FIXED_WIDTH); } hb_face_t *hb_face = hb_font_get_face(fd->hb_handle); @@ -1629,11 +1629,12 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontAdvanced *p_f hb_ot_name_id_t lbl_id; if (hb_ot_layout_feature_get_name_ids(hb_face, HB_OT_TAG_GSUB, i, &lbl_id, nullptr, nullptr, nullptr, nullptr)) { - String lbl; + PackedInt32Array lbl; unsigned int text_size = hb_ot_name_get_utf32(hb_face, lbl_id, hb_language_from_string(TranslationServer::get_singleton()->get_tool_locale().ascii().get_data(), -1), nullptr, nullptr) + 1; lbl.resize(text_size); + memset((uint32_t *)lbl.ptrw(), 0, sizeof(uint32_t) * text_size); hb_ot_name_get_utf32(hb_face, lbl_id, hb_language_from_string(TranslationServer::get_singleton()->get_tool_locale().ascii().get_data(), -1), &text_size, (uint32_t *)lbl.ptrw()); - ftr["label"] = lbl; + ftr["label"] = String((const char32_t *)lbl.ptr()); } ftr["type"] = _get_tag_type(feature_tags[i]); ftr["hidden"] = _get_tag_hidden(feature_tags[i]); @@ -1651,11 +1652,12 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontAdvanced *p_f hb_ot_name_id_t lbl_id; if (hb_ot_layout_feature_get_name_ids(hb_face, HB_OT_TAG_GPOS, i, &lbl_id, nullptr, nullptr, nullptr, nullptr)) { - String lbl; + PackedInt32Array lbl; unsigned int text_size = hb_ot_name_get_utf32(hb_face, lbl_id, hb_language_from_string(TranslationServer::get_singleton()->get_tool_locale().ascii().get_data(), -1), nullptr, nullptr) + 1; lbl.resize(text_size); + memset((uint32_t *)lbl.ptrw(), 0, sizeof(uint32_t) * text_size); hb_ot_name_get_utf32(hb_face, lbl_id, hb_language_from_string(TranslationServer::get_singleton()->get_tool_locale().ascii().get_data(), -1), &text_size, (uint32_t *)lbl.ptrw()); - ftr["label"] = lbl; + ftr["label"] = String((const char32_t *)lbl.ptr()); } ftr["type"] = _get_tag_type(feature_tags[i]); ftr["hidden"] = _get_tag_hidden(feature_tags[i]); @@ -1842,7 +1844,7 @@ int64_t TextServerAdvanced::font_get_face_count(const RID &p_font_rid) const { return face_count; } -void TextServerAdvanced::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) { +void TextServerAdvanced::font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1852,7 +1854,7 @@ void TextServerAdvanced::font_set_style(const RID &p_font_rid, int64_t /*FontSty fd->style_flags = p_style; } -int64_t /*FontStyle*/ TextServerAdvanced::font_get_style(const RID &p_font_rid) const { +BitField<TextServer::FontStyle> TextServerAdvanced::font_get_style(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -3992,7 +3994,7 @@ RID TextServerAdvanced::shaped_text_get_parent(const RID &p_shaped) const { return sd->parent; } -double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags) { +double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); @@ -4008,7 +4010,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double int start_pos = 0; int end_pos = sd->glyphs.size() - 1; - if ((p_jst_flags & JUSTIFICATION_AFTER_LAST_TAB) == JUSTIFICATION_AFTER_LAST_TAB) { + if (p_jst_flags.has_flag(JUSTIFICATION_AFTER_LAST_TAB)) { int start, end, delta; if (sd->para_direction == DIRECTION_LTR) { start = sd->glyphs.size() - 1; @@ -4034,7 +4036,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double } double justification_width; - if ((p_jst_flags & JUSTIFICATION_CONSTRAIN_ELLIPSIS) == JUSTIFICATION_CONSTRAIN_ELLIPSIS) { + if (p_jst_flags.has_flag(JUSTIFICATION_CONSTRAIN_ELLIPSIS)) { if (sd->overrun_trim_data.trim_pos >= 0) { if (sd->para_direction == DIRECTION_RTL) { start_pos = sd->overrun_trim_data.trim_pos; @@ -4049,7 +4051,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double justification_width = sd->width; } - if ((p_jst_flags & JUSTIFICATION_TRIM_EDGE_SPACES) == JUSTIFICATION_TRIM_EDGE_SPACES) { + if (p_jst_flags.has_flag(JUSTIFICATION_TRIM_EDGE_SPACES)) { // Trim spaces. while ((start_pos < end_pos) && ((sd->glyphs[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (sd->glyphs[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (sd->glyphs[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) { justification_width -= sd->glyphs[start_pos].advance * sd->glyphs[start_pos].repeat; @@ -4088,7 +4090,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double } } - if ((elongation_count > 0) && ((p_jst_flags & JUSTIFICATION_KASHIDA) == JUSTIFICATION_KASHIDA)) { + if ((elongation_count > 0) && p_jst_flags.has_flag(JUSTIFICATION_KASHIDA)) { double delta_width_per_kashida = (p_width - justification_width) / elongation_count; for (int i = start_pos; i <= end_pos; i++) { Glyph &gl = sd->glyphs.write[i]; @@ -4109,7 +4111,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double } } } - if ((space_count > 0) && ((p_jst_flags & JUSTIFICATION_WORD_BOUND) == JUSTIFICATION_WORD_BOUND)) { + if ((space_count > 0) && p_jst_flags.has_flag(JUSTIFICATION_WORD_BOUND)) { double delta_width_per_space = (p_width - justification_width) / space_count; double adv_remain = 0; for (int i = start_pos; i <= end_pos; i++) { @@ -4142,7 +4144,7 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double sd->fit_width_minimum_reached = true; } - if ((p_jst_flags & JUSTIFICATION_CONSTRAIN_ELLIPSIS) != JUSTIFICATION_CONSTRAIN_ELLIPSIS) { + if (!p_jst_flags.has_flag(JUSTIFICATION_CONSTRAIN_ELLIPSIS)) { sd->width = justification_width; } @@ -4205,7 +4207,7 @@ double TextServerAdvanced::shaped_text_tab_align(const RID &p_shaped, const Pack return 0.0; } -void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, int64_t p_trim_flags) { +void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped_line); ERR_FAIL_COND_MSG(!sd, "ShapedTextDataAdvanced invalid."); @@ -4217,14 +4219,14 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l sd->text_trimmed = false; sd->overrun_trim_data.ellipsis_glyph_buf.clear(); - bool add_ellipsis = (p_trim_flags & OVERRUN_ADD_ELLIPSIS) == OVERRUN_ADD_ELLIPSIS; - bool cut_per_word = (p_trim_flags & OVERRUN_TRIM_WORD_ONLY) == OVERRUN_TRIM_WORD_ONLY; - bool enforce_ellipsis = (p_trim_flags & OVERRUN_ENFORCE_ELLIPSIS) == OVERRUN_ENFORCE_ELLIPSIS; - bool justification_aware = (p_trim_flags & OVERRUN_JUSTIFICATION_AWARE) == OVERRUN_JUSTIFICATION_AWARE; + bool add_ellipsis = p_trim_flags.has_flag(OVERRUN_ADD_ELLIPSIS); + bool cut_per_word = p_trim_flags.has_flag(OVERRUN_TRIM_WORD_ONLY); + bool enforce_ellipsis = p_trim_flags.has_flag(OVERRUN_ENFORCE_ELLIPSIS); + bool justification_aware = p_trim_flags.has_flag(OVERRUN_JUSTIFICATION_AWARE); Glyph *sd_glyphs = sd->glyphs.ptrw(); - if ((p_trim_flags & OVERRUN_TRIM) == OVERRUN_NO_TRIM || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { + if (p_trim_flags.has_flag(OVERRUN_TRIM) || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { sd->overrun_trim_data.trim_pos = -1; sd->overrun_trim_data.ellipsis_pos = -1; return; diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 87582e8bac..a772955d90 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -232,7 +232,7 @@ class TextServerAdvanced : public TextServerExtension { double embolden = 0.0; Transform2D transform; - uint32_t style_flags = 0; + BitField<TextServer::FontStyle> style_flags = 0; String font_name; String style_name; @@ -486,8 +486,8 @@ public: virtual int64_t font_get_face_count(const RID &p_font_rid) const override; - virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; - virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; + virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; + virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) override; virtual String font_get_style_name(const RID &p_font_rid) const override; @@ -664,7 +664,7 @@ public: virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const override; virtual RID shaped_text_get_parent(const RID &p_shaped) const override; - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; + virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; virtual bool shaped_text_shape(const RID &p_shaped) override; @@ -676,7 +676,7 @@ public: virtual const Glyph *shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const override; virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, int64_t p_trim_flags) override; + virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; virtual bool shaped_text_is_ready(const RID &p_shaped) const override; diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 7ccc9e3533..b845beb158 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -791,13 +791,13 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_cache_for_size(FontFallback *p_f } p_font_data->style_flags = 0; if (fd->face->style_flags & FT_STYLE_FLAG_BOLD) { - p_font_data->style_flags |= FONT_BOLD; + p_font_data->style_flags.set_flag(FONT_BOLD); } if (fd->face->style_flags & FT_STYLE_FLAG_ITALIC) { - p_font_data->style_flags |= FONT_ITALIC; + p_font_data->style_flags.set_flag(FONT_ITALIC); } if (fd->face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) { - p_font_data->style_flags |= FONT_FIXED_WIDTH; + p_font_data->style_flags.set_flag(FONT_FIXED_WIDTH); } // Read OpenType variations. p_font_data->supported_varaitions.clear(); @@ -891,7 +891,7 @@ void TextServerFallback::font_set_data_ptr(const RID &p_font_rid, const uint8_t fd->data_size = p_data_size; } -void TextServerFallback::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) { +void TextServerFallback::font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -964,7 +964,7 @@ int64_t TextServerFallback::font_get_face_count(const RID &p_font_rid) const { return face_count; } -int64_t /*FontStyle*/ TextServerFallback::font_get_style(const RID &p_font_rid) const { +BitField<TextServer::FontStyle> TextServerFallback::font_get_style(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -2950,7 +2950,7 @@ RID TextServerFallback::shaped_text_get_parent(const RID &p_shaped) const { return sd->parent; } -double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags) { +double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<JustificationFlag> p_jst_flags) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); @@ -2965,7 +2965,7 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double int start_pos = 0; int end_pos = sd->glyphs.size() - 1; - if ((p_jst_flags & JUSTIFICATION_AFTER_LAST_TAB) == JUSTIFICATION_AFTER_LAST_TAB) { + if (p_jst_flags.has_flag(JUSTIFICATION_AFTER_LAST_TAB)) { int start, end, delta; if (sd->para_direction == DIRECTION_LTR) { start = sd->glyphs.size() - 1; @@ -2991,7 +2991,7 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double } double justification_width; - if ((p_jst_flags & JUSTIFICATION_CONSTRAIN_ELLIPSIS) == JUSTIFICATION_CONSTRAIN_ELLIPSIS) { + if (p_jst_flags.has_flag(JUSTIFICATION_CONSTRAIN_ELLIPSIS)) { if (sd->overrun_trim_data.trim_pos >= 0) { end_pos = sd->overrun_trim_data.trim_pos; justification_width = sd->width_trimmed; @@ -3002,7 +3002,7 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double justification_width = sd->width; } - if ((p_jst_flags & JUSTIFICATION_TRIM_EDGE_SPACES) == JUSTIFICATION_TRIM_EDGE_SPACES) { + if (p_jst_flags.has_flag(JUSTIFICATION_TRIM_EDGE_SPACES)) { // Trim spaces. while ((start_pos < end_pos) && ((sd->glyphs[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (sd->glyphs[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (sd->glyphs[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) { justification_width -= sd->glyphs[start_pos].advance * sd->glyphs[start_pos].repeat; @@ -3034,7 +3034,7 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double } } - if ((space_count > 0) && ((p_jst_flags & JUSTIFICATION_WORD_BOUND) == JUSTIFICATION_WORD_BOUND)) { + if ((space_count > 0) && p_jst_flags.has_flag(JUSTIFICATION_WORD_BOUND)) { double delta_width_per_space = (p_width - justification_width) / space_count; for (int i = start_pos; i <= end_pos; i++) { Glyph &gl = sd->glyphs.write[i]; @@ -3052,7 +3052,7 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double sd->fit_width_minimum_reached = true; } - if ((p_jst_flags & JUSTIFICATION_CONSTRAIN_ELLIPSIS) != JUSTIFICATION_CONSTRAIN_ELLIPSIS) { + if (!p_jst_flags.has_flag(JUSTIFICATION_CONSTRAIN_ELLIPSIS)) { sd->width = justification_width; } @@ -3187,7 +3187,7 @@ bool TextServerFallback::shaped_text_update_justification_ops(const RID &p_shape return true; } -void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, int64_t p_trim_flags) { +void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped_line); ERR_FAIL_COND_MSG(!sd, "ShapedTextDataFallback invalid."); @@ -3199,14 +3199,14 @@ void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_l sd->text_trimmed = false; sd->overrun_trim_data.ellipsis_glyph_buf.clear(); - bool add_ellipsis = (p_trim_flags & OVERRUN_ADD_ELLIPSIS) == OVERRUN_ADD_ELLIPSIS; - bool cut_per_word = (p_trim_flags & OVERRUN_TRIM_WORD_ONLY) == OVERRUN_TRIM_WORD_ONLY; - bool enforce_ellipsis = (p_trim_flags & OVERRUN_ENFORCE_ELLIPSIS) == OVERRUN_ENFORCE_ELLIPSIS; - bool justification_aware = (p_trim_flags & OVERRUN_JUSTIFICATION_AWARE) == OVERRUN_JUSTIFICATION_AWARE; + bool add_ellipsis = p_trim_flags.has_flag(OVERRUN_ADD_ELLIPSIS); + bool cut_per_word = p_trim_flags.has_flag(OVERRUN_TRIM_WORD_ONLY); + bool enforce_ellipsis = p_trim_flags.has_flag(OVERRUN_ENFORCE_ELLIPSIS); + bool justification_aware = p_trim_flags.has_flag(OVERRUN_JUSTIFICATION_AWARE); Glyph *sd_glyphs = sd->glyphs.ptrw(); - if ((p_trim_flags & OVERRUN_TRIM) == OVERRUN_NO_TRIM || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { + if (p_trim_flags.has_flag(OVERRUN_TRIM) || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { sd->overrun_trim_data.trim_pos = -1; sd->overrun_trim_data.ellipsis_pos = -1; return; diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index 8b10c9e99e..497403afd7 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -189,7 +189,7 @@ class TextServerFallback : public TextServerExtension { double embolden = 0.0; Transform2D transform; - uint32_t style_flags = 0; + BitField<TextServer::FontStyle> style_flags = 0; String font_name; String style_name; @@ -368,8 +368,8 @@ public: virtual int64_t font_get_face_count(const RID &p_font_rid) const override; - virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; - virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; + virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; + virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) override; virtual String font_get_style_name(const RID &p_font_rid) const override; @@ -545,7 +545,7 @@ public: virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const override; virtual RID shaped_text_get_parent(const RID &p_shaped) const override; - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; + virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; virtual bool shaped_text_shape(const RID &p_shaped) override; @@ -557,7 +557,7 @@ public: virtual const Glyph *shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const override; virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, int64_t p_trim_flags) override; + virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; virtual bool shaped_text_is_ready(const RID &p_shaped) const override; diff --git a/modules/visual_script/editor/visual_script_editor.cpp b/modules/visual_script/editor/visual_script_editor.cpp index ceea0eaf1d..d9419292ba 100644 --- a/modules/visual_script/editor/visual_script_editor.cpp +++ b/modules/visual_script/editor/visual_script_editor.cpp @@ -4717,7 +4717,7 @@ VisualScriptEditor::VisualScriptEditor() { function_create_dialog = memnew(ConfirmationDialog); function_create_dialog->set_title(TTR("Create Function")); function_create_dialog->add_child(function_vb); - function_create_dialog->get_ok_button()->set_text(TTR("Create")); + function_create_dialog->set_ok_button_text(TTR("Create")); function_create_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualScriptEditor::_create_function)); add_child(function_create_dialog); @@ -4761,7 +4761,7 @@ VisualScriptEditor::VisualScriptEditor() { graph->connect("connection_to_empty", callable_mp(this, &VisualScriptEditor::_graph_connect_to_empty)); edit_signal_dialog = memnew(AcceptDialog); - edit_signal_dialog->get_ok_button()->set_text(TTR("Close")); + edit_signal_dialog->set_ok_button_text(TTR("Close")); add_child(edit_signal_dialog); signal_editor = memnew(VisualScriptEditorSignalEdit); @@ -4771,7 +4771,7 @@ VisualScriptEditor::VisualScriptEditor() { edit_signal_edit->edit(signal_editor); edit_variable_dialog = memnew(AcceptDialog); - edit_variable_dialog->get_ok_button()->set_text(TTR("Close")); + edit_variable_dialog->set_ok_button_text(TTR("Close")); add_child(edit_variable_dialog); variable_editor = memnew(VisualScriptEditorVariableEdit); diff --git a/modules/visual_script/editor/visual_script_property_selector.cpp b/modules/visual_script/editor/visual_script_property_selector.cpp index ae30655301..f98ce5bb26 100644 --- a/modules/visual_script/editor/visual_script_property_selector.cpp +++ b/modules/visual_script/editor/visual_script_property_selector.cpp @@ -533,7 +533,7 @@ VisualScriptPropertySelector::VisualScriptPropertySelector() { scroller->add_child(help_bit); help_bit->connect("request_hide", callable_mp(this, &VisualScriptPropertySelector::_hide_requested)); - get_ok_button()->set_text(TTR("Open")); + set_ok_button_text(TTR("Open")); get_ok_button()->set_disabled(true); set_hide_on_ok(false); } diff --git a/platform/iphone/display_server_iphone.mm b/platform/iphone/display_server_iphone.mm index 573ee9b7a8..28ffc9595e 100644 --- a/platform/iphone/display_server_iphone.mm +++ b/platform/iphone/display_server_iphone.mm @@ -195,6 +195,7 @@ void DisplayServerIPhone::window_set_drop_files_callback(const Callable &p_calla } void DisplayServerIPhone::process_events() { + Input::get_singleton()->flush_buffered_events(); } void DisplayServerIPhone::_dispatch_input_events(const Ref<InputEvent> &p_event) { diff --git a/platform/javascript/js/engine/config.js b/platform/javascript/js/engine/config.js index 2e5e1ed0d1..9c4b6c2012 100644 --- a/platform/javascript/js/engine/config.js +++ b/platform/javascript/js/engine/config.js @@ -334,6 +334,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- locale = navigator.languages ? navigator.languages[0] : navigator.language; locale = locale.split('.')[0]; } + locale = locale.replace('-', '_'); const onExit = this.onExit; // Godot configuration. diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index e66fa142a7..91e0fbe0dc 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -2382,7 +2382,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } case WM_MOUSELEAVE: { old_invalid = true; - outside = true; + windows[window_id].mouse_outside = true; _send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_EXIT); @@ -2612,7 +2612,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } } - if (outside) { + if (windows[window_id].mouse_outside) { // Mouse enter. if (mouse_mode != MOUSE_MODE_CAPTURED) { @@ -2622,7 +2622,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA CursorShape c = cursor_shape; cursor_shape = CURSOR_MAX; cursor_set_shape(c); - outside = false; + windows[window_id].mouse_outside = false; // Once-off notification, must call again. track_mouse_leave_event(hWnd); @@ -2713,7 +2713,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } } - if (outside) { + if (windows[window_id].mouse_outside) { // Mouse enter. if (mouse_mode != MOUSE_MODE_CAPTURED) { @@ -2723,7 +2723,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA CursorShape c = cursor_shape; cursor_shape = CURSOR_MAX; cursor_set_shape(c); - outside = false; + windows[window_id].mouse_outside = false; // Once-off notification, must call again. track_mouse_leave_event(hWnd); @@ -3608,8 +3608,6 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win old_invalid = true; mouse_mode = MOUSE_MODE_VISIBLE; - outside = true; - rendering_driver = p_rendering_driver; // Init TTS diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 0429bed3a0..ddbf674c64 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -313,7 +313,6 @@ class DisplayServerWindows : public DisplayServer { int key_event_pos; bool old_invalid; - bool outside; int old_x, old_y; Point2i center; @@ -387,6 +386,7 @@ class DisplayServerWindows : public DisplayServer { Size2 window_rect; Point2 last_pos; + bool mouse_outside = true; ObjectID instance_id; diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index 2616d1f09e..76b354805c 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -439,7 +439,7 @@ void Camera2D::clear_current() { void Camera2D::set_limit(Side p_side, int p_limit) { ERR_FAIL_INDEX((int)p_side, 4); limit[p_side] = p_limit; - update(); + _update_scroll(); } int Camera2D::get_limit(Side p_side) const { diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 8eb48ffb30..9862c4bfb1 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -304,6 +304,7 @@ void PathFollow2D::_bind_methods() { } void PathFollow2D::set_offset(real_t p_offset) { + ERR_FAIL_COND(!isfinite(p_offset)); offset = p_offset; if (path) { if (path->get_curve().is_valid()) { diff --git a/scene/3d/label_3d.cpp b/scene/3d/label_3d.cpp index 0e5771bdb1..bc435c5451 100644 --- a/scene/3d/label_3d.cpp +++ b/scene/3d/label_3d.cpp @@ -452,10 +452,10 @@ void Label3D::_shape() { } lines_rid.clear(); - uint16_t autowrap_flags = TextServer::BREAK_MANDATORY; + BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY; switch (autowrap_mode) { case TextServer::AUTOWRAP_WORD_SMART: - autowrap_flags = TextServer::BREAK_WORD_BOUND_ADAPTIVE | TextServer::BREAK_MANDATORY; + autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY; break; case TextServer::AUTOWRAP_WORD: autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY; diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index abe942b97a..0a15609da1 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -291,7 +291,7 @@ void LightmapGIData::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_probe_data", "data"), &LightmapGIData::_set_probe_data); ClassDB::bind_method(D_METHOD("_get_probe_data"), &LightmapGIData::_get_probe_data); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "light_texture", PROPERTY_HINT_RESOURCE_TYPE, "TextureLayered", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK), "set_light_texture", "get_light_texture"); // property usage default but no save + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "light_texture", PROPERTY_HINT_RESOURCE_TYPE, "TextureLayered", PROPERTY_USAGE_EDITOR), "set_light_texture", "get_light_texture"); // property usage default but no save ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "light_textures", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_light_textures_data", "_get_light_textures_data"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "uses_spherical_harmonics", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_uses_spherical_harmonics", "is_using_spherical_harmonics"); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "user_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_user_data", "_get_user_data"); diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index f53e783fbd..1f10337b4c 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -397,6 +397,7 @@ void PathFollow3D::_bind_methods() { } void PathFollow3D::set_offset(real_t p_offset) { + ERR_FAIL_COND(!isfinite(p_offset)); prev_offset = offset; offset = p_offset; diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index fbd5f31dd5..b342660b85 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -639,6 +639,7 @@ void Skeleton3D::remove_bone_child(int p_bone, int p_child) { } Vector<int> Skeleton3D::get_parentless_bones() { + _update_process_order(); return parentless_bones; } @@ -765,8 +766,6 @@ void Skeleton3D::_make_dirty() { } void Skeleton3D::localize_rests() { - _update_process_order(); - Vector<int> bones_to_process = get_parentless_bones(); while (bones_to_process.size() > 0) { int current_bone_idx = bones_to_process[0]; @@ -958,7 +957,6 @@ Ref<Skin> Skeleton3D::create_skin_from_rest_transforms() { skin.instantiate(); skin->set_bind_count(bones.size()); - _update_process_order(); // Just in case. // Pose changed, rebuild cache of inverses. const Bone *bonesptr = bones.ptr(); diff --git a/scene/animation/animation_blend_space_1d.cpp b/scene/animation/animation_blend_space_1d.cpp index 594f98410e..d9a5adc883 100644 --- a/scene/animation/animation_blend_space_1d.cpp +++ b/scene/animation/animation_blend_space_1d.cpp @@ -78,6 +78,9 @@ void AnimationNodeBlendSpace1D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_value_label", "text"), &AnimationNodeBlendSpace1D::set_value_label); ClassDB::bind_method(D_METHOD("get_value_label"), &AnimationNodeBlendSpace1D::get_value_label); + ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlendSpace1D::set_use_sync); + ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlendSpace1D::is_using_sync); + ClassDB::bind_method(D_METHOD("_add_blend_point", "index", "node"), &AnimationNodeBlendSpace1D::_add_blend_point); for (int i = 0; i < MAX_BLEND_POINTS; i++) { @@ -89,6 +92,7 @@ void AnimationNodeBlendSpace1D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_max_space", "get_max_space"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "snap", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_snap", "get_snap"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "value_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_value_label", "get_value_label"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_use_sync", "is_using_sync"); } void AnimationNodeBlendSpace1D::get_child_nodes(List<ChildNode> *r_child_nodes) { @@ -211,6 +215,14 @@ String AnimationNodeBlendSpace1D::get_value_label() const { return value_label; } +void AnimationNodeBlendSpace1D::set_use_sync(bool p_sync) { + sync = p_sync; +} + +bool AnimationNodeBlendSpace1D::is_using_sync() const { + return sync; +} + void AnimationNodeBlendSpace1D::_add_blend_point(int p_index, const Ref<AnimationRootNode> &p_node) { if (p_index == blend_points_used) { add_blend_point(p_node, 0); @@ -226,7 +238,7 @@ double AnimationNodeBlendSpace1D::process(double p_time, bool p_seek, bool p_see if (blend_points_used == 1) { // only one point available, just play that animation - return blend_node(blend_points[0].name, blend_points[0].node, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, false); + return blend_node(blend_points[0].name, blend_points[0].node, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, true); } double blend_pos = get_parameter(blend_position); @@ -295,9 +307,12 @@ double AnimationNodeBlendSpace1D::process(double p_time, bool p_seek, bool p_see double max_time_remaining = 0.0; for (int i = 0; i < blend_points_used; i++) { - double remaining = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, weights[i], FILTER_IGNORE, false); - - max_time_remaining = MAX(max_time_remaining, remaining); + if (i == point_lower || i == point_higher) { + double remaining = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, weights[i], FILTER_IGNORE, true); + max_time_remaining = MAX(max_time_remaining, remaining); + } else { + blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, 0, FILTER_IGNORE, sync); + } } return max_time_remaining; diff --git a/scene/animation/animation_blend_space_1d.h b/scene/animation/animation_blend_space_1d.h index b2075c8c93..346e8a3a2f 100644 --- a/scene/animation/animation_blend_space_1d.h +++ b/scene/animation/animation_blend_space_1d.h @@ -63,6 +63,8 @@ class AnimationNodeBlendSpace1D : public AnimationRootNode { StringName blend_position = "blend_position"; protected: + bool sync = false; + virtual void _validate_property(PropertyInfo &property) const override; static void _bind_methods(); @@ -93,6 +95,9 @@ public: void set_value_label(const String &p_label); String get_value_label() const; + void set_use_sync(bool p_sync); + bool is_using_sync() const; + double process(double p_time, bool p_seek, bool p_seek_root) override; String get_caption() const override; diff --git a/scene/animation/animation_blend_space_2d.cpp b/scene/animation/animation_blend_space_2d.cpp index acdce2d7de..0f77befd9d 100644 --- a/scene/animation/animation_blend_space_2d.cpp +++ b/scene/animation/animation_blend_space_2d.cpp @@ -502,7 +502,7 @@ double AnimationNodeBlendSpace2D::process(double p_time, bool p_seek, bool p_see for (int j = 0; j < 3; j++) { if (i == triangle_points[j]) { //blend with the given weight - double t = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, blend_weights[j], FILTER_IGNORE, false); + double t = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, blend_weights[j], FILTER_IGNORE, true); if (first || t < mind) { mind = t; first = false; @@ -513,8 +513,7 @@ double AnimationNodeBlendSpace2D::process(double p_time, bool p_seek, bool p_see } if (!found) { - //ignore - blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, 0, FILTER_IGNORE, false); + blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, 0, FILTER_IGNORE, sync); } } } else { @@ -539,16 +538,22 @@ double AnimationNodeBlendSpace2D::process(double p_time, bool p_seek, bool p_see na_n->set_backward(na_c->is_backward()); } //see how much animation remains - from = length_internal - blend_node(blend_points[closest].name, blend_points[closest].node, p_time, false, p_seek_root, 0.0, FILTER_IGNORE, false); + from = length_internal - blend_node(blend_points[closest].name, blend_points[closest].node, p_time, false, p_seek_root, 0.0, FILTER_IGNORE, true); } - mind = blend_node(blend_points[new_closest].name, blend_points[new_closest].node, from, true, p_seek_root, 1.0, FILTER_IGNORE, false); + mind = blend_node(blend_points[new_closest].name, blend_points[new_closest].node, from, true, p_seek_root, 1.0, FILTER_IGNORE, true); length_internal = from + mind; closest = new_closest; } else { - mind = blend_node(blend_points[closest].name, blend_points[closest].node, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, false); + mind = blend_node(blend_points[closest].name, blend_points[closest].node, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, true); + } + + for (int i = 0; i < blend_points_used; i++) { + if (i != closest) { + blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, p_seek_root, 0, FILTER_IGNORE, sync); + } } } @@ -604,6 +609,14 @@ AnimationNodeBlendSpace2D::BlendMode AnimationNodeBlendSpace2D::get_blend_mode() return blend_mode; } +void AnimationNodeBlendSpace2D::set_use_sync(bool p_sync) { + sync = p_sync; +} + +bool AnimationNodeBlendSpace2D::is_using_sync() const { + return sync; +} + void AnimationNodeBlendSpace2D::_bind_methods() { ClassDB::bind_method(D_METHOD("add_blend_point", "node", "pos", "at_index"), &AnimationNodeBlendSpace2D::add_blend_point, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_blend_point_position", "point", "pos"), &AnimationNodeBlendSpace2D::set_blend_point_position); @@ -644,6 +657,9 @@ void AnimationNodeBlendSpace2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_blend_mode", "mode"), &AnimationNodeBlendSpace2D::set_blend_mode); ClassDB::bind_method(D_METHOD("get_blend_mode"), &AnimationNodeBlendSpace2D::get_blend_mode); + ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlendSpace2D::set_use_sync); + ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlendSpace2D::is_using_sync); + ClassDB::bind_method(D_METHOD("_update_triangles"), &AnimationNodeBlendSpace2D::_update_triangles); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_triangles", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_auto_triangles", "get_auto_triangles"); @@ -661,6 +677,7 @@ void AnimationNodeBlendSpace2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "x_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_x_label", "get_x_label"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "y_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_y_label", "get_y_label"); ADD_PROPERTY(PropertyInfo(Variant::INT, "blend_mode", PROPERTY_HINT_ENUM, "Interpolated,Discrete,Carry", PROPERTY_USAGE_NO_EDITOR), "set_blend_mode", "get_blend_mode"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_use_sync", "is_using_sync"); ADD_SIGNAL(MethodInfo("triangles_updated")); BIND_ENUM_CONSTANT(BLEND_MODE_INTERPOLATED); diff --git a/scene/animation/animation_blend_space_2d.h b/scene/animation/animation_blend_space_2d.h index 01f53ed25a..689b96e356 100644 --- a/scene/animation/animation_blend_space_2d.h +++ b/scene/animation/animation_blend_space_2d.h @@ -88,6 +88,8 @@ protected: void _tree_changed(); protected: + bool sync = false; + virtual void _validate_property(PropertyInfo &property) const override; static void _bind_methods(); @@ -137,6 +139,9 @@ public: void set_blend_mode(BlendMode p_blend_mode); BlendMode get_blend_mode() const; + void set_use_sync(bool p_sync); + bool is_using_sync() const; + virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name) override; AnimationNodeBlendSpace2D(); diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 4f6975deb1..d0aac931c0 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -179,6 +179,26 @@ AnimationNodeAnimation::AnimationNodeAnimation() { //////////////////////////////////////////////////////// +void AnimationNodeSync::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeSync::set_use_sync); + ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeSync::is_using_sync); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); +} + +void AnimationNodeSync::set_use_sync(bool p_sync) { + sync = p_sync; +} + +bool AnimationNodeSync::is_using_sync() const { + return sync; +} + +AnimationNodeSync::AnimationNodeSync() { +} + +//////////////////////////////////////////////////////// + void AnimationNodeOneShot::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::BOOL, active)); r_list->push_back(PropertyInfo(Variant::BOOL, prev_active, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE)); @@ -276,7 +296,7 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_seek_roo } if (!active) { - return blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, !sync); + return blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, sync); } } @@ -313,12 +333,12 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_seek_roo double main_rem; if (mix == MIX_MODE_ADD) { - main_rem = blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, !sync); + main_rem = blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, sync); } else { - main_rem = blend_input(0, p_time, p_seek, p_seek_root, 1.0 - blend, FILTER_BLEND, !sync); + main_rem = blend_input(0, p_time, p_seek, p_seek_root, 1.0 - blend, FILTER_BLEND, sync); } - double os_rem = blend_input(1, os_seek ? time : p_time, os_seek, p_seek_root, blend, FILTER_PASS, false); + double os_rem = blend_input(1, os_seek ? time : p_time, os_seek, p_seek_root, blend, FILTER_PASS, true); if (do_start) { remaining = os_rem; @@ -343,14 +363,6 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_seek_roo return MAX(main_rem, remaining); } -void AnimationNodeOneShot::set_use_sync(bool p_sync) { - sync = p_sync; -} - -bool AnimationNodeOneShot::is_using_sync() const { - return sync; -} - void AnimationNodeOneShot::_bind_methods() { ClassDB::bind_method(D_METHOD("set_fadein_time", "time"), &AnimationNodeOneShot::set_fadein_time); ClassDB::bind_method(D_METHOD("get_fadein_time"), &AnimationNodeOneShot::get_fadein_time); @@ -370,9 +382,6 @@ void AnimationNodeOneShot::_bind_methods() { ClassDB::bind_method(D_METHOD("set_mix_mode", "mode"), &AnimationNodeOneShot::set_mix_mode); ClassDB::bind_method(D_METHOD("get_mix_mode"), &AnimationNodeOneShot::get_mix_mode); - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeOneShot::set_use_sync); - ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeOneShot::is_using_sync); - ADD_PROPERTY(PropertyInfo(Variant::INT, "mix_mode", PROPERTY_HINT_ENUM, "Blend,Add"), "set_mix_mode", "get_mix_mode"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fadein_time", PROPERTY_HINT_RANGE, "0,60,0.01,or_greater,suffix:s"), "set_fadein_time", "get_fadein_time"); @@ -384,9 +393,6 @@ void AnimationNodeOneShot::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "autorestart_delay", PROPERTY_HINT_RANGE, "0,60,0.01,or_greater,suffix:s"), "set_autorestart_delay", "get_autorestart_delay"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "autorestart_random_delay", PROPERTY_HINT_RANGE, "0,60,0.01,or_greater,suffix:s"), "set_autorestart_random_delay", "get_autorestart_random_delay"); - ADD_GROUP("", ""); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); - BIND_ENUM_CONSTANT(MIX_MODE_BLEND); BIND_ENUM_CONSTANT(MIX_MODE_ADD); } @@ -410,31 +416,19 @@ String AnimationNodeAdd2::get_caption() const { return "Add2"; } -void AnimationNodeAdd2::set_use_sync(bool p_sync) { - sync = p_sync; -} - -bool AnimationNodeAdd2::is_using_sync() const { - return sync; -} - bool AnimationNodeAdd2::has_filter() const { return true; } double AnimationNodeAdd2::process(double p_time, bool p_seek, bool p_seek_root) { double amount = get_parameter(add_amount); - double rem0 = blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, !sync); - blend_input(1, p_time, p_seek, p_seek_root, amount, FILTER_PASS, !sync); + double rem0 = blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, sync); + blend_input(1, p_time, p_seek, p_seek_root, amount, FILTER_PASS, sync); return rem0; } void AnimationNodeAdd2::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeAdd2::set_use_sync); - ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeAdd2::is_using_sync); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } AnimationNodeAdd2::AnimationNodeAdd2() { @@ -456,32 +450,20 @@ String AnimationNodeAdd3::get_caption() const { return "Add3"; } -void AnimationNodeAdd3::set_use_sync(bool p_sync) { - sync = p_sync; -} - -bool AnimationNodeAdd3::is_using_sync() const { - return sync; -} - bool AnimationNodeAdd3::has_filter() const { return true; } double AnimationNodeAdd3::process(double p_time, bool p_seek, bool p_seek_root) { double amount = get_parameter(add_amount); - blend_input(0, p_time, p_seek, p_seek_root, MAX(0, -amount), FILTER_PASS, !sync); - double rem0 = blend_input(1, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, !sync); - blend_input(2, p_time, p_seek, p_seek_root, MAX(0, amount), FILTER_PASS, !sync); + blend_input(0, p_time, p_seek, p_seek_root, MAX(0, -amount), FILTER_PASS, sync); + double rem0 = blend_input(1, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, sync); + blend_input(2, p_time, p_seek, p_seek_root, MAX(0, amount), FILTER_PASS, sync); return rem0; } void AnimationNodeAdd3::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeAdd3::set_use_sync); - ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeAdd3::is_using_sync); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } AnimationNodeAdd3::AnimationNodeAdd3() { @@ -507,29 +489,17 @@ String AnimationNodeBlend2::get_caption() const { double AnimationNodeBlend2::process(double p_time, bool p_seek, bool p_seek_root) { double amount = get_parameter(blend_amount); - double rem0 = blend_input(0, p_time, p_seek, p_seek_root, 1.0 - amount, FILTER_BLEND, !sync); - double rem1 = blend_input(1, p_time, p_seek, p_seek_root, amount, FILTER_PASS, !sync); + double rem0 = blend_input(0, p_time, p_seek, p_seek_root, 1.0 - amount, FILTER_BLEND, sync); + double rem1 = blend_input(1, p_time, p_seek, p_seek_root, amount, FILTER_PASS, sync); return amount > 0.5 ? rem1 : rem0; //hacky but good enough } -void AnimationNodeBlend2::set_use_sync(bool p_sync) { - sync = p_sync; -} - -bool AnimationNodeBlend2::is_using_sync() const { - return sync; -} - bool AnimationNodeBlend2::has_filter() const { return true; } void AnimationNodeBlend2::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlend2::set_use_sync); - ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlend2::is_using_sync); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } AnimationNodeBlend2::AnimationNodeBlend2() { @@ -551,35 +521,22 @@ String AnimationNodeBlend3::get_caption() const { return "Blend3"; } -void AnimationNodeBlend3::set_use_sync(bool p_sync) { - sync = p_sync; -} - -bool AnimationNodeBlend3::is_using_sync() const { - return sync; -} - double AnimationNodeBlend3::process(double p_time, bool p_seek, bool p_seek_root) { double amount = get_parameter(blend_amount); - double rem0 = blend_input(0, p_time, p_seek, p_seek_root, MAX(0, -amount), FILTER_IGNORE, !sync); - double rem1 = blend_input(1, p_time, p_seek, p_seek_root, 1.0 - ABS(amount), FILTER_IGNORE, !sync); - double rem2 = blend_input(2, p_time, p_seek, p_seek_root, MAX(0, amount), FILTER_IGNORE, !sync); + double rem0 = blend_input(0, p_time, p_seek, p_seek_root, MAX(0, -amount), FILTER_IGNORE, sync); + double rem1 = blend_input(1, p_time, p_seek, p_seek_root, 1.0 - ABS(amount), FILTER_IGNORE, sync); + double rem2 = blend_input(2, p_time, p_seek, p_seek_root, MAX(0, amount), FILTER_IGNORE, sync); return amount > 0.5 ? rem2 : (amount < -0.5 ? rem0 : rem1); //hacky but good enough } void AnimationNodeBlend3::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlend3::set_use_sync); - ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlend3::is_using_sync); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } AnimationNodeBlend3::AnimationNodeBlend3() { add_input("-blend"); add_input("in"); add_input("+blend"); - sync = false; } ///////////////////////////////// @@ -599,9 +556,9 @@ String AnimationNodeTimeScale::get_caption() const { double AnimationNodeTimeScale::process(double p_time, bool p_seek, bool p_seek_root) { double scale = get_parameter(this->scale); if (p_seek) { - return blend_input(0, p_time, true, p_seek_root, 1.0, FILTER_IGNORE, false); + return blend_input(0, p_time, true, p_seek_root, 1.0, FILTER_IGNORE, true); } else { - return blend_input(0, p_time * scale, false, p_seek_root, 1.0, FILTER_IGNORE, false); + return blend_input(0, p_time * scale, false, p_seek_root, 1.0, FILTER_IGNORE, true); } } @@ -629,13 +586,13 @@ String AnimationNodeTimeSeek::get_caption() const { double AnimationNodeTimeSeek::process(double p_time, bool p_seek, bool p_seek_root) { double seek_pos = get_parameter(this->seek_pos); if (p_seek) { - return blend_input(0, p_time, true, p_seek_root, 1.0, FILTER_IGNORE, false); + return blend_input(0, p_time, true, p_seek_root, 1.0, FILTER_IGNORE, true); } else if (seek_pos >= 0) { - double ret = blend_input(0, seek_pos, true, true, 1.0, FILTER_IGNORE, false); + double ret = blend_input(0, seek_pos, true, true, 1.0, FILTER_IGNORE, true); set_parameter(this->seek_pos, -1.0); //reset return ret; } else { - return blend_input(0, p_time, false, p_seek_root, 1.0, FILTER_IGNORE, false); + return blend_input(0, p_time, false, p_seek_root, 1.0, FILTER_IGNORE, true); } } @@ -727,6 +684,14 @@ float AnimationNodeTransition::get_cross_fade_time() const { return xfade; } +void AnimationNodeTransition::set_from_start(bool p_from_start) { + from_start = p_from_start; +} + +bool AnimationNodeTransition::is_from_start() const { + return from_start; +} + double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_seek_root) { int current = get_parameter(this->current); int prev = get_parameter(this->prev); @@ -753,9 +718,15 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_seek_ double rem = 0.0; + for (int i = 0; i < enabled_inputs; i++) { + if (i != current && i != prev) { + blend_input(i, p_time, p_seek, p_seek_root, 0, FILTER_IGNORE, sync); + } + } + if (prev < 0) { // process current animation, check for transition - rem = blend_input(current, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, false); + rem = blend_input(current, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, true); if (p_seek) { time = p_time; @@ -771,18 +742,18 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_seek_ float blend = xfade == 0 ? 0 : (prev_xfading / xfade); - if (!p_seek && switched) { //just switched, seek to start of current + if (from_start && !p_seek && switched) { //just switched, seek to start of current - rem = blend_input(current, 0, true, p_seek_root, 1.0 - blend, FILTER_IGNORE, false); + rem = blend_input(current, 0, true, p_seek_root, 1.0 - blend, FILTER_IGNORE, true); } else { - rem = blend_input(current, p_time, p_seek, p_seek_root, 1.0 - blend, FILTER_IGNORE, false); + rem = blend_input(current, p_time, p_seek, p_seek_root, 1.0 - blend, FILTER_IGNORE, true); } - if (p_seek) { // don't seek prev animation - blend_input(prev, 0, false, p_seek_root, blend, FILTER_IGNORE, false); + if (p_seek) { + blend_input(prev, p_time, true, p_seek_root, blend, FILTER_IGNORE, true); time = p_time; } else { - blend_input(prev, p_time, false, p_seek_root, blend, FILTER_IGNORE, false); + blend_input(prev, p_time, false, p_seek_root, blend, FILTER_IGNORE, true); time += p_time; prev_xfading -= p_time; if (prev_xfading < 0) { @@ -824,8 +795,12 @@ void AnimationNodeTransition::_bind_methods() { ClassDB::bind_method(D_METHOD("set_cross_fade_time", "time"), &AnimationNodeTransition::set_cross_fade_time); ClassDB::bind_method(D_METHOD("get_cross_fade_time"), &AnimationNodeTransition::get_cross_fade_time); + ClassDB::bind_method(D_METHOD("set_from_start", "from_start"), &AnimationNodeTransition::set_from_start); + ClassDB::bind_method(D_METHOD("is_from_start"), &AnimationNodeTransition::is_from_start); + ADD_PROPERTY(PropertyInfo(Variant::INT, "input_count", PROPERTY_HINT_RANGE, "0,64,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_enabled_inputs", "get_enabled_inputs"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "xfade_time", PROPERTY_HINT_RANGE, "0,120,0.01,suffix:s"), "set_cross_fade_time", "get_cross_fade_time"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "from_start"), "set_from_start", "is_from_start"); for (int i = 0; i < MAX_INPUTS; i++) { ADD_PROPERTYI(PropertyInfo(Variant::STRING, "input_" + itos(i) + "/name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_input_caption", "get_input_caption", i); @@ -846,7 +821,7 @@ String AnimationNodeOutput::get_caption() const { } double AnimationNodeOutput::process(double p_time, bool p_seek, bool p_seek_root) { - return blend_input(0, p_time, p_seek, p_seek_root, 1.0); + return blend_input(0, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, true); } AnimationNodeOutput::AnimationNodeOutput() { @@ -1060,7 +1035,7 @@ String AnimationNodeBlendTree::get_caption() const { double AnimationNodeBlendTree::process(double p_time, bool p_seek, bool p_seek_root) { Ref<AnimationNodeOutput> output = nodes[SceneStringNames::get_singleton()->output].node; - return _blend_node("output", nodes[SceneStringNames::get_singleton()->output].connections, this, output, p_time, p_seek, p_seek_root, 1.0); + return _blend_node("output", nodes[SceneStringNames::get_singleton()->output].connections, this, output, p_time, p_seek, p_seek_root, 1.0, FILTER_IGNORE, true); } void AnimationNodeBlendTree::get_node_list(List<StringName> *r_list) { diff --git a/scene/animation/animation_blend_tree.h b/scene/animation/animation_blend_tree.h index 0a2305b8d6..d35ff04f30 100644 --- a/scene/animation/animation_blend_tree.h +++ b/scene/animation/animation_blend_tree.h @@ -77,8 +77,23 @@ private: VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode) -class AnimationNodeOneShot : public AnimationNode { - GDCLASS(AnimationNodeOneShot, AnimationNode); +class AnimationNodeSync : public AnimationNode { + GDCLASS(AnimationNodeSync, AnimationNode); + +protected: + bool sync = false; + + static void _bind_methods(); + +public: + void set_use_sync(bool p_sync); + bool is_using_sync() const; + + AnimationNodeSync(); +}; + +class AnimationNodeOneShot : public AnimationNodeSync { + GDCLASS(AnimationNodeOneShot, AnimationNodeSync); public: enum MixMode { @@ -95,8 +110,6 @@ private: float autorestart_random_delay = 0.0; MixMode mix = MIX_MODE_BLEND; - bool sync = false; - /* bool active; bool do_start; float time; @@ -134,9 +147,6 @@ public: void set_mix_mode(MixMode p_mix); MixMode get_mix_mode() const; - void set_use_sync(bool p_sync); - bool is_using_sync() const; - virtual bool has_filter() const override; virtual double process(double p_time, bool p_seek, bool p_seek_root) override; @@ -145,11 +155,10 @@ public: VARIANT_ENUM_CAST(AnimationNodeOneShot::MixMode) -class AnimationNodeAdd2 : public AnimationNode { - GDCLASS(AnimationNodeAdd2, AnimationNode); +class AnimationNodeAdd2 : public AnimationNodeSync { + GDCLASS(AnimationNodeAdd2, AnimationNodeSync); StringName add_amount = PNAME("add_amount"); - bool sync = false; protected: static void _bind_methods(); @@ -160,20 +169,16 @@ public: virtual String get_caption() const override; - void set_use_sync(bool p_sync); - bool is_using_sync() const; - virtual bool has_filter() const override; virtual double process(double p_time, bool p_seek, bool p_seek_root) override; AnimationNodeAdd2(); }; -class AnimationNodeAdd3 : public AnimationNode { - GDCLASS(AnimationNodeAdd3, AnimationNode); +class AnimationNodeAdd3 : public AnimationNodeSync { + GDCLASS(AnimationNodeAdd3, AnimationNodeSync); StringName add_amount = PNAME("add_amount"); - bool sync = false; protected: static void _bind_methods(); @@ -184,20 +189,16 @@ public: virtual String get_caption() const override; - void set_use_sync(bool p_sync); - bool is_using_sync() const; - virtual bool has_filter() const override; virtual double process(double p_time, bool p_seek, bool p_seek_root) override; AnimationNodeAdd3(); }; -class AnimationNodeBlend2 : public AnimationNode { - GDCLASS(AnimationNodeBlend2, AnimationNode); +class AnimationNodeBlend2 : public AnimationNodeSync { + GDCLASS(AnimationNodeBlend2, AnimationNodeSync); StringName blend_amount = PNAME("blend_amount"); - bool sync = false; protected: static void _bind_methods(); @@ -209,18 +210,14 @@ public: virtual String get_caption() const override; virtual double process(double p_time, bool p_seek, bool p_seek_root) override; - void set_use_sync(bool p_sync); - bool is_using_sync() const; - virtual bool has_filter() const override; AnimationNodeBlend2(); }; -class AnimationNodeBlend3 : public AnimationNode { - GDCLASS(AnimationNodeBlend3, AnimationNode); +class AnimationNodeBlend3 : public AnimationNodeSync { + GDCLASS(AnimationNodeBlend3, AnimationNodeSync); StringName blend_amount = PNAME("blend_amount"); - bool sync; protected: static void _bind_methods(); @@ -231,9 +228,6 @@ public: virtual String get_caption() const override; - void set_use_sync(bool p_sync); - bool is_using_sync() const; - double process(double p_time, bool p_seek, bool p_seek_root) override; AnimationNodeBlend3(); }; @@ -276,8 +270,8 @@ public: AnimationNodeTimeSeek(); }; -class AnimationNodeTransition : public AnimationNode { - GDCLASS(AnimationNodeTransition, AnimationNode); +class AnimationNodeTransition : public AnimationNodeSync { + GDCLASS(AnimationNodeTransition, AnimationNodeSync); enum { MAX_INPUTS = 32 @@ -304,6 +298,7 @@ class AnimationNodeTransition : public AnimationNode { StringName prev_current = "prev_current"; float xfade = 0.0; + bool from_start = true; void _update_inputs(); @@ -329,6 +324,9 @@ public: void set_cross_fade_time(float p_fade); float get_cross_fade_time() const; + void set_from_start(bool p_from_start); + bool is_from_start() const; + double process(double p_time, bool p_seek, bool p_seek_root) override; AnimationNodeTransition(); diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index 2ee7f4fa43..fe08e849a1 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -395,7 +395,7 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s current = p_state_machine->start_node; } - len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 1.0, AnimationNode::FILTER_IGNORE, false); + len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 1.0, AnimationNode::FILTER_IGNORE, true); pos_current = 0; } @@ -420,10 +420,10 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s } } - float rem = p_state_machine->blend_node(current, p_state_machine->states[current].node, p_time, p_seek, p_seek_root, fade_blend, AnimationNode::FILTER_IGNORE, false); + float rem = p_state_machine->blend_node(current, p_state_machine->states[current].node, p_time, p_seek, p_seek_root, fade_blend, AnimationNode::FILTER_IGNORE, true); if (fading_from != StringName()) { - p_state_machine->blend_node(fading_from, p_state_machine->states[fading_from].node, p_time, p_seek, p_seek_root, 1.0 - fade_blend, AnimationNode::FILTER_IGNORE, false); + p_state_machine->blend_node(fading_from, p_state_machine->states[fading_from].node, p_time, p_seek, p_seek_root, 1.0 - fade_blend, AnimationNode::FILTER_IGNORE, true); } //guess playback position @@ -577,12 +577,12 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s } current = next; if (switch_mode == AnimationNodeStateMachineTransition::SWITCH_MODE_SYNC) { - len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, false); + len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, true); pos_current = MIN(pos_current, len_current); - p_state_machine->blend_node(current, p_state_machine->states[current].node, pos_current, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, false); + p_state_machine->blend_node(current, p_state_machine->states[current].node, pos_current, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, true); } else { - len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, false); + len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, p_seek_root, 0, AnimationNode::FILTER_IGNORE, true); pos_current = 0; } diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index 8c8822ac3f..4b80f571ae 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -150,7 +150,7 @@ void AnimationNode::make_invalid(const String &p_reason) { state->invalid_reasons += String::utf8("• ") + p_reason; } -double AnimationNode::blend_input(int p_input, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_optimize) { +double AnimationNode::blend_input(int p_input, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_sync) { ERR_FAIL_INDEX_V(p_input, inputs.size(), 0); ERR_FAIL_COND_V(!state, 0); @@ -169,7 +169,7 @@ double AnimationNode::blend_input(int p_input, double p_time, bool p_seek, bool //inputs.write[p_input].last_pass = state->last_pass; real_t activity = 0.0; - double ret = _blend_node(node_name, blend_tree->get_node_connection_array(node_name), nullptr, node, p_time, p_seek, p_seek_root, p_blend, p_filter, p_optimize, &activity); + double ret = _blend_node(node_name, blend_tree->get_node_connection_array(node_name), nullptr, node, p_time, p_seek, p_seek_root, p_blend, p_filter, p_sync, &activity); Vector<AnimationTree::Activity> *activity_ptr = state->tree->input_activity_map.getptr(base_path); @@ -180,11 +180,11 @@ double AnimationNode::blend_input(int p_input, double p_time, bool p_seek, bool return ret; } -double AnimationNode::blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_optimize) { - return _blend_node(p_sub_path, Vector<StringName>(), this, p_node, p_time, p_seek, p_seek_root, p_blend, p_filter, p_optimize); +double AnimationNode::blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_sync) { + return _blend_node(p_sub_path, Vector<StringName>(), this, p_node, p_time, p_seek, p_seek_root, p_blend, p_filter, p_sync); } -double AnimationNode::_blend_node(const StringName &p_subpath, const Vector<StringName> &p_connections, AnimationNode *p_new_parent, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_optimize, real_t *r_max) { +double AnimationNode::_blend_node(const StringName &p_subpath, const Vector<StringName> &p_connections, AnimationNode *p_new_parent, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter, bool p_sync, real_t *r_max) { ERR_FAIL_COND_V(!p_node.is_valid(), 0); ERR_FAIL_COND_V(!state, 0); @@ -292,9 +292,11 @@ double AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Stri } // If tracks for blending don't exist for one of the animations, Rest or RESET animation is blended as init animation instead. - // Then, blend weight is 0 means that the init animation blend weight is 1. + // Then blend weight is 0 means that the init animation blend weight is 1. + // In that case, processing only the animation with the lacking track will not process the lacking track, and will not properly apply the Reset value. + // This means that all tracks which the animations in the branch that may be blended have must be processed. // Therefore, the blending process must be executed even if the blend weight is 0. - if (!p_seek && p_optimize && !any_valid) { + if (!p_seek && !p_sync && !any_valid) { return p_node->_pre_process(new_path, new_parent, state, 0, p_seek, p_seek_root, p_connections); } return p_node->_pre_process(new_path, new_parent, state, p_time, p_seek, p_seek_root, p_connections); @@ -428,8 +430,8 @@ void AnimationNode::_bind_methods() { ClassDB::bind_method(D_METHOD("_get_filters"), &AnimationNode::_get_filters); ClassDB::bind_method(D_METHOD("blend_animation", "animation", "time", "delta", "seeked", "seek_root", "blend", "pingponged"), &AnimationNode::blend_animation, DEFVAL(0)); - ClassDB::bind_method(D_METHOD("blend_node", "name", "node", "time", "seek", "seek_root", "blend", "filter", "optimize"), &AnimationNode::blend_node, DEFVAL(FILTER_IGNORE), DEFVAL(true)); - ClassDB::bind_method(D_METHOD("blend_input", "input_index", "time", "seek", "seek_root", "blend", "filter", "optimize"), &AnimationNode::blend_input, DEFVAL(FILTER_IGNORE), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("blend_node", "name", "node", "time", "seek", "seek_root", "blend", "filter", "sync"), &AnimationNode::blend_node, DEFVAL(FILTER_IGNORE), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("blend_input", "input_index", "time", "seek", "seek_root", "blend", "filter", "sync"), &AnimationNode::blend_input, DEFVAL(FILTER_IGNORE), DEFVAL(true)); ClassDB::bind_method(D_METHOD("set_parameter", "name", "value"), &AnimationNode::set_parameter); ClassDB::bind_method(D_METHOD("get_parameter", "name"), &AnimationNode::get_parameter); diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index 0bfe615c9b..4f9a330a89 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -99,12 +99,12 @@ public: Array _get_filters() const; void _set_filters(const Array &p_filters); friend class AnimationNodeBlendTree; - double _blend_node(const StringName &p_subpath, const Vector<StringName> &p_connections, AnimationNode *p_new_parent, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_optimize = true, real_t *r_max = nullptr); + double _blend_node(const StringName &p_subpath, const Vector<StringName> &p_connections, AnimationNode *p_new_parent, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_sync = true, real_t *r_max = nullptr); protected: void blend_animation(const StringName &p_animation, double p_time, double p_delta, bool p_seeked, bool p_seek_root, real_t p_blend, int p_pingponged = 0); - double blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_optimize = true); - double blend_input(int p_input, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_optimize = true); + double blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_sync = true); + double blend_input(int p_input, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_sync = true); void make_invalid(const String &p_reason); AnimationTree *get_animation_tree() const; diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp index d8de22d27c..a67f850a86 100644 --- a/scene/gui/button.cpp +++ b/scene/gui/button.cpp @@ -526,7 +526,7 @@ void Button::_bind_methods() { Button::Button(const String &p_text) { text_buf.instantiate(); - text_buf->set_flags(TextServer::BREAK_MANDATORY); + text_buf->set_break_flags(TextServer::BREAK_MANDATORY); set_mouse_filter(MOUSE_FILTER_STOP); set_text(p_text); diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index a2b05ee50d..44e2bb89eb 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -161,6 +161,14 @@ bool AcceptDialog::has_autowrap() { return label->get_autowrap_mode() != TextServer::AUTOWRAP_OFF; } +void AcceptDialog::set_ok_button_text(String p_ok_button_text) { + ok->set_text(p_ok_button_text); +} + +String AcceptDialog::get_ok_button_text() const { + return ok->get_text(); +} + void AcceptDialog::register_text_enter(Control *p_line_edit) { ERR_FAIL_NULL(p_line_edit); LineEdit *line_edit = Object::cast_to<LineEdit>(p_line_edit); @@ -262,7 +270,7 @@ Button *AcceptDialog::add_button(const String &p_text, bool p_right, const Strin Button *AcceptDialog::add_cancel_button(const String &p_cancel) { String c = p_cancel; if (p_cancel.is_empty()) { - c = RTR("Cancel"); + c = "Cancel"; } Button *b = swap_cancel_ok ? add_button(c, true) : add_button(c); b->connect("pressed", callable_mp(this, &AcceptDialog::_cancel_pressed)); @@ -306,11 +314,15 @@ void AcceptDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("get_text"), &AcceptDialog::get_text); ClassDB::bind_method(D_METHOD("set_autowrap", "autowrap"), &AcceptDialog::set_autowrap); ClassDB::bind_method(D_METHOD("has_autowrap"), &AcceptDialog::has_autowrap); + ClassDB::bind_method(D_METHOD("set_ok_button_text", "text"), &AcceptDialog::set_ok_button_text); + ClassDB::bind_method(D_METHOD("get_ok_button_text"), &AcceptDialog::get_ok_button_text); ADD_SIGNAL(MethodInfo("confirmed")); ADD_SIGNAL(MethodInfo("cancelled")); ADD_SIGNAL(MethodInfo("custom_action", PropertyInfo(Variant::STRING_NAME, "action"))); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "ok_button_text"), "set_ok_button_text", "get_ok_button_text"); + ADD_GROUP("Dialog", "dialog"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "dialog_text", PROPERTY_HINT_MULTILINE_TEXT, "", PROPERTY_USAGE_DEFAULT_INTL), "set_text", "get_text"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dialog_hide_on_ok"), "set_hide_on_ok", "get_hide_on_ok"); @@ -349,7 +361,7 @@ AcceptDialog::AcceptDialog() { hbc->add_spacer(); ok = memnew(Button); - ok->set_text(RTR("OK")); + ok->set_text("OK"); hbc->add_child(ok); hbc->add_spacer(); @@ -365,8 +377,20 @@ AcceptDialog::~AcceptDialog() { // ConfirmationDialog +void ConfirmationDialog::set_cancel_button_text(String p_cancel_button_text) { + cancel->set_text(p_cancel_button_text); +} + +String ConfirmationDialog::get_cancel_button_text() const { + return cancel->get_text(); +} + void ConfirmationDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("get_cancel_button"), &ConfirmationDialog::get_cancel_button); + ClassDB::bind_method(D_METHOD("set_cancel_button_text"), &ConfirmationDialog::set_cancel_button_text); + ClassDB::bind_method(D_METHOD("get_cancel_button_text"), &ConfirmationDialog::get_cancel_button_text); + + ADD_PROPERTY(PropertyInfo(Variant::STRING, "cancel_button_text"), "set_cancel_button_text", "get_cancel_button_text"); } Button *ConfirmationDialog::get_cancel_button() { diff --git a/scene/gui/dialogs.h b/scene/gui/dialogs.h index 41fd9c0a10..711361de88 100644 --- a/scene/gui/dialogs.h +++ b/scene/gui/dialogs.h @@ -97,6 +97,9 @@ public: void set_autowrap(bool p_autowrap); bool has_autowrap(); + void set_ok_button_text(String p_ok_button_text); + String get_ok_button_text() const; + AcceptDialog(); ~AcceptDialog(); }; @@ -110,6 +113,10 @@ protected: public: Button *get_cancel_button(); + + void set_cancel_button_text(String p_cancel_button_text); + String get_cancel_button_text() const; + ConfirmationDialog(); }; diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 6bb4ac9c6f..8ec930b753 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -419,10 +419,10 @@ void FileDialog::deselect_all() { switch (mode) { case FILE_MODE_OPEN_FILE: case FILE_MODE_OPEN_FILES: - get_ok_button()->set_text(RTR("Open")); + set_ok_button_text(RTR("Open")); break; case FILE_MODE_OPEN_DIR: - get_ok_button()->set_text(RTR("Select Current Folder")); + set_ok_button_text(RTR("Select Current Folder")); break; case FILE_MODE_OPEN_ANY: case FILE_MODE_SAVE_FILE: @@ -446,7 +446,7 @@ void FileDialog::_tree_selected() { if (!d["dir"]) { file->set_text(d["name"]); } else if (mode == FILE_MODE_OPEN_DIR) { - get_ok_button()->set_text(RTR("Select This Folder")); + set_ok_button_text(RTR("Select This Folder")); } get_ok_button()->set_disabled(_is_open_should_be_disabled()); @@ -673,9 +673,13 @@ void FileDialog::clear_filters() { invalidate(); } -void FileDialog::add_filter(const String &p_filter) { +void FileDialog::add_filter(const String &p_filter, const String &p_description) { ERR_FAIL_COND_MSG(p_filter.begins_with("."), "Filter must be \"filename.extension\", can't start with dot."); - filters.push_back(p_filter); + if (p_description.is_empty()) { + filters.push_back(p_filter); + } else { + filters.push_back(vformat("%s ; %s", p_filter, p_description)); + } update_filters(); invalidate(); } @@ -764,35 +768,35 @@ void FileDialog::set_file_mode(FileMode p_mode) { mode = p_mode; switch (mode) { case FILE_MODE_OPEN_FILE: - get_ok_button()->set_text(RTR("Open")); + set_ok_button_text(RTR("Open")); if (mode_overrides_title) { set_title(TTRC("Open a File")); } makedir->hide(); break; case FILE_MODE_OPEN_FILES: - get_ok_button()->set_text(RTR("Open")); + set_ok_button_text(RTR("Open")); if (mode_overrides_title) { set_title(TTRC("Open File(s)")); } makedir->hide(); break; case FILE_MODE_OPEN_DIR: - get_ok_button()->set_text(RTR("Select Current Folder")); + set_ok_button_text(RTR("Select Current Folder")); if (mode_overrides_title) { set_title(TTRC("Open a Directory")); } makedir->show(); break; case FILE_MODE_OPEN_ANY: - get_ok_button()->set_text(RTR("Open")); + set_ok_button_text(RTR("Open")); if (mode_overrides_title) { set_title(TTRC("Open a File or Directory")); } makedir->show(); break; case FILE_MODE_SAVE_FILE: - get_ok_button()->set_text(RTR("Save")); + set_ok_button_text(RTR("Save")); if (mode_overrides_title) { set_title(TTRC("Save a File")); } @@ -919,7 +923,7 @@ void FileDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_cancel_pressed"), &FileDialog::_cancel_pressed); ClassDB::bind_method(D_METHOD("clear_filters"), &FileDialog::clear_filters); - ClassDB::bind_method(D_METHOD("add_filter", "filter"), &FileDialog::add_filter); + ClassDB::bind_method(D_METHOD("add_filter", "filter", "description"), &FileDialog::add_filter, DEFVAL("")); ClassDB::bind_method(D_METHOD("set_filters", "filters"), &FileDialog::set_filters); ClassDB::bind_method(D_METHOD("get_filters"), &FileDialog::get_filters); ClassDB::bind_method(D_METHOD("get_current_dir"), &FileDialog::get_current_dir); diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h index 8b8d93920c..017c9d8d4f 100644 --- a/scene/gui/file_dialog.h +++ b/scene/gui/file_dialog.h @@ -151,7 +151,7 @@ protected: public: void popup_file_dialog(); void clear_filters(); - void add_filter(const String &p_filter); + void add_filter(const String &p_filter, const String &p_description = ""); void set_filters(const Vector<String> &p_filters); Vector<String> get_filters() const; diff --git a/scene/gui/grid_container.cpp b/scene/gui/grid_container.cpp index 6f8518a7b0..eaa6943ad2 100644 --- a/scene/gui/grid_container.cpp +++ b/scene/gui/grid_container.cpp @@ -41,8 +41,6 @@ void GridContainer::_notification(int p_what) { int hsep = get_theme_constant(SNAME("h_separation")); int vsep = get_theme_constant(SNAME("v_separation")); - int max_col = MIN(get_child_count(), columns); - int max_row = ceil((float)get_child_count() / (float)columns); // Compute the per-column/per-row data. int valid_controls_index = 0; @@ -79,6 +77,9 @@ void GridContainer::_notification(int p_what) { } } + int max_col = MIN(valid_controls_index, columns); + int max_row = ceil((float)valid_controls_index / (float)columns); + // Consider all empty columns expanded. for (int i = valid_controls_index; i < columns; i++) { col_expanded.insert(i); diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 1d4ca4d196..d0a25972f8 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -45,9 +45,9 @@ void ItemList::_shape(int p_idx) { } item.text_buf->add_string(item.text, get_theme_font(SNAME("font")), get_theme_font_size(SNAME("font_size")), item.language); if (icon_mode == ICON_MODE_TOP && max_text_lines > 0) { - item.text_buf->set_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); + item.text_buf->set_break_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); } else { - item.text_buf->set_flags(TextServer::BREAK_NONE); + item.text_buf->set_break_flags(TextServer::BREAK_NONE); } item.text_buf->set_text_overrun_behavior(text_overrun_behavior); item.text_buf->set_max_lines_visible(max_text_lines); @@ -470,10 +470,10 @@ void ItemList::set_max_text_lines(int p_lines) { max_text_lines = p_lines; for (int i = 0; i < items.size(); i++) { if (icon_mode == ICON_MODE_TOP && max_text_lines > 0) { - items.write[i].text_buf->set_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); + items.write[i].text_buf->set_break_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); items.write[i].text_buf->set_max_lines_visible(p_lines); } else { - items.write[i].text_buf->set_flags(TextServer::BREAK_NONE); + items.write[i].text_buf->set_break_flags(TextServer::BREAK_NONE); } } shape_changed = true; @@ -511,9 +511,9 @@ void ItemList::set_icon_mode(IconMode p_mode) { icon_mode = p_mode; for (int i = 0; i < items.size(); i++) { if (icon_mode == ICON_MODE_TOP && max_text_lines > 0) { - items.write[i].text_buf->set_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); + items.write[i].text_buf->set_break_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::BREAK_GRAPHEME_BOUND); } else { - items.write[i].text_buf->set_flags(TextServer::BREAK_NONE); + items.write[i].text_buf->set_break_flags(TextServer::BREAK_NONE); } } shape_changed = true; diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index 5dec1df4a5..84f2ddf700 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -121,10 +121,10 @@ void Label::_shape() { } lines_rid.clear(); - uint16_t autowrap_flags = TextServer::BREAK_MANDATORY; + BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY; switch (autowrap_mode) { case TextServer::AUTOWRAP_WORD_SMART: - autowrap_flags = TextServer::BREAK_WORD_BOUND_ADAPTIVE | TextServer::BREAK_MANDATORY; + autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY; break; case TextServer::AUTOWRAP_WORD: autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY; @@ -158,23 +158,23 @@ void Label::_shape() { } if (lines_dirty) { - uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIM; + BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM; switch (overrun_behavior) { case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_WORD: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); break; case TextServer::OVERRUN_TRIM_CHAR: - overrun_flags |= TextServer::OVERRUN_TRIM; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); break; case TextServer::OVERRUN_NO_TRIMMING: break; @@ -186,7 +186,7 @@ void Label::_shape() { int visible_lines = get_visible_line_count(); bool lines_hidden = visible_lines > 0 && visible_lines < lines_rid.size(); if (lines_hidden) { - overrun_flags |= TextServer::OVERRUN_ENFORCE_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS); } if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { for (int i = 0; i < lines_rid.size(); i++) { @@ -204,7 +204,7 @@ void Label::_shape() { for (int i = 0; i < lines_rid.size(); i++) { if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { TS->shaped_text_fit_to_width(lines_rid[i], width); - overrun_flags |= TextServer::OVERRUN_JUSTIFICATION_AWARE; + overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE); TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); TS->shaped_text_fit_to_width(lines_rid[i], width, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS); } else { diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 05824d54f1..94e0944628 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -149,7 +149,12 @@ RichTextLabel::Item *RichTextLabel::_get_item_at_pos(RichTextLabel::Item *p_item return it; } } break; - case ITEM_NEWLINE: + case ITEM_NEWLINE: { + offset += 1; + if (offset == p_position) { + return it; + } + } break; case ITEM_IMAGE: case ITEM_TABLE: { offset += 1; @@ -426,10 +431,10 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> Line &l = p_frame->lines[p_line]; MutexLock lock(l.text_buf->get_mutex()); - uint16_t autowrap_flags = TextServer::BREAK_MANDATORY; + BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY; switch (autowrap_mode) { case TextServer::AUTOWRAP_WORD_SMART: - autowrap_flags = TextServer::BREAK_WORD_BOUND_ADAPTIVE | TextServer::BREAK_MANDATORY; + autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY; break; case TextServer::AUTOWRAP_WORD: autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY; @@ -443,7 +448,8 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> // Clear cache. l.text_buf->clear(); - l.text_buf->set_flags(autowrap_flags | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_TRIM_EDGE_SPACES); + l.text_buf->set_break_flags(autowrap_flags); + l.text_buf->set_justification_flags(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_TRIM_EDGE_SPACES); l.char_offset = *r_char_offset; l.char_count = 0; @@ -1344,6 +1350,8 @@ void RichTextLabel::_find_click(ItemFrame *p_frame, const Point2i &p_click, Item float RichTextLabel::_find_click_in_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, const Point2i &p_click, ItemFrame **r_click_frame, int *r_click_line, Item **r_click_item, int *r_click_char, bool p_table) { Vector2 off; + bool line_clicked = false; + float text_rect_begin = 0.0; int char_pos = -1; Line &l = p_frame->lines[p_line]; MutexLock lock(l.text_buf->get_mutex()); @@ -1469,7 +1477,11 @@ float RichTextLabel::_find_click_in_line(ItemFrame *p_frame, int p_line, const V } if (p_click.y >= rect.position.y && p_click.y <= rect.position.y + rect.size.y) { - char_pos = TS->shaped_text_hit_test_position(rid, p_click.x - rect.position.x); + if ((!rtl && p_click.x >= rect.position.x) || (rtl && p_click.x <= rect.position.x + rect.size.x)) { + char_pos = TS->shaped_text_hit_test_position(rid, p_click.x - rect.position.x); + } + line_clicked = true; + text_rect_begin = rtl ? rect.position.x + rect.size.x : rect.position.x; } // If table hit was detected, and line hit is in the table bounds use table hit. @@ -1496,23 +1508,38 @@ float RichTextLabel::_find_click_in_line(ItemFrame *p_frame, int p_line, const V } // Text line hit. - if (char_pos >= 0) { + if (line_clicked) { // Find item. if (r_click_item != nullptr) { Item *it = p_frame->lines[p_line].from; Item *it_to = (p_line + 1 < (int)p_frame->lines.size()) ? p_frame->lines[p_line + 1].from : nullptr; - if (char_pos == p_frame->lines[p_line].char_count) { - // Selection after the end of line, select last item. - if (it_to != nullptr) { - *r_click_item = _get_prev_item(it_to); - } else { - for (Item *i = it; i; i = _get_next_item(i)) { - *r_click_item = i; + if (char_pos >= 0) { + *r_click_item = _get_item_at_pos(it, it_to, char_pos); + } else { + int stop = text_rect_begin; + *r_click_item = _find_indentable(it); + while (*r_click_item) { + Ref<Font> font = _find_font(*r_click_item); + if (!font.is_valid()) { + font = get_theme_font(SNAME("normal_font")); + } + int font_size = _find_font_size(*r_click_item); + if (font_size == -1) { + font_size = get_theme_font_size(SNAME("normal_font_size")); + } + if (rtl) { + stop += tab_size * font->get_char_size(' ', font_size).width; + if (stop > p_click.x) { + break; + } + } else { + stop -= tab_size * font->get_char_size(' ', font_size).width; + if (stop < p_click.x) { + break; + } } + *r_click_item = _find_indentable((*r_click_item)->parent); } - } else { - // Selection in the line. - *r_click_item = _get_item_at_pos(it, it_to, char_pos); } } @@ -2069,6 +2096,19 @@ void RichTextLabel::_find_frame(Item *p_item, ItemFrame **r_frame, int *r_line) } } +RichTextLabel::Item *RichTextLabel::_find_indentable(Item *p_item) { + Item *indentable = p_item; + + while (indentable) { + if (indentable->type == ITEM_INDENT || indentable->type == ITEM_LIST) { + return indentable; + } + indentable = indentable->parent; + } + + return indentable; +} + Ref<Font> RichTextLabel::_find_font(Item *p_item) { Item *fontitem = p_item; diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 3b6175e9cf..c123f38c01 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -459,6 +459,7 @@ private: String _roman(int p_num, bool p_capitalize) const; String _letters(int p_num, bool p_capitalize) const; + Item *_find_indentable(Item *p_item); Item *_get_item_at_pos(Item *p_item_from, Item *p_item_to, int p_position); void _find_frame(Item *p_item, ItemFrame **r_frame, int *r_line); int _find_font_size(Item *p_item); diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp index 4b680f72cf..64c07007dc 100644 --- a/scene/gui/slider.cpp +++ b/scene/gui/slider.cpp @@ -96,15 +96,15 @@ void Slider::gui_input(const Ref<InputEvent> &p_event) { if (grab.active) { Size2i size = get_size(); Ref<Texture2D> grabber = get_theme_icon(SNAME("grabber")); - float motion = (orientation == VERTICAL ? mm->get_position().y : mm->get_position().x) - grab.pos; + double motion = (orientation == VERTICAL ? mm->get_position().y : mm->get_position().x) - grab.pos; if (orientation == VERTICAL) { motion = -motion; } - float areasize = orientation == VERTICAL ? size.height - grabber->get_size().height : size.width - grabber->get_size().width; + double areasize = orientation == VERTICAL ? size.height - grabber->get_size().height : size.width - grabber->get_size().width; if (areasize <= 0) { return; } - float umotion = motion / float(areasize); + double umotion = motion / double(areasize); set_as_ratio(grab.uvalue + umotion); } } @@ -180,7 +180,7 @@ void Slider::_notification(int p_what) { if (orientation == VERTICAL) { int widget_width = style->get_minimum_size().width + style->get_center_size().width; - float areasize = size.height - grabber->get_size().height; + double areasize = size.height - grabber->get_size().height; style->draw(ci, Rect2i(Point2i(size.width / 2 - widget_width / 2, 0), Size2i(widget_width, size.height))); grabber_area->draw(ci, Rect2i(Point2i((size.width - widget_width) / 2, size.height - areasize * ratio - grabber->get_size().height / 2), Size2i(widget_width, areasize * ratio + grabber->get_size().height / 2))); @@ -197,7 +197,7 @@ void Slider::_notification(int p_what) { grabber->draw(ci, Point2i(size.width / 2 - grabber->get_size().width / 2, size.height - ratio * areasize - grabber->get_size().height)); } else { int widget_height = style->get_minimum_size().height + style->get_center_size().height; - float areasize = size.width - grabber->get_size().width; + double areasize = size.width - grabber->get_size().width; style->draw(ci, Rect2i(Point2i(0, (size.height - widget_height) / 2), Size2i(size.width, widget_height))); grabber_area->draw(ci, Rect2i(Point2i(0, (size.height - widget_height) / 2), Size2i(areasize * ratio + grabber->get_size().width / 2, widget_height))); @@ -218,11 +218,11 @@ void Slider::_notification(int p_what) { } } -void Slider::set_custom_step(float p_custom_step) { +void Slider::set_custom_step(double p_custom_step) { custom_step = p_custom_step; } -float Slider::get_custom_step() const { +double Slider::get_custom_step() const { return custom_step; } diff --git a/scene/gui/slider.h b/scene/gui/slider.h index 5fbfee2aec..5abaee27aa 100644 --- a/scene/gui/slider.h +++ b/scene/gui/slider.h @@ -38,14 +38,14 @@ class Slider : public Range { struct Grab { int pos = 0; - float uvalue = 0.0; + double uvalue = 0.0; bool active = false; } grab; int ticks = 0; bool mouse_inside = false; Orientation orientation; - float custom_step = -1.0; + double custom_step = -1.0; bool editable = true; bool scrollable = true; @@ -58,8 +58,8 @@ protected: public: virtual Size2 get_minimum_size() const override; - void set_custom_step(float p_custom_step); - float get_custom_step() const; + void set_custom_step(double p_custom_step); + double get_custom_step() const; void set_ticks(int p_count); int get_ticks() const; diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 890e349afb..7924bb13e9 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -167,7 +167,7 @@ void SpinBox::gui_input(const Ref<InputEvent> &p_event) { if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { if (drag.enabled) { drag.diff_y += mm->get_relative().y; - float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SIGN(drag.diff_y); + double diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8) * SIGN(drag.diff_y); set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max())); } else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) { Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index d118b28334..1b1abbcf8e 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -56,11 +56,11 @@ class SpinBox : public Range { void _line_edit_input(const Ref<InputEvent> &p_event); struct Drag { - float base_val = 0.0; + double base_val = 0.0; bool allowed = false; bool enabled = false; Vector2 capture_pos; - float diff_y = 0.0; + double diff_y = 0.0; } drag; void _line_edit_focus_exit(); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 9c6cd6bdb2..06553cd0f6 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1217,7 +1217,7 @@ void TextEdit::_notification(int p_what) { if (brace_open_mismatch) { current_color = brace_mismatch_color; } - Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, font->get_underline_thickness(font_size)); + Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, MAX(font->get_underline_thickness(font_size) * get_theme_default_base_scale(), 1)); draw_rect(rect, current_color); } @@ -1226,7 +1226,7 @@ void TextEdit::_notification(int p_what) { if (brace_close_mismatch) { current_color = brace_mismatch_color; } - Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, font->get_underline_thickness(font_size)); + Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, MAX(font->get_underline_thickness(font_size) * get_theme_default_base_scale(), 1)); draw_rect(rect, current_color); } } diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 4bb8208679..f43a91b85f 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2815,6 +2815,9 @@ void Tree::value_editor_changed(double p_value) { TreeItem::Cell &c = popup_edited_item->cells.write[popup_edited_item_col]; c.val = p_value; + + text_editor->set_text(String::num(c.val, Math::range_step_decimals(c.step))); + item_edited(popup_edited_item_col, popup_edited_item); update(); } diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 5e90615ac1..2cd7cf5648 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -658,32 +658,32 @@ void CanvasItem::draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Tex RenderingServer::get_singleton()->canvas_item_add_multimesh(canvas_item, p_multimesh->get_rid(), texture_rid); } -void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, const Color &p_modulate, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_font.is_null()); - p_font->draw_string(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_modulate, p_flags, p_direction, p_orientation); + p_font->draw_string(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_modulate, p_jst_flags, p_direction, p_orientation); } -void CanvasItem::draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void CanvasItem::draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, const Color &p_modulate, BitField<TextServer::LineBreakFlag> p_brk_flags, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_font.is_null()); - p_font->draw_multiline_string(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_max_lines, p_modulate, p_flags, p_direction, p_orientation); + p_font->draw_multiline_string(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_max_lines, p_modulate, p_brk_flags, p_jst_flags, p_direction, p_orientation); } -void CanvasItem::draw_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void CanvasItem::draw_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_size, const Color &p_modulate, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_font.is_null()); - p_font->draw_string_outline(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_size, p_modulate, p_flags, p_direction, p_orientation); + p_font->draw_string_outline(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_size, p_modulate, p_jst_flags, p_direction, p_orientation); } -void CanvasItem::draw_multiline_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, int p_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void CanvasItem::draw_multiline_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, int p_size, const Color &p_modulate, BitField<TextServer::LineBreakFlag> p_brk_flags, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_font.is_null()); - p_font->draw_multiline_string_outline(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_max_lines, p_size, p_modulate, p_flags, p_direction, p_orientation); + p_font->draw_multiline_string_outline(canvas_item, p_pos, p_text, p_alignment, p_width, p_font_size, p_max_lines, p_size, p_modulate, p_brk_flags, p_jst_flags, p_direction, p_orientation); } void CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_char, int p_font_size, const Color &p_modulate) const { @@ -924,10 +924,10 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("draw_primitive", "points", "colors", "uvs", "texture", "width"), &CanvasItem::draw_primitive, DEFVAL(Ref<Texture2D>()), DEFVAL(1.0)); ClassDB::bind_method(D_METHOD("draw_polygon", "points", "colors", "uvs", "texture"), &CanvasItem::draw_polygon, DEFVAL(PackedVector2Array()), DEFVAL(Ref<Texture2D>())); ClassDB::bind_method(D_METHOD("draw_colored_polygon", "points", "color", "uvs", "texture"), &CanvasItem::draw_colored_polygon, DEFVAL(PackedVector2Array()), DEFVAL(Ref<Texture2D>())); - ClassDB::bind_method(D_METHOD("draw_string", "font", "pos", "text", "alignment", "width", "font_size", "modulate", "flags", "direction", "orientation"), &CanvasItem::draw_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_multiline_string", "font", "pos", "text", "alignment", "width", "font_size", "max_lines", "modulate", "flags", "direction", "orientation"), &CanvasItem::draw_multiline_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_string_outline", "font", "pos", "text", "alignment", "width", "font_size", "size", "modulate", "flags", "direction", "orientation"), &CanvasItem::draw_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_multiline_string_outline", "font", "pos", "text", "alignment", "width", "font_size", "max_lines", "size", "modulate", "flags", "direction", "orientation"), &CanvasItem::draw_multiline_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_string", "font", "pos", "text", "alignment", "width", "font_size", "modulate", "jst_flags", "direction", "orientation"), &CanvasItem::draw_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_multiline_string", "font", "pos", "text", "alignment", "width", "font_size", "max_lines", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &CanvasItem::draw_multiline_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_string_outline", "font", "pos", "text", "alignment", "width", "font_size", "size", "modulate", "jst_flags", "direction", "orientation"), &CanvasItem::draw_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_multiline_string_outline", "font", "pos", "text", "alignment", "width", "font_size", "max_lines", "size", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &CanvasItem::draw_multiline_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); ClassDB::bind_method(D_METHOD("draw_char", "font", "pos", "char", "font_size", "modulate"), &CanvasItem::draw_char, DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(Color(1.0, 1.0, 1.0))); ClassDB::bind_method(D_METHOD("draw_char_outline", "font", "pos", "char", "font_size", "size", "modulate"), &CanvasItem::draw_char_outline, DEFVAL(Font::DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0))); ClassDB::bind_method(D_METHOD("draw_mesh", "mesh", "texture", "transform", "modulate"), &CanvasItem::draw_mesh, DEFVAL(Transform2D()), DEFVAL(Color(1, 1, 1, 1))); diff --git a/scene/main/canvas_item.h b/scene/main/canvas_item.h index c88878725f..a4574dce61 100644 --- a/scene/main/canvas_item.h +++ b/scene/main/canvas_item.h @@ -235,11 +235,11 @@ public: void draw_mesh(const Ref<Mesh> &p_mesh, const Ref<Texture2D> &p_texture, const Transform2D &p_transform = Transform2D(), const Color &p_modulate = Color(1, 1, 1)); void draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Texture2D> &p_texture); - void draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - void draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, int p_max_lines = -1, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + void draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + void draw_multiline_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, int p_max_lines = -1, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::LineBreakFlag> p_brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - void draw_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_size = 1, int p_font_size = Font::DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - void draw_multiline_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, int p_max_lines = -1, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + void draw_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_size = 1, int p_font_size = Font::DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + void draw_multiline_string_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = Font::DEFAULT_FONT_SIZE, int p_max_lines = -1, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::LineBreakFlag> p_brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; void draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_char, int p_font_size = Font::DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0)) const; void draw_char_outline(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_char, int p_font_size = Font::DEFAULT_FONT_SIZE, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0)) const; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index a76c00efcb..66482f65dc 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -34,6 +34,7 @@ #include "core/debugger/engine_debugger.h" #include "core/input/input.h" #include "core/io/dir_access.h" +#include "core/io/image_loader.h" #include "core/io/marshalls.h" #include "core/io/resource_loader.h" #include "core/multiplayer/multiplayer_api.h" @@ -1446,25 +1447,48 @@ SceneTree::SceneTree() { bool snap_2d_vertices = GLOBAL_DEF("rendering/2d/snap/snap_2d_vertices_to_pixel", false); root->set_snap_2d_vertices_to_pixel(snap_2d_vertices); - int shadowmap_size = GLOBAL_DEF("rendering/shadows/shadow_atlas/size", 4096); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadow_atlas/size", PropertyInfo(Variant::INT, "rendering/shadows/shadow_atlas/size", PROPERTY_HINT_RANGE, "256,16384")); - GLOBAL_DEF("rendering/shadows/shadow_atlas/size.mobile", 2048); - bool shadowmap_16_bits = GLOBAL_DEF("rendering/shadows/shadow_atlas/16_bits", true); - int atlas_q0 = GLOBAL_DEF("rendering/shadows/shadow_atlas/quadrant_0_subdiv", 2); - int atlas_q1 = GLOBAL_DEF("rendering/shadows/shadow_atlas/quadrant_1_subdiv", 2); - int atlas_q2 = GLOBAL_DEF("rendering/shadows/shadow_atlas/quadrant_2_subdiv", 3); - int atlas_q3 = GLOBAL_DEF("rendering/shadows/shadow_atlas/quadrant_3_subdiv", 4); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadow_atlas/quadrant_0_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/shadow_atlas/quadrant_0_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadow_atlas/quadrant_1_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/shadow_atlas/quadrant_1_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadow_atlas/quadrant_2_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/shadow_atlas/quadrant_2_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadow_atlas/quadrant_3_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/shadow_atlas/quadrant_3_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); - - root->set_shadow_atlas_size(shadowmap_size); - root->set_shadow_atlas_16_bits(shadowmap_16_bits); - root->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0)); - root->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1)); - root->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2)); - root->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3)); + // We setup VRS for the main viewport here, in the editor this will have little effect. + const int vrs_mode = GLOBAL_DEF("rendering/vrs/mode", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/vrs/mode", PropertyInfo(Variant::INT, "rendering/vrs/mode", PROPERTY_HINT_ENUM, String::utf8("Disabled,Texture,XR"))); + root->set_vrs_mode(Viewport::VRSMode(vrs_mode)); + const String vrs_texture_path = String(GLOBAL_DEF("rendering/vrs/texture", String())).strip_edges(); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/vrs/texture", + PropertyInfo(Variant::STRING, + "rendering/vrs/texture", + PROPERTY_HINT_FILE, "*.png")); + if (vrs_mode == 1 && !vrs_texture_path.is_empty()) { + Ref<Image> vrs_image; + vrs_image.instantiate(); + Error load_err = ImageLoader::load_image(vrs_texture_path, vrs_image); + if (load_err) { + ERR_PRINT("Non-existing or invalid VRS texture at '" + vrs_texture_path + "'."); + } else { + Ref<ImageTexture> vrs_texture; + vrs_texture.instantiate(); + vrs_texture->create_from_image(vrs_image); + root->set_vrs_texture(vrs_texture); + } + } + + int shadowmap_size = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_size", 4096); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/atlas_size", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/atlas_size", PROPERTY_HINT_RANGE, "256,16384")); + GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_size.mobile", 2048); + bool shadowmap_16_bits = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_16_bits", true); + int atlas_q0 = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_quadrant_0_subdiv", 2); + int atlas_q1 = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_quadrant_1_subdiv", 2); + int atlas_q2 = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_quadrant_2_subdiv", 3); + int atlas_q3 = GLOBAL_DEF("rendering/shadows/positional_shadow/atlas_quadrant_3_subdiv", 4); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/atlas_quadrant_0_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/atlas_quadrant_0_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/atlas_quadrant_1_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/atlas_quadrant_1_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/atlas_quadrant_2_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/atlas_quadrant_2_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/atlas_quadrant_3_subdiv", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/atlas_quadrant_3_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); + + root->set_positional_shadow_atlas_size(shadowmap_size); + root->set_positional_shadow_atlas_16_bits(shadowmap_16_bits); + root->set_positional_shadow_atlas_quadrant_subdiv(0, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q0)); + root->set_positional_shadow_atlas_quadrant_subdiv(1, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q1)); + root->set_positional_shadow_atlas_quadrant_subdiv(2, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q2)); + root->set_positional_shadow_atlas_quadrant_subdiv(3, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q3)); Viewport::SDFOversize sdf_oversize = Viewport::SDFOversize(int(GLOBAL_DEF("rendering/2d/sdf/oversize", 1))); root->set_sdf_oversize(sdf_oversize); diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index a34aa8e2cd..a512feacc8 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -90,8 +90,8 @@ private: Window *root = nullptr; uint64_t tree_version = 1; - double physics_process_time = 1.0; - double process_time = 1.0; + double physics_process_time = 0.0; + double process_time = 0.0; bool accept_quit = true; bool quit_on_go_back = true; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 0080e899c3..0031abd953 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1037,44 +1037,44 @@ Ref<ViewportTexture> Viewport::get_texture() const { return default_texture; } -void Viewport::set_shadow_atlas_size(int p_size) { - shadow_atlas_size = p_size; - RS::get_singleton()->viewport_set_shadow_atlas_size(viewport, p_size, shadow_atlas_16_bits); +void Viewport::set_positional_shadow_atlas_size(int p_size) { + positional_shadow_atlas_size = p_size; + RS::get_singleton()->viewport_set_positional_shadow_atlas_size(viewport, p_size, positional_shadow_atlas_16_bits); } -int Viewport::get_shadow_atlas_size() const { - return shadow_atlas_size; +int Viewport::get_positional_shadow_atlas_size() const { + return positional_shadow_atlas_size; } -void Viewport::set_shadow_atlas_16_bits(bool p_16_bits) { - if (shadow_atlas_16_bits == p_16_bits) { +void Viewport::set_positional_shadow_atlas_16_bits(bool p_16_bits) { + if (positional_shadow_atlas_16_bits == p_16_bits) { return; } - shadow_atlas_16_bits = p_16_bits; - RS::get_singleton()->viewport_set_shadow_atlas_size(viewport, shadow_atlas_size, shadow_atlas_16_bits); + positional_shadow_atlas_16_bits = p_16_bits; + RS::get_singleton()->viewport_set_positional_shadow_atlas_size(viewport, positional_shadow_atlas_size, positional_shadow_atlas_16_bits); } -bool Viewport::get_shadow_atlas_16_bits() const { - return shadow_atlas_16_bits; +bool Viewport::get_positional_shadow_atlas_16_bits() const { + return positional_shadow_atlas_16_bits; } -void Viewport::set_shadow_atlas_quadrant_subdiv(int p_quadrant, ShadowAtlasQuadrantSubdiv p_subdiv) { +void Viewport::set_positional_shadow_atlas_quadrant_subdiv(int p_quadrant, PositionalShadowAtlasQuadrantSubdiv p_subdiv) { ERR_FAIL_INDEX(p_quadrant, 4); ERR_FAIL_INDEX(p_subdiv, SHADOW_ATLAS_QUADRANT_SUBDIV_MAX); - if (shadow_atlas_quadrant_subdiv[p_quadrant] == p_subdiv) { + if (positional_shadow_atlas_quadrant_subdiv[p_quadrant] == p_subdiv) { return; } - shadow_atlas_quadrant_subdiv[p_quadrant] = p_subdiv; + positional_shadow_atlas_quadrant_subdiv[p_quadrant] = p_subdiv; static const int subdiv[SHADOW_ATLAS_QUADRANT_SUBDIV_MAX] = { 0, 1, 4, 16, 64, 256, 1024 }; - RS::get_singleton()->viewport_set_shadow_atlas_quadrant_subdivision(viewport, p_quadrant, subdiv[p_subdiv]); + RS::get_singleton()->viewport_set_positional_shadow_atlas_quadrant_subdivision(viewport, p_quadrant, subdiv[p_subdiv]); } -Viewport::ShadowAtlasQuadrantSubdiv Viewport::get_shadow_atlas_quadrant_subdiv(int p_quadrant) const { +Viewport::PositionalShadowAtlasQuadrantSubdiv Viewport::get_positional_shadow_atlas_quadrant_subdiv(int p_quadrant) const { ERR_FAIL_INDEX_V(p_quadrant, 4, SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED); - return shadow_atlas_quadrant_subdiv[p_quadrant]; + return positional_shadow_atlas_quadrant_subdiv[p_quadrant]; } Transform2D Viewport::_get_input_pre_xform() const { @@ -3080,6 +3080,41 @@ Viewport::DefaultCanvasItemTextureRepeat Viewport::get_default_canvas_item_textu return default_canvas_item_texture_repeat; } +void Viewport::set_vrs_mode(Viewport::VRSMode p_vrs_mode) { + // Note, set this even if not supported on this hardware, it will only be used if it is but we want to save the value as set by the user. + vrs_mode = p_vrs_mode; + + switch (p_vrs_mode) { + case VRS_TEXTURE: { + RS::get_singleton()->viewport_set_vrs_mode(viewport, RS::VIEWPORT_VRS_TEXTURE); + } break; + case VRS_XR: { + RS::get_singleton()->viewport_set_vrs_mode(viewport, RS::VIEWPORT_VRS_XR); + } break; + default: { + RS::get_singleton()->viewport_set_vrs_mode(viewport, RS::VIEWPORT_VRS_DISABLED); + } break; + } + + notify_property_list_changed(); +} + +Viewport::VRSMode Viewport::get_vrs_mode() const { + return vrs_mode; +} + +void Viewport::set_vrs_texture(Ref<Texture2D> p_texture) { + vrs_texture = p_texture; + + // TODO need to add something here in case the RID changes + RID tex = p_texture.is_valid() ? p_texture->get_rid() : RID(); + RS::get_singleton()->viewport_set_vrs_texture(viewport, tex); +} + +Ref<Texture2D> Viewport::get_vrs_texture() const { + return vrs_texture; +} + DisplayServer::WindowID Viewport::get_window_id() const { return DisplayServer::MAIN_WINDOW_ID; } @@ -3667,11 +3702,11 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("_gui_remove_focus_for_window"), &Viewport::_gui_remove_focus_for_window); ClassDB::bind_method(D_METHOD("_post_gui_grab_click_focus"), &Viewport::_post_gui_grab_click_focus); - ClassDB::bind_method(D_METHOD("set_shadow_atlas_size", "size"), &Viewport::set_shadow_atlas_size); - ClassDB::bind_method(D_METHOD("get_shadow_atlas_size"), &Viewport::get_shadow_atlas_size); + ClassDB::bind_method(D_METHOD("set_positional_shadow_atlas_size", "size"), &Viewport::set_positional_shadow_atlas_size); + ClassDB::bind_method(D_METHOD("get_positional_shadow_atlas_size"), &Viewport::get_positional_shadow_atlas_size); - ClassDB::bind_method(D_METHOD("set_shadow_atlas_16_bits", "enable"), &Viewport::set_shadow_atlas_16_bits); - ClassDB::bind_method(D_METHOD("get_shadow_atlas_16_bits"), &Viewport::get_shadow_atlas_16_bits); + ClassDB::bind_method(D_METHOD("set_positional_shadow_atlas_16_bits", "enable"), &Viewport::set_positional_shadow_atlas_16_bits); + ClassDB::bind_method(D_METHOD("get_positional_shadow_atlas_16_bits"), &Viewport::get_positional_shadow_atlas_16_bits); ClassDB::bind_method(D_METHOD("set_snap_controls_to_pixels", "enabled"), &Viewport::set_snap_controls_to_pixels); ClassDB::bind_method(D_METHOD("is_snap_controls_to_pixels_enabled"), &Viewport::is_snap_controls_to_pixels_enabled); @@ -3682,8 +3717,8 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_snap_2d_vertices_to_pixel", "enabled"), &Viewport::set_snap_2d_vertices_to_pixel); ClassDB::bind_method(D_METHOD("is_snap_2d_vertices_to_pixel_enabled"), &Viewport::is_snap_2d_vertices_to_pixel_enabled); - ClassDB::bind_method(D_METHOD("set_shadow_atlas_quadrant_subdiv", "quadrant", "subdiv"), &Viewport::set_shadow_atlas_quadrant_subdiv); - ClassDB::bind_method(D_METHOD("get_shadow_atlas_quadrant_subdiv", "quadrant"), &Viewport::get_shadow_atlas_quadrant_subdiv); + ClassDB::bind_method(D_METHOD("set_positional_shadow_atlas_quadrant_subdiv", "quadrant", "subdiv"), &Viewport::set_positional_shadow_atlas_quadrant_subdiv); + ClassDB::bind_method(D_METHOD("get_positional_shadow_atlas_quadrant_subdiv", "quadrant"), &Viewport::get_positional_shadow_atlas_quadrant_subdiv); ClassDB::bind_method(D_METHOD("set_input_as_handled"), &Viewport::set_input_as_handled); ClassDB::bind_method(D_METHOD("is_input_handled"), &Viewport::is_input_handled); @@ -3741,6 +3776,12 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_fsr_mipmap_bias", "fsr_mipmap_bias"), &Viewport::set_fsr_mipmap_bias); ClassDB::bind_method(D_METHOD("get_fsr_mipmap_bias"), &Viewport::get_fsr_mipmap_bias); + ClassDB::bind_method(D_METHOD("set_vrs_mode", "mode"), &Viewport::set_vrs_mode); + ClassDB::bind_method(D_METHOD("get_vrs_mode"), &Viewport::get_vrs_mode); + + ClassDB::bind_method(D_METHOD("set_vrs_texture", "texture"), &Viewport::set_vrs_texture); + ClassDB::bind_method(D_METHOD("get_vrs_texture"), &Viewport::get_vrs_texture); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_3d"), "set_disable_3d", "is_3d_disabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_xr"), "set_use_xr", "is_using_xr"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "own_world_3d"), "set_use_own_world_3d", "is_using_own_world_3d"); @@ -3766,6 +3807,9 @@ void Viewport::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fsr_mipmap_bias", PROPERTY_HINT_RANGE, "-2,2,0.1"), "set_fsr_mipmap_bias", "get_fsr_mipmap_bias"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fsr_sharpness", PROPERTY_HINT_RANGE, "0,2,0.1"), "set_fsr_sharpness", "get_fsr_sharpness"); #endif + ADD_GROUP("Variable Rate Shading", "vrs_"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "vrs_mode", PROPERTY_HINT_ENUM, "Disabled,Texture,Depth buffer,XR"), "set_vrs_mode", "get_vrs_mode"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "vrs_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_vrs_texture", "get_vrs_texture"); ADD_GROUP("Canvas Items", "canvas_item_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Linear Mipmap,Nearest Mipmap"), "set_default_canvas_item_texture_filter", "get_default_canvas_item_texture_filter"); ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_repeat", PROPERTY_HINT_ENUM, "Disabled,Enabled,Mirror"), "set_default_canvas_item_texture_repeat", "get_default_canvas_item_texture_repeat"); @@ -3783,13 +3827,13 @@ void Viewport::_bind_methods() { ADD_GROUP("SDF", "sdf_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "sdf_oversize", PROPERTY_HINT_ENUM, "100%,120%,150%,200%"), "set_sdf_oversize", "get_sdf_oversize"); ADD_PROPERTY(PropertyInfo(Variant::INT, "sdf_scale", PROPERTY_HINT_ENUM, "100%,50%,25%"), "set_sdf_scale", "get_sdf_scale"); - ADD_GROUP("Shadow Atlas", "shadow_atlas_"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "shadow_atlas_size"), "set_shadow_atlas_size", "get_shadow_atlas_size"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shadow_atlas_16_bits"), "set_shadow_atlas_16_bits", "get_shadow_atlas_16_bits"); - ADD_PROPERTYI(PropertyInfo(Variant::INT, "shadow_atlas_quad_0", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_shadow_atlas_quadrant_subdiv", "get_shadow_atlas_quadrant_subdiv", 0); - ADD_PROPERTYI(PropertyInfo(Variant::INT, "shadow_atlas_quad_1", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_shadow_atlas_quadrant_subdiv", "get_shadow_atlas_quadrant_subdiv", 1); - ADD_PROPERTYI(PropertyInfo(Variant::INT, "shadow_atlas_quad_2", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_shadow_atlas_quadrant_subdiv", "get_shadow_atlas_quadrant_subdiv", 2); - ADD_PROPERTYI(PropertyInfo(Variant::INT, "shadow_atlas_quad_3", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_shadow_atlas_quadrant_subdiv", "get_shadow_atlas_quadrant_subdiv", 3); + ADD_GROUP("Positional Shadow Atlas", "positional_shadow_atlas_"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "positional_shadow_atlas_size"), "set_positional_shadow_atlas_size", "get_positional_shadow_atlas_size"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "positional_shadow_atlas_16_bits"), "set_positional_shadow_atlas_16_bits", "get_positional_shadow_atlas_16_bits"); + ADD_PROPERTYI(PropertyInfo(Variant::INT, "positional_shadow_atlas_quad_0", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_positional_shadow_atlas_quadrant_subdiv", "get_positional_shadow_atlas_quadrant_subdiv", 0); + ADD_PROPERTYI(PropertyInfo(Variant::INT, "positional_shadow_atlas_quad_1", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_positional_shadow_atlas_quadrant_subdiv", "get_positional_shadow_atlas_quadrant_subdiv", 1); + ADD_PROPERTYI(PropertyInfo(Variant::INT, "positional_shadow_atlas_quad_2", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_positional_shadow_atlas_quadrant_subdiv", "get_positional_shadow_atlas_quadrant_subdiv", 2); + ADD_PROPERTYI(PropertyInfo(Variant::INT, "positional_shadow_atlas_quad_3", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), "set_positional_shadow_atlas_quadrant_subdiv", "get_positional_shadow_atlas_quadrant_subdiv", 3); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "canvas_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_canvas_transform", "get_canvas_transform"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "global_canvas_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_canvas_transform", "get_global_canvas_transform"); @@ -3876,6 +3920,17 @@ void Viewport::_bind_methods() { BIND_ENUM_CONSTANT(SDF_SCALE_50_PERCENT); BIND_ENUM_CONSTANT(SDF_SCALE_25_PERCENT); BIND_ENUM_CONSTANT(SDF_SCALE_MAX); + + BIND_ENUM_CONSTANT(VRS_DISABLED); + BIND_ENUM_CONSTANT(VRS_TEXTURE); + BIND_ENUM_CONSTANT(VRS_XR); + BIND_ENUM_CONSTANT(VRS_MAX); +} + +void Viewport::_validate_property(PropertyInfo &property) const { + if (vrs_mode != VRS_TEXTURE && (property.name == "vrs_texture")) { + property.usage = PROPERTY_USAGE_NO_EDITOR; + } } Viewport::Viewport() { @@ -3891,15 +3946,15 @@ Viewport::Viewport() { canvas_layers.insert(nullptr); // This eases picking code (interpreted as the canvas of the Viewport). - set_shadow_atlas_size(shadow_atlas_size); + set_positional_shadow_atlas_size(positional_shadow_atlas_size); for (int i = 0; i < 4; i++) { - shadow_atlas_quadrant_subdiv[i] = SHADOW_ATLAS_QUADRANT_SUBDIV_MAX; + positional_shadow_atlas_quadrant_subdiv[i] = SHADOW_ATLAS_QUADRANT_SUBDIV_MAX; } - set_shadow_atlas_quadrant_subdiv(0, SHADOW_ATLAS_QUADRANT_SUBDIV_4); - set_shadow_atlas_quadrant_subdiv(1, SHADOW_ATLAS_QUADRANT_SUBDIV_4); - set_shadow_atlas_quadrant_subdiv(2, SHADOW_ATLAS_QUADRANT_SUBDIV_16); - set_shadow_atlas_quadrant_subdiv(3, SHADOW_ATLAS_QUADRANT_SUBDIV_64); + set_positional_shadow_atlas_quadrant_subdiv(0, SHADOW_ATLAS_QUADRANT_SUBDIV_4); + set_positional_shadow_atlas_quadrant_subdiv(1, SHADOW_ATLAS_QUADRANT_SUBDIV_4); + set_positional_shadow_atlas_quadrant_subdiv(2, SHADOW_ATLAS_QUADRANT_SUBDIV_16); + set_positional_shadow_atlas_quadrant_subdiv(3, SHADOW_ATLAS_QUADRANT_SUBDIV_64); set_mesh_lod_threshold(mesh_lod_threshold); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index a22a2acf49..a43e3f3ee2 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -95,7 +95,7 @@ public: SCALING_3D_MODE_MAX }; - enum ShadowAtlasQuadrantSubdiv { + enum PositionalShadowAtlasQuadrantSubdiv { SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED, SHADOW_ATLAS_QUADRANT_SUBDIV_1, SHADOW_ATLAS_QUADRANT_SUBDIV_4, @@ -197,6 +197,13 @@ public: SUBWINDOW_CANVAS_LAYER = 1024 }; + enum VRSMode { + VRS_DISABLED, + VRS_TEXTURE, + VRS_XR, + VRS_MAX + }; + private: friend class ViewportTexture; @@ -286,9 +293,9 @@ private: DebugDraw debug_draw = DEBUG_DRAW_DISABLED; - int shadow_atlas_size = 2048; - bool shadow_atlas_16_bits = true; - ShadowAtlasQuadrantSubdiv shadow_atlas_quadrant_subdiv[4]; + int positional_shadow_atlas_size = 2048; + bool positional_shadow_atlas_16_bits = true; + PositionalShadowAtlasQuadrantSubdiv positional_shadow_atlas_quadrant_subdiv[4]; MSAA msaa = MSAA_DISABLED; ScreenSpaceAA screen_space_aa = SCREEN_SPACE_AA_DISABLED; @@ -333,6 +340,10 @@ private: RID canvas_item; }; + // VRS + VRSMode vrs_mode = VRS_DISABLED; + Ref<Texture2D> vrs_texture; + struct GUI { // info used when this is a window @@ -502,14 +513,14 @@ public: Ref<ViewportTexture> get_texture() const; - void set_shadow_atlas_size(int p_size); - int get_shadow_atlas_size() const; + void set_positional_shadow_atlas_size(int p_size); + int get_positional_shadow_atlas_size() const; - void set_shadow_atlas_16_bits(bool p_16_bits); - bool get_shadow_atlas_16_bits() const; + void set_positional_shadow_atlas_16_bits(bool p_16_bits); + bool get_positional_shadow_atlas_16_bits() const; - void set_shadow_atlas_quadrant_subdiv(int p_quadrant, ShadowAtlasQuadrantSubdiv p_subdiv); - ShadowAtlasQuadrantSubdiv get_shadow_atlas_quadrant_subdiv(int p_quadrant) const; + void set_positional_shadow_atlas_quadrant_subdiv(int p_quadrant, PositionalShadowAtlasQuadrantSubdiv p_subdiv); + PositionalShadowAtlasQuadrantSubdiv get_positional_shadow_atlas_quadrant_subdiv(int p_quadrant) const; void set_msaa(MSAA p_msaa); MSAA get_msaa() const; @@ -604,6 +615,14 @@ public: void set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRepeat p_repeat); DefaultCanvasItemTextureRepeat get_default_canvas_item_texture_repeat() const; + // VRS + + void set_vrs_mode(VRSMode p_vrs_mode); + VRSMode get_vrs_mode() const; + + void set_vrs_texture(Ref<Texture2D> p_texture); + Ref<Texture2D> get_vrs_texture() const; + virtual DisplayServer::WindowID get_window_id() const = 0; void set_embedding_subwindows(bool p_embed); @@ -690,6 +709,7 @@ public: bool is_using_xr(); #endif // _3D_DISABLED + virtual void _validate_property(PropertyInfo &property) const override; Viewport(); ~Viewport(); }; @@ -746,12 +766,13 @@ public: }; VARIANT_ENUM_CAST(Viewport::Scaling3DMode); VARIANT_ENUM_CAST(SubViewport::UpdateMode); -VARIANT_ENUM_CAST(Viewport::ShadowAtlasQuadrantSubdiv); +VARIANT_ENUM_CAST(Viewport::PositionalShadowAtlasQuadrantSubdiv); VARIANT_ENUM_CAST(Viewport::MSAA); VARIANT_ENUM_CAST(Viewport::ScreenSpaceAA); VARIANT_ENUM_CAST(Viewport::DebugDraw); VARIANT_ENUM_CAST(Viewport::SDFScale); VARIANT_ENUM_CAST(Viewport::SDFOversize); +VARIANT_ENUM_CAST(Viewport::VRSMode); VARIANT_ENUM_CAST(SubViewport::ClearMode); VARIANT_ENUM_CAST(Viewport::RenderInfo); VARIANT_ENUM_CAST(Viewport::RenderInfoType); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 5c5b60df63..f462e36758 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -439,6 +439,7 @@ void register_scene_types() { GDREGISTER_CLASS(AnimationNodeStateMachine); GDREGISTER_CLASS(AnimationNodeStateMachinePlayback); + GDREGISTER_CLASS(AnimationNodeSync); GDREGISTER_CLASS(AnimationNodeStateMachineTransition); GDREGISTER_CLASS(AnimationNodeOutput); GDREGISTER_CLASS(AnimationNodeOneShot); diff --git a/scene/resources/bone_map.cpp b/scene/resources/bone_map.cpp index ce030934fa..aff917b2d4 100644 --- a/scene/resources/bone_map.cpp +++ b/scene/resources/bone_map.cpp @@ -50,6 +50,14 @@ bool BoneMap::_get(const StringName &p_path, Variant &r_ret) const { return true; } +void BoneMap::_get_property_list(List<PropertyInfo> *p_list) const { + HashMap<StringName, StringName>::ConstIterator E = bone_map.begin(); + while (E) { + p_list->push_back(PropertyInfo(Variant::STRING_NAME, "bone_map/" + E->key, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); + ++E; + } +} + Ref<SkeletonProfile> BoneMap::get_profile() const { return profile; } @@ -153,6 +161,7 @@ void BoneMap::_bind_methods() { ClassDB::bind_method(D_METHOD("find_profile_bone_name", "skeleton_bone_name"), &BoneMap::find_profile_bone_name); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "profile", PROPERTY_HINT_RESOURCE_TYPE, "SkeletonProfile"), "set_profile", "get_profile"); + ADD_ARRAY("bonemap", "bonemap"); ADD_SIGNAL(MethodInfo("bone_map_updated")); ADD_SIGNAL(MethodInfo("profile_updated")); diff --git a/scene/resources/bone_map.h b/scene/resources/bone_map.h index 4b7928015d..17452dfc73 100644 --- a/scene/resources/bone_map.h +++ b/scene/resources/bone_map.h @@ -46,6 +46,7 @@ protected: bool _get(const StringName &p_path, Variant &r_ret) const; bool _set(const StringName &p_path, const Variant &p_value); virtual void _validate_property(PropertyInfo &property) const override; + void _get_property_list(List<PropertyInfo> *p_list) const; static void _bind_methods(); public: diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 6053d27ef7..f61ac7fcaa 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -69,14 +69,14 @@ void Font::_bind_methods() { // Drawing string. ClassDB::bind_method(D_METHOD("set_cache_capacity", "single_line", "multi_line"), &Font::set_cache_capacity); - ClassDB::bind_method(D_METHOD("get_string_size", "text", "alignment", "width", "font_size", "flags", "direction", "orientation"), &Font::get_string_size, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("get_multiline_string_size", "text", "alignment", "width", "font_size", "max_lines", "flags", "direction", "orientation"), &Font::get_multiline_string_size, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("get_string_size", "text", "alignment", "width", "font_size", "jst_flags", "direction", "orientation"), &Font::get_string_size, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("get_multiline_string_size", "text", "alignment", "width", "font_size", "max_lines", "brk_flags", "jst_flags", "direction", "orientation"), &Font::get_multiline_string_size, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_string", "canvas_item", "pos", "text", "alignment", "width", "font_size", "modulate", "flags", "direction", "orientation"), &Font::draw_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_multiline_string", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "modulate", "flags", "direction", "orientation"), &Font::draw_multiline_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_string", "canvas_item", "pos", "text", "alignment", "width", "font_size", "modulate", "jst_flags", "direction", "orientation"), &Font::draw_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_multiline_string", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &Font::draw_multiline_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "size", "modulate", "flags", "direction", "orientation"), &Font::draw_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); - ClassDB::bind_method(D_METHOD("draw_multiline_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "size", "modulate", "flags", "direction", "orientation"), &Font::draw_multiline_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "size", "modulate", "jst_flags", "direction", "orientation"), &Font::draw_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); + ClassDB::bind_method(D_METHOD("draw_multiline_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "size", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &Font::draw_multiline_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL)); // Drawing char. ClassDB::bind_method(D_METHOD("get_char_size", "char"), &Font::get_char_size); @@ -239,7 +239,7 @@ String Font::get_font_style_name() const { return TS->font_get_style_name(_get_rid()); } -uint32_t Font::get_font_style() const { +BitField<TextServer::FontStyle> Font::get_font_style() const { return TS->font_get_style(_get_rid()); } @@ -253,15 +253,15 @@ void Font::set_cache_capacity(int p_single_line, int p_multi_line) { cache_wrap.set_capacity(p_multi_line); } -Size2 Font::get_string_size(const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +Size2 Font::get_string_size(const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); - hash = hash_djb2_one_64(p_direction, hash); - hash = hash_djb2_one_64(p_orientation, hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); } + hash = hash_djb2_one_64(p_direction, hash); + hash = hash_djb2_one_64(p_orientation, hash); Ref<TextLine> buffer; if (cache.has(hash)) { @@ -271,16 +271,22 @@ Size2 Font::get_string_size(const String &p_text, HorizontalAlignment p_alignmen buffer->set_direction(p_direction); buffer->set_orientation(p_orientation); buffer->add_string(p_text, Ref<Font>(this), p_font_size); + if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { + buffer->set_horizontal_alignment(p_alignment); + buffer->set_width(p_width); + buffer->set_flags(p_jst_flags); + } cache.insert(hash, buffer); } return buffer->get_size(); } -Size2 Font::get_multiline_string_size(const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +Size2 Font::get_multiline_string_size(const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, BitField<TextServer::LineBreakFlag> p_brk_flags, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); + hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -293,7 +299,8 @@ Size2 Font::get_multiline_string_size(const String &p_text, HorizontalAlignment lines_buffer->set_orientation(p_orientation); lines_buffer->add_string(p_text, Ref<Font>(this), p_font_size); lines_buffer->set_width(p_width); - lines_buffer->set_flags(p_flags); + lines_buffer->set_break_flags(p_brk_flags); + lines_buffer->set_justification_flags(p_jst_flags); cache_wrap.insert(hash, lines_buffer); } @@ -303,13 +310,15 @@ Size2 Font::get_multiline_string_size(const String &p_text, HorizontalAlignment return lines_buffer->get_size(); } -void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, const Color &p_modulate, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); } + hash = hash_djb2_one_64(p_direction, hash); + hash = hash_djb2_one_64(p_orientation, hash); Ref<TextLine> buffer; if (cache.has(hash)) { @@ -331,16 +340,19 @@ void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_t buffer->set_width(p_width); buffer->set_horizontal_alignment(p_alignment); - buffer->set_flags(p_flags); + if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { + buffer->set_flags(p_jst_flags); + } buffer->draw(p_canvas_item, ofs, p_modulate); } -void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, const Color &p_modulate, BitField<TextServer::LineBreakFlag> p_brk_flags, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); + hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -353,7 +365,8 @@ void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const S lines_buffer->set_orientation(p_orientation); lines_buffer->add_string(p_text, Ref<Font>(this), p_font_size); lines_buffer->set_width(p_width); - lines_buffer->set_flags(p_flags); + lines_buffer->set_break_flags(p_brk_flags); + lines_buffer->set_justification_flags(p_jst_flags); cache_wrap.insert(hash, lines_buffer); } @@ -370,13 +383,15 @@ void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const S lines_buffer->draw(p_canvas_item, ofs, p_modulate); } -void Font::draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void Font::draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_size, const Color &p_modulate, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); } + hash = hash_djb2_one_64(p_direction, hash); + hash = hash_djb2_one_64(p_orientation, hash); Ref<TextLine> buffer; if (cache.has(hash)) { @@ -398,16 +413,19 @@ void Font::draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const Str buffer->set_width(p_width); buffer->set_horizontal_alignment(p_alignment); - buffer->set_flags(p_flags); + if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { + buffer->set_flags(p_jst_flags); + } buffer->draw_outline(p_canvas_item, ofs, p_size, p_modulate); } -void Font::draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, int p_size, const Color &p_modulate, uint16_t p_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { +void Font::draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment, float p_width, int p_font_size, int p_max_lines, int p_size, const Color &p_modulate, BitField<TextServer::LineBreakFlag> p_brk_flags, BitField<TextServer::JustificationFlag> p_jst_flags, TextServer::Direction p_direction, TextServer::Orientation p_orientation) const { uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_flags, hash); + hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -420,7 +438,8 @@ void Font::draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, lines_buffer->set_orientation(p_orientation); lines_buffer->add_string(p_text, Ref<Font>(this), p_font_size); lines_buffer->set_width(p_width); - lines_buffer->set_flags(p_flags); + lines_buffer->set_break_flags(p_brk_flags); + lines_buffer->set_justification_flags(p_jst_flags); cache_wrap.insert(hash, lines_buffer); } @@ -980,7 +999,7 @@ void FontFile::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_antialiased", "is_antialiased"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "font_name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_font_name", "get_font_name"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "style_name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_font_style_name", "get_font_style_name"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "font_style", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_font_style", "get_font_style"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "font_style", PROPERTY_HINT_FLAGS, "Bold,Italic,Fixed Size", PROPERTY_USAGE_STORAGE), "set_font_style", "get_font_style"); ADD_PROPERTY(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One half of a pixel,One quarter of a pixel", PROPERTY_USAGE_STORAGE), "set_subpixel_positioning", "get_subpixel_positioning"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_multichannel_signed_distance_field", "is_multichannel_signed_distance_field"); ADD_PROPERTY(PropertyInfo(Variant::INT, "msdf_pixel_range", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_msdf_pixel_range", "get_msdf_pixel_range"); @@ -1332,7 +1351,7 @@ Error FontFile::load_bitmap_font(const String &p_path) { int height = 0; int ascent = 0; int outline = 0; - uint32_t st_flags = 0; + BitField<TextServer::FontStyle> st_flags = 0; String font_name; bool packed = false; @@ -1358,10 +1377,10 @@ Error FontFile::load_bitmap_font(const String &p_path) { uint8_t flags = f->get_8(); ERR_FAIL_COND_V_MSG(flags & 0x02, ERR_CANT_CREATE, RTR("Non-unicode version of BMFont is not supported.")); if (flags & (1 << 3)) { - st_flags |= TextServer::FONT_BOLD; + st_flags.set_flag(TextServer::FONT_BOLD); } if (flags & (1 << 2)) { - st_flags |= TextServer::FONT_ITALIC; + st_flags.set_flag(TextServer::FONT_ITALIC); } f->get_8(); // non-unicode charset, skip f->get_16(); // stretch_h, skip @@ -1588,12 +1607,12 @@ Error FontFile::load_bitmap_font(const String &p_path) { } if (keys.has("bold")) { if (keys["bold"].to_int()) { - st_flags |= TextServer::FONT_BOLD; + st_flags.set_flag(TextServer::FONT_BOLD); } } if (keys.has("italic")) { if (keys["italic"].to_int()) { - st_flags |= TextServer::FONT_ITALIC; + st_flags.set_flag(TextServer::FONT_ITALIC); } } if (keys.has("face")) { @@ -1840,7 +1859,7 @@ void FontFile::set_font_style_name(const String &p_name) { TS->font_set_style_name(cache[0], p_name); } -void FontFile::set_font_style(uint32_t p_style) { +void FontFile::set_font_style(BitField<TextServer::FontStyle> p_style) { _ensure_rid(0); TS->font_set_style(cache[0], p_style); } diff --git a/scene/resources/font.h b/scene/resources/font.h index 40b223b0f5..7a42a4dfea 100644 --- a/scene/resources/font.h +++ b/scene/resources/font.h @@ -91,7 +91,7 @@ public: virtual String get_font_name() const; virtual String get_font_style_name() const; - virtual uint32_t get_font_style() const; + virtual BitField<TextServer::FontStyle> get_font_style() const; virtual int get_spacing(TextServer::SpacingType p_spacing) const { return 0; }; virtual Dictionary get_opentype_features() const; @@ -99,14 +99,14 @@ public: // Drawing string. virtual void set_cache_capacity(int p_single_line, int p_multi_line); - virtual Size2 get_string_size(const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - virtual Size2 get_multiline_string_size(const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual Size2 get_string_size(const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual Size2 get_multiline_string_size(const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, BitField<TextServer::LineBreakFlag> p_brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual void draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual void draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::LineBreakFlag> p_brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - virtual void draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; - virtual void draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), uint16_t p_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual void draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; + virtual void draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, const String &p_text, HorizontalAlignment p_alignment = HORIZONTAL_ALIGNMENT_LEFT, float p_width = -1, int p_font_size = DEFAULT_FONT_SIZE, int p_max_lines = -1, int p_size = 1, const Color &p_modulate = Color(1.0, 1.0, 1.0), BitField<TextServer::LineBreakFlag> p_brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL) const; // Drawing char. virtual Size2 get_char_size(char32_t p_char, int p_font_size = DEFAULT_FONT_SIZE) const; @@ -190,7 +190,7 @@ public: // Common properties. virtual void set_font_name(const String &p_name); virtual void set_font_style_name(const String &p_name); - virtual void set_font_style(uint32_t p_style); + virtual void set_font_style(BitField<TextServer::FontStyle> p_style); virtual void set_antialiased(bool p_antialiased); virtual bool is_antialiased() const; diff --git a/scene/resources/gradient.h b/scene/resources/gradient.h index 2b04ead0af..e4bac15e4b 100644 --- a/scene/resources/gradient.h +++ b/scene/resources/gradient.h @@ -157,10 +157,10 @@ public: const Point &pointP3 = points[p3]; float x = (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset); - float r = Math::cubic_interpolate(pointP0.color.r, pointFirst.color.r, pointSecond.color.r, pointP3.color.r, x); - float g = Math::cubic_interpolate(pointP0.color.g, pointFirst.color.g, pointSecond.color.g, pointP3.color.g, x); - float b = Math::cubic_interpolate(pointP0.color.b, pointFirst.color.b, pointSecond.color.b, pointP3.color.b, x); - float a = Math::cubic_interpolate(pointP0.color.a, pointFirst.color.a, pointSecond.color.a, pointP3.color.a, x); + float r = Math::cubic_interpolate(pointFirst.color.r, pointSecond.color.r, pointP0.color.r, pointP3.color.r, x); + float g = Math::cubic_interpolate(pointFirst.color.g, pointSecond.color.g, pointP0.color.g, pointP3.color.g, x); + float b = Math::cubic_interpolate(pointFirst.color.b, pointSecond.color.b, pointP0.color.b, pointP3.color.b, x); + float a = Math::cubic_interpolate(pointFirst.color.a, pointSecond.color.a, pointP0.color.a, pointP3.color.a, x); return Color(r, g, b, a); } break; diff --git a/scene/resources/mesh_library.cpp b/scene/resources/mesh_library.cpp index c8bfb73b2d..2d3f9d9afc 100644 --- a/scene/resources/mesh_library.cpp +++ b/scene/resources/mesh_library.cpp @@ -107,7 +107,7 @@ void MeshLibrary::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::ARRAY, name + PNAME("shapes"))); p_list->push_back(PropertyInfo(Variant::OBJECT, name + PNAME("navmesh"), PROPERTY_HINT_RESOURCE_TYPE, "NavigationMesh")); p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, name + PNAME("navmesh_transform"), PROPERTY_HINT_NONE, "suffix:m")); - p_list->push_back(PropertyInfo(Variant::OBJECT, name + PNAME("preview"), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_HELPER)); + p_list->push_back(PropertyInfo(Variant::OBJECT, name + PNAME("preview"), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", PROPERTY_USAGE_DEFAULT)); } } diff --git a/scene/resources/skeleton_profile.cpp b/scene/resources/skeleton_profile.cpp index 05d48f9545..0714de470c 100644 --- a/scene/resources/skeleton_profile.cpp +++ b/scene/resources/skeleton_profile.cpp @@ -34,7 +34,7 @@ bool SkeletonProfile::_set(const StringName &p_path, const Variant &p_value) { ERR_FAIL_COND_V(is_read_only, false); String path = p_path; - if (path.begins_with("group/")) { + if (path.begins_with("groups/")) { int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); ERR_FAIL_INDEX_V(which, groups.size(), false); @@ -43,23 +43,35 @@ bool SkeletonProfile::_set(const StringName &p_path, const Variant &p_value) { set_group_name(which, p_value); } else if (what == "texture") { set_texture(which, p_value); + } else { + return false; } - return true; } - if (path.begins_with("bone/")) { + if (path.begins_with("bones/")) { int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); ERR_FAIL_INDEX_V(which, bones.size(), false); if (what == "bone_name") { set_bone_name(which, p_value); + } else if (what == "bone_parent") { + set_bone_parent(which, p_value); + } else if (what == "tail_direction") { + set_tail_direction(which, static_cast<TailDirection>((int)p_value)); + } else if (what == "bone_tail") { + set_bone_tail(which, p_value); + } else if (what == "reference_pose") { + set_reference_pose(which, p_value); } else if (what == "handle_offset") { set_handle_offset(which, p_value); } else if (what == "group") { set_group(which, p_value); + } else if (what == "require") { + set_require(which, p_value); + } else { + return false; } - return true; } return true; } @@ -67,7 +79,7 @@ bool SkeletonProfile::_set(const StringName &p_path, const Variant &p_value) { bool SkeletonProfile::_get(const StringName &p_path, Variant &r_ret) const { String path = p_path; - if (path.begins_with("group/")) { + if (path.begins_with("groups/")) { int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); ERR_FAIL_INDEX_V(which, groups.size(), false); @@ -76,23 +88,35 @@ bool SkeletonProfile::_get(const StringName &p_path, Variant &r_ret) const { r_ret = get_group_name(which); } else if (what == "texture") { r_ret = get_texture(which); + } else { + return false; } - return true; } - if (path.begins_with("bone/")) { + if (path.begins_with("bones/")) { int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); ERR_FAIL_INDEX_V(which, bones.size(), false); if (what == "bone_name") { r_ret = get_bone_name(which); + } else if (what == "bone_parent") { + r_ret = get_bone_parent(which); + } else if (what == "tail_direction") { + r_ret = get_tail_direction(which); + } else if (what == "bone_tail") { + r_ret = get_bone_tail(which); + } else if (what == "reference_pose") { + r_ret = get_reference_pose(which); } else if (what == "handle_offset") { r_ret = get_handle_offset(which); } else if (what == "group") { r_ret = get_group(which); + } else if (what == "require") { + r_ret = is_require(which); + } else { + return false; } - return true; } return true; } @@ -104,6 +128,13 @@ void SkeletonProfile::_validate_property(PropertyInfo &property) const { return; } } + + PackedStringArray split = property.name.split("/"); + if (split.size() == 3 && split[0] == "bones") { + if (split[2] == "bone_tail" && get_tail_direction(split[1].to_int()) != TAIL_DIRECTION_SPECIFIC_CHILD) { + property.usage = PROPERTY_USAGE_NONE; + } + } } void SkeletonProfile::_get_property_list(List<PropertyInfo> *p_list) const { @@ -112,7 +143,7 @@ void SkeletonProfile::_get_property_list(List<PropertyInfo> *p_list) const { } String group_names = ""; for (int i = 0; i < groups.size(); i++) { - String path = "group/" + itos(i) + "/"; + String path = "groups/" + itos(i) + "/"; p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "group_name")); p_list->push_back(PropertyInfo(Variant::OBJECT, path + "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); if (i > 0) { @@ -121,10 +152,19 @@ void SkeletonProfile::_get_property_list(List<PropertyInfo> *p_list) const { group_names = group_names + groups[i].group_name; } for (int i = 0; i < bones.size(); i++) { - String path = "bone/" + itos(i) + "/"; + String path = "bones/" + itos(i) + "/"; p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_name")); + p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_parent")); + p_list->push_back(PropertyInfo(Variant::INT, path + "tail_direction", PROPERTY_HINT_ENUM, "AverageChildren,SpecificChild,End")); + p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_tail")); + p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, path + "reference_pose")); p_list->push_back(PropertyInfo(Variant::VECTOR2, path + "handle_offset")); p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "group", PROPERTY_HINT_ENUM, group_names)); + p_list->push_back(PropertyInfo(Variant::BOOL, path + "require")); + } + + for (PropertyInfo &E : *p_list) { + _validate_property(E); } } @@ -184,6 +224,18 @@ void SkeletonProfile::set_bone_size(int p_size) { notify_property_list_changed(); } +int SkeletonProfile::find_bone(StringName p_bone_name) const { + if (p_bone_name == StringName()) { + return -1; + } + for (int i = 0; i < bones.size(); i++) { + if (bones[i].bone_name == p_bone_name) { + return i; + } + } + return -1; +} + StringName SkeletonProfile::get_bone_name(int p_bone_idx) const { ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); return bones[p_bone_idx].bone_name; @@ -198,6 +250,63 @@ void SkeletonProfile::set_bone_name(int p_bone_idx, const StringName p_bone_name emit_signal("profile_updated"); } +StringName SkeletonProfile::get_bone_parent(int p_bone_idx) const { + ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); + return bones[p_bone_idx].bone_parent; +} + +void SkeletonProfile::set_bone_parent(int p_bone_idx, const StringName p_bone_parent) { + if (is_read_only) { + return; + } + ERR_FAIL_INDEX(p_bone_idx, bones.size()); + bones.write[p_bone_idx].bone_parent = p_bone_parent; + emit_signal("profile_updated"); +} + +SkeletonProfile::TailDirection SkeletonProfile::get_tail_direction(int p_bone_idx) const { + ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), TAIL_DIRECTION_AVERAGE_CHILDREN); + return bones[p_bone_idx].tail_direction; +} + +void SkeletonProfile::set_tail_direction(int p_bone_idx, const TailDirection p_tail_direction) { + if (is_read_only) { + return; + } + ERR_FAIL_INDEX(p_bone_idx, bones.size()); + bones.write[p_bone_idx].tail_direction = p_tail_direction; + emit_signal("profile_updated"); + notify_property_list_changed(); +} + +StringName SkeletonProfile::get_bone_tail(int p_bone_idx) const { + ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); + return bones[p_bone_idx].bone_tail; +} + +void SkeletonProfile::set_bone_tail(int p_bone_idx, const StringName p_bone_tail) { + if (is_read_only) { + return; + } + ERR_FAIL_INDEX(p_bone_idx, bones.size()); + bones.write[p_bone_idx].bone_tail = p_bone_tail; + emit_signal("profile_updated"); +} + +Transform3D SkeletonProfile::get_reference_pose(int p_bone_idx) const { + ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), Transform3D()); + return bones[p_bone_idx].reference_pose; +} + +void SkeletonProfile::set_reference_pose(int p_bone_idx, const Transform3D p_reference_pose) { + if (is_read_only) { + return; + } + ERR_FAIL_INDEX(p_bone_idx, bones.size()); + bones.write[p_bone_idx].reference_pose = p_reference_pose; + emit_signal("profile_updated"); +} + Vector2 SkeletonProfile::get_handle_offset(int p_bone_idx) const { ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), Vector2()); return bones[p_bone_idx].handle_offset; @@ -226,6 +335,20 @@ void SkeletonProfile::set_group(int p_bone_idx, const StringName p_group) { emit_signal("profile_updated"); } +bool SkeletonProfile::is_require(int p_bone_idx) const { + ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), false); + return bones[p_bone_idx].require; +} + +void SkeletonProfile::set_require(int p_bone_idx, const bool p_require) { + if (is_read_only) { + return; + } + ERR_FAIL_INDEX(p_bone_idx, bones.size()); + bones.write[p_bone_idx].require = p_require; + emit_signal("profile_updated"); +} + bool SkeletonProfile::has_bone(StringName p_bone_name) { bool is_found = false; for (int i = 0; i < bones.size(); i++) { @@ -250,19 +373,37 @@ void SkeletonProfile::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bone_size", "size"), &SkeletonProfile::set_bone_size); ClassDB::bind_method(D_METHOD("get_bone_size"), &SkeletonProfile::get_bone_size); + ClassDB::bind_method(D_METHOD("find_bone", "bone_name"), &SkeletonProfile::find_bone); + ClassDB::bind_method(D_METHOD("get_bone_name", "bone_idx"), &SkeletonProfile::get_bone_name); ClassDB::bind_method(D_METHOD("set_bone_name", "bone_idx", "bone_name"), &SkeletonProfile::set_bone_name); + ClassDB::bind_method(D_METHOD("get_bone_parent", "bone_idx"), &SkeletonProfile::get_bone_parent); + ClassDB::bind_method(D_METHOD("set_bone_parent", "bone_idx", "bone_parent"), &SkeletonProfile::set_bone_parent); + + ClassDB::bind_method(D_METHOD("get_tail_direction", "bone_idx"), &SkeletonProfile::get_tail_direction); + ClassDB::bind_method(D_METHOD("set_tail_direction", "bone_idx", "tail_direction"), &SkeletonProfile::set_tail_direction); + + ClassDB::bind_method(D_METHOD("get_bone_tail", "bone_idx"), &SkeletonProfile::get_bone_tail); + ClassDB::bind_method(D_METHOD("set_bone_tail", "bone_idx", "bone_tail"), &SkeletonProfile::set_bone_tail); + + ClassDB::bind_method(D_METHOD("get_reference_pose", "bone_idx"), &SkeletonProfile::get_reference_pose); + ClassDB::bind_method(D_METHOD("set_reference_pose", "bone_idx", "bone_name"), &SkeletonProfile::set_reference_pose); + ClassDB::bind_method(D_METHOD("get_handle_offset", "bone_idx"), &SkeletonProfile::get_handle_offset); ClassDB::bind_method(D_METHOD("set_handle_offset", "bone_idx", "handle_offset"), &SkeletonProfile::set_handle_offset); ClassDB::bind_method(D_METHOD("get_group", "bone_idx"), &SkeletonProfile::get_group); ClassDB::bind_method(D_METHOD("set_group", "bone_idx", "group"), &SkeletonProfile::set_group); - ADD_PROPERTY(PropertyInfo(Variant::INT, "group_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Groups,group/"), "set_group_size", "get_group_size"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Bones,bone/"), "set_bone_size", "get_bone_size"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "group_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Groups,groups/"), "set_group_size", "get_group_size"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Bones,bones/"), "set_bone_size", "get_bone_size"); ADD_SIGNAL(MethodInfo("profile_updated")); + + BIND_ENUM_CONSTANT(TAIL_DIRECTION_AVERAGE_CHILDREN); + BIND_ENUM_CONSTANT(TAIL_DIRECTION_SPECIFIC_CHILD); + BIND_ENUM_CONSTANT(TAIL_DIRECTION_END); } SkeletonProfile::SkeletonProfile() { @@ -284,226 +425,364 @@ SkeletonProfileHumanoid::SkeletonProfileHumanoid() { bones.resize(56); bones.write[0].bone_name = "Root"; + bones.write[0].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0); bones.write[0].handle_offset = Vector2(0.5, 0.91); bones.write[0].group = "Body"; bones.write[1].bone_name = "Hips"; + bones.write[1].bone_parent = "Root"; + bones.write[1].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; + bones.write[1].bone_tail = "Spine"; + bones.write[1].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0); bones.write[1].handle_offset = Vector2(0.5, 0.5); bones.write[1].group = "Body"; + bones.write[1].require = true; bones.write[2].bone_name = "Spine"; + bones.write[2].bone_parent = "Hips"; + bones.write[2].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); bones.write[2].handle_offset = Vector2(0.5, 0.43); bones.write[2].group = "Body"; + bones.write[2].require = true; bones.write[3].bone_name = "Chest"; + bones.write[3].bone_parent = "Spine"; + bones.write[3].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); bones.write[3].handle_offset = Vector2(0.5, 0.36); bones.write[3].group = "Body"; bones.write[4].bone_name = "UpperChest"; + bones.write[4].bone_parent = "Chest"; + bones.write[4].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); bones.write[4].handle_offset = Vector2(0.5, 0.29); bones.write[4].group = "Body"; bones.write[5].bone_name = "Neck"; + bones.write[5].bone_parent = "UpperChest"; + bones.write[5].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; + bones.write[5].bone_tail = "Head"; + bones.write[5].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); bones.write[5].handle_offset = Vector2(0.5, 0.23); bones.write[5].group = "Body"; + bones.write[5].require = true; bones.write[6].bone_name = "Head"; + bones.write[6].bone_parent = "Neck"; + bones.write[6].tail_direction = TAIL_DIRECTION_END; + bones.write[6].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); bones.write[6].handle_offset = Vector2(0.5, 0.18); bones.write[6].group = "Body"; + bones.write[6].require = true; bones.write[7].bone_name = "LeftEye"; + bones.write[7].bone_parent = "Head"; + bones.write[7].reference_pose = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, 0.05, 0.15, 0); bones.write[7].handle_offset = Vector2(0.6, 0.46); bones.write[7].group = "Face"; bones.write[8].bone_name = "RightEye"; + bones.write[8].bone_parent = "Head"; + bones.write[8].reference_pose = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, -0.05, 0.15, 0); bones.write[8].handle_offset = Vector2(0.37, 0.46); bones.write[8].group = "Face"; bones.write[9].bone_name = "Jaw"; + bones.write[9].bone_parent = "Head"; + bones.write[9].reference_pose = Transform3D(-1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0.05, 0.05); bones.write[9].handle_offset = Vector2(0.46, 0.75); bones.write[9].group = "Face"; bones.write[10].bone_name = "LeftShoulder"; + bones.write[10].bone_parent = "UpperChest"; + bones.write[10].reference_pose = Transform3D(0, 1, 0, 0, 0, 1, 1, 0, 0, 0.05, 0.1, 0); bones.write[10].handle_offset = Vector2(0.55, 0.235); bones.write[10].group = "Body"; + bones.write[10].require = true; bones.write[11].bone_name = "LeftUpperArm"; + bones.write[11].bone_parent = "LeftShoulder"; + bones.write[11].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.05, 0); bones.write[11].handle_offset = Vector2(0.6, 0.24); bones.write[11].group = "Body"; + bones.write[11].require = true; bones.write[12].bone_name = "LeftLowerArm"; + bones.write[12].bone_parent = "LeftUpperArm"; + bones.write[12].reference_pose = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.25, 0); bones.write[12].handle_offset = Vector2(0.7, 0.24); bones.write[12].group = "Body"; + bones.write[12].require = true; bones.write[13].bone_name = "LeftHand"; + bones.write[13].bone_parent = "LeftLowerArm"; + bones.write[13].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; + bones.write[13].bone_tail = "LeftMiddleProximal"; + bones.write[13].reference_pose = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0.25, 0); bones.write[13].handle_offset = Vector2(0.82, 0.235); bones.write[13].group = "Body"; + bones.write[13].require = true; - bones.write[14].bone_name = "LeftThumbProximal"; + bones.write[14].bone_name = "LeftThumbMetacarpal"; + bones.write[14].bone_parent = "LeftHand"; + bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0.707, 0.577, 0.408, -0.707, 0.577, 0.408, -0.025, 0, 0); bones.write[14].handle_offset = Vector2(0.4, 0.8); bones.write[14].group = "LeftHand"; - bones.write[15].bone_name = "LeftThumbIntermediate"; + bones.write[15].bone_name = "LeftThumbProximal"; + bones.write[15].bone_parent = "LeftThumbMetacarpal"; + bones.write[15].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); bones.write[15].handle_offset = Vector2(0.3, 0.69); bones.write[15].group = "LeftHand"; bones.write[16].bone_name = "LeftThumbDistal"; + bones.write[16].bone_parent = "LeftThumbProximal"; + bones.write[16].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); bones.write[16].handle_offset = Vector2(0.23, 0.555); bones.write[16].group = "LeftHand"; bones.write[17].bone_name = "LeftIndexProximal"; + bones.write[17].bone_parent = "LeftHand"; + bones.write[17].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.025, 0.075, 0); bones.write[17].handle_offset = Vector2(0.413, 0.52); bones.write[17].group = "LeftHand"; bones.write[18].bone_name = "LeftIndexIntermediate"; + bones.write[18].bone_parent = "LeftIndexProximal"; + bones.write[18].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[18].handle_offset = Vector2(0.403, 0.36); bones.write[18].group = "LeftHand"; bones.write[19].bone_name = "LeftIndexDistal"; + bones.write[19].bone_parent = "LeftIndexIntermediate"; + bones.write[19].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[19].handle_offset = Vector2(0.403, 0.255); bones.write[19].group = "LeftHand"; bones.write[20].bone_name = "LeftMiddleProximal"; + bones.write[20].bone_parent = "LeftHand"; + bones.write[20].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); bones.write[20].handle_offset = Vector2(0.5, 0.51); bones.write[20].group = "LeftHand"; bones.write[21].bone_name = "LeftMiddleIntermediate"; + bones.write[21].bone_parent = "LeftMiddleProximal"; + bones.write[21].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); bones.write[21].handle_offset = Vector2(0.5, 0.345); bones.write[21].group = "LeftHand"; bones.write[22].bone_name = "LeftMiddleDistal"; + bones.write[22].bone_parent = "LeftMiddleIntermediate"; + bones.write[22].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[22].handle_offset = Vector2(0.5, 0.22); bones.write[22].group = "LeftHand"; bones.write[23].bone_name = "LeftRingProximal"; + bones.write[23].bone_parent = "LeftHand"; + bones.write[23].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.025, 0.075, 0); bones.write[23].handle_offset = Vector2(0.586, 0.52); bones.write[23].group = "LeftHand"; bones.write[24].bone_name = "LeftRingIntermediate"; + bones.write[24].bone_parent = "LeftRingProximal"; + bones.write[24].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[24].handle_offset = Vector2(0.59, 0.36); bones.write[24].group = "LeftHand"; bones.write[25].bone_name = "LeftRingDistal"; + bones.write[25].bone_parent = "LeftRingIntermediate"; + bones.write[25].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[25].handle_offset = Vector2(0.591, 0.25); bones.write[25].group = "LeftHand"; bones.write[26].bone_name = "LeftLittleProximal"; + bones.write[26].bone_parent = "LeftHand"; + bones.write[26].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, 0.05, 0); bones.write[26].handle_offset = Vector2(0.663, 0.543); bones.write[26].group = "LeftHand"; bones.write[27].bone_name = "LeftLittleIntermediate"; + bones.write[27].bone_parent = "LeftLittleProximal"; + bones.write[27].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[27].handle_offset = Vector2(0.672, 0.415); bones.write[27].group = "LeftHand"; bones.write[28].bone_name = "LeftLittleDistal"; + bones.write[28].bone_parent = "LeftLittleIntermediate"; + bones.write[28].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[28].handle_offset = Vector2(0.672, 0.32); bones.write[28].group = "LeftHand"; bones.write[29].bone_name = "RightShoulder"; + bones.write[29].bone_parent = "UpperChest"; + bones.write[29].reference_pose = Transform3D(0, -1, 0, 0, 0, 1, -1, 0, 0, -0.05, 0.1, 0); bones.write[29].handle_offset = Vector2(0.45, 0.235); bones.write[29].group = "Body"; + bones.write[29].require = true; bones.write[30].bone_name = "RightUpperArm"; + bones.write[30].bone_parent = "RightShoulder"; + bones.write[30].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.05, 0); bones.write[30].handle_offset = Vector2(0.4, 0.24); bones.write[30].group = "Body"; + bones.write[30].require = true; bones.write[31].bone_name = "RightLowerArm"; + bones.write[31].bone_parent = "RightUpperArm"; + bones.write[31].reference_pose = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0.25, 0); bones.write[31].handle_offset = Vector2(0.3, 0.24); bones.write[31].group = "Body"; + bones.write[31].require = true; bones.write[32].bone_name = "RightHand"; + bones.write[32].bone_parent = "RightLowerArm"; + bones.write[32].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; + bones.write[32].bone_tail = "RightMiddleProximal"; + bones.write[32].reference_pose = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.25, 0); bones.write[32].handle_offset = Vector2(0.18, 0.235); bones.write[32].group = "Body"; + bones.write[32].require = true; - bones.write[33].bone_name = "RightThumbProximal"; + bones.write[33].bone_name = "RightThumbMetacarpal"; + bones.write[33].bone_parent = "RightHand"; + bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, -0.707, 0.577, 0.408, 0.707, 0.577, 0.408, 0.025, 0, 0); bones.write[33].handle_offset = Vector2(0.6, 0.8); bones.write[33].group = "RightHand"; - bones.write[34].bone_name = "RightThumbIntermediate"; + bones.write[34].bone_name = "RightThumbProximal"; + bones.write[34].bone_parent = "RightThumbMetacarpal"; + bones.write[34].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); bones.write[34].handle_offset = Vector2(0.7, 0.69); bones.write[34].group = "RightHand"; bones.write[35].bone_name = "RightThumbDistal"; + bones.write[35].bone_parent = "RightThumbProximal"; + bones.write[35].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); bones.write[35].handle_offset = Vector2(0.77, 0.555); bones.write[35].group = "RightHand"; bones.write[36].bone_name = "RightIndexProximal"; + bones.write[36].bone_parent = "RightHand"; + bones.write[36].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.025, 0.075, 0); bones.write[36].handle_offset = Vector2(0.587, 0.52); bones.write[36].group = "RightHand"; bones.write[37].bone_name = "RightIndexIntermediate"; + bones.write[37].bone_parent = "RightIndexProximal"; + bones.write[37].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[37].handle_offset = Vector2(0.597, 0.36); bones.write[37].group = "RightHand"; bones.write[38].bone_name = "RightIndexDistal"; + bones.write[38].bone_parent = "RightIndexIntermediate"; + bones.write[38].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[38].handle_offset = Vector2(0.597, 0.255); bones.write[38].group = "RightHand"; bones.write[39].bone_name = "RightMiddleProximal"; + bones.write[39].bone_parent = "RightHand"; + bones.write[39].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); bones.write[39].handle_offset = Vector2(0.5, 0.51); bones.write[39].group = "RightHand"; bones.write[40].bone_name = "RightMiddleIntermediate"; + bones.write[40].bone_parent = "RightMiddleProximal"; + bones.write[40].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); bones.write[40].handle_offset = Vector2(0.5, 0.345); bones.write[40].group = "RightHand"; bones.write[41].bone_name = "RightMiddleDistal"; + bones.write[41].bone_parent = "RightMiddleIntermediate"; + bones.write[41].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[41].handle_offset = Vector2(0.5, 0.22); bones.write[41].group = "RightHand"; bones.write[42].bone_name = "RightRingProximal"; + bones.write[42].bone_parent = "RightHand"; + bones.write[42].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.025, 0.075, 0); bones.write[42].handle_offset = Vector2(0.414, 0.52); bones.write[42].group = "RightHand"; bones.write[43].bone_name = "RightRingIntermediate"; + bones.write[43].bone_parent = "RightRingProximal"; + bones.write[43].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[43].handle_offset = Vector2(0.41, 0.36); bones.write[43].group = "RightHand"; bones.write[44].bone_name = "RightRingDistal"; + bones.write[44].bone_parent = "RightRingIntermediate"; + bones.write[44].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[44].handle_offset = Vector2(0.409, 0.25); bones.write[44].group = "RightHand"; bones.write[45].bone_name = "RightLittleProximal"; + bones.write[45].bone_parent = "RightHand"; + bones.write[45].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.05, 0.05, 0); bones.write[45].handle_offset = Vector2(0.337, 0.543); bones.write[45].group = "RightHand"; bones.write[46].bone_name = "RightLittleIntermediate"; + bones.write[46].bone_parent = "RightLittleProximal"; + bones.write[46].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); bones.write[46].handle_offset = Vector2(0.328, 0.415); bones.write[46].group = "RightHand"; bones.write[47].bone_name = "RightLittleDistal"; + bones.write[47].bone_parent = "RightLittleIntermediate"; + bones.write[47].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); bones.write[47].handle_offset = Vector2(0.328, 0.32); bones.write[47].group = "RightHand"; bones.write[48].bone_name = "LeftUpperLeg"; + bones.write[48].bone_parent = "Hips"; + bones.write[48].reference_pose = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, 0.1, 0, 0); bones.write[48].handle_offset = Vector2(0.549, 0.49); bones.write[48].group = "Body"; + bones.write[48].require = true; bones.write[49].bone_name = "LeftLowerLeg"; + bones.write[49].bone_parent = "LeftUpperLeg"; + bones.write[49].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.375, 0); bones.write[49].handle_offset = Vector2(0.548, 0.683); bones.write[49].group = "Body"; + bones.write[49].require = true; bones.write[50].bone_name = "LeftFoot"; + bones.write[50].bone_parent = "LeftLowerLeg"; + bones.write[50].reference_pose = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0.375, 0); bones.write[50].handle_offset = Vector2(0.545, 0.9); bones.write[50].group = "Body"; + bones.write[50].require = true; bones.write[51].bone_name = "LeftToes"; + bones.write[51].bone_parent = "LeftFoot"; + bones.write[51].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.15, 0); bones.write[51].handle_offset = Vector2(0.545, 0.95); bones.write[51].group = "Body"; bones.write[52].bone_name = "RightUpperLeg"; + bones.write[52].bone_parent = "Hips"; + bones.write[52].reference_pose = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, -0.1, 0, 0); bones.write[52].handle_offset = Vector2(0.451, 0.49); bones.write[52].group = "Body"; + bones.write[52].require = true; bones.write[53].bone_name = "RightLowerLeg"; + bones.write[53].bone_parent = "RightUpperLeg"; + bones.write[53].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.375, 0); bones.write[53].handle_offset = Vector2(0.452, 0.683); bones.write[53].group = "Body"; + bones.write[53].require = true; bones.write[54].bone_name = "RightFoot"; + bones.write[54].bone_parent = "RightLowerLeg"; + bones.write[54].reference_pose = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0.375, 0); bones.write[54].handle_offset = Vector2(0.455, 0.9); bones.write[54].group = "Body"; + bones.write[54].require = true; bones.write[55].bone_name = "RightToes"; + bones.write[55].bone_parent = "RightFoot"; + bones.write[55].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.15, 0); bones.write[55].handle_offset = Vector2(0.455, 0.95); bones.write[55].group = "Body"; } diff --git a/scene/resources/skeleton_profile.h b/scene/resources/skeleton_profile.h index 920aaa2b8d..d305311538 100644 --- a/scene/resources/skeleton_profile.h +++ b/scene/resources/skeleton_profile.h @@ -36,6 +36,13 @@ class SkeletonProfile : public Resource { GDCLASS(SkeletonProfile, Resource); +public: + enum TailDirection { + TAIL_DIRECTION_AVERAGE_CHILDREN, + TAIL_DIRECTION_SPECIFIC_CHILD, + TAIL_DIRECTION_END + }; + protected: // Note: SkeletonProfileHumanoid which extends SkeletonProfile exists to unify standard bone names. // That is what is_read_only is for, so don't make it public. @@ -48,8 +55,13 @@ protected: struct SkeletonProfileBone { StringName bone_name; + StringName bone_parent; + TailDirection tail_direction = TAIL_DIRECTION_AVERAGE_CHILDREN; + StringName bone_tail; + Transform3D reference_pose; Vector2 handle_offset; StringName group; + bool require = false; }; Vector<SkeletonProfileGroup> groups; @@ -74,15 +86,32 @@ public: int get_bone_size(); void set_bone_size(int p_size); + int find_bone(const StringName p_bone_name) const; + StringName get_bone_name(int p_bone_idx) const; void set_bone_name(int p_bone_idx, const StringName p_bone_name); + StringName get_bone_parent(int p_bone_idx) const; + void set_bone_parent(int p_bone_idx, const StringName p_bone_parent); + + TailDirection get_tail_direction(int p_bone_idx) const; + void set_tail_direction(int p_bone_idx, const TailDirection p_tail_direction); + + StringName get_bone_tail(int p_bone_idx) const; + void set_bone_tail(int p_bone_idx, const StringName p_bone_tail); + + Transform3D get_reference_pose(int p_bone_idx) const; + void set_reference_pose(int p_bone_idx, const Transform3D p_reference_pose); + Vector2 get_handle_offset(int p_bone_idx) const; void set_handle_offset(int p_bone_idx, const Vector2 p_handle_offset); StringName get_group(int p_bone_idx) const; void set_group(int p_bone_idx, const StringName p_group); + bool is_require(int p_bone_idx) const; + void set_require(int p_bone_idx, const bool p_require); + bool has_bone(StringName p_bone_name); SkeletonProfile(); @@ -97,4 +126,6 @@ public: ~SkeletonProfileHumanoid(); }; +VARIANT_ENUM_CAST(SkeletonProfile::TailDirection); + #endif // SKELETON_PROFILE_H diff --git a/scene/resources/sprite_frames.cpp b/scene/resources/sprite_frames.cpp index ba21b9fd17..55c9d7397d 100644 --- a/scene/resources/sprite_frames.cpp +++ b/scene/resources/sprite_frames.cpp @@ -96,17 +96,6 @@ void SpriteFrames::rename_animation(const StringName &p_prev, const StringName & animations[p_next] = anim; } -Vector<String> SpriteFrames::_get_animation_list() const { - Vector<String> ret; - List<StringName> al; - get_animation_list(&al); - for (const StringName &E : al) { - ret.push_back(E); - } - - return ret; -} - void SpriteFrames::get_animation_list(List<StringName> *r_animations) const { for (const KeyValue<StringName, Anim> &E : animations) { r_animations->push_back(E.key); @@ -147,31 +136,22 @@ bool SpriteFrames::get_animation_loop(const StringName &p_anim) const { return E->value.loop; } -void SpriteFrames::_set_frames(const Array &p_frames) { - clear_all(); - HashMap<StringName, Anim>::Iterator E = animations.find(SceneStringNames::get_singleton()->_default); - ERR_FAIL_COND(!E); - - E->value.frames.resize(p_frames.size()); - for (int i = 0; i < E->value.frames.size(); i++) { - E->value.frames.write[i] = p_frames[i]; - } -} - -Array SpriteFrames::_get_frames() const { - return Array(); -} - Array SpriteFrames::_get_animations() const { Array anims; - for (const KeyValue<StringName, Anim> &E : animations) { + + List<StringName> sorted_names; + get_animation_list(&sorted_names); + sorted_names.sort_custom<StringName::AlphCompare>(); + + for (const StringName &name : sorted_names) { + const Anim &anim = animations[name]; Dictionary d; - d["name"] = E.key; - d["speed"] = E.value.speed; - d["loop"] = E.value.loop; + d["name"] = name; + d["speed"] = anim.speed; + d["loop"] = anim.loop; Array frames; - for (int i = 0; i < E.value.frames.size(); i++) { - frames.push_back(E.value.frames[i]); + for (int i = 0; i < anim.frames.size(); i++) { + frames.push_back(anim.frames[i]); } d["frames"] = frames; anims.push_back(d); @@ -225,15 +205,12 @@ void SpriteFrames::_bind_methods() { ClassDB::bind_method(D_METHOD("clear", "anim"), &SpriteFrames::clear); ClassDB::bind_method(D_METHOD("clear_all"), &SpriteFrames::clear_all); - ClassDB::bind_method(D_METHOD("_set_frames"), &SpriteFrames::_set_frames); - ClassDB::bind_method(D_METHOD("_get_frames"), &SpriteFrames::_get_frames); - - ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "frames", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "_set_frames", "_get_frames"); //compatibility + // `animations` property is for serialization. ClassDB::bind_method(D_METHOD("_set_animations"), &SpriteFrames::_set_animations); ClassDB::bind_method(D_METHOD("_get_animations"), &SpriteFrames::_get_animations); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_animations", "_get_animations"); //compatibility + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_animations", "_get_animations"); } SpriteFrames::SpriteFrames() { diff --git a/scene/resources/sprite_frames.h b/scene/resources/sprite_frames.h index e32ccc1336..87d84b70c0 100644 --- a/scene/resources/sprite_frames.h +++ b/scene/resources/sprite_frames.h @@ -44,14 +44,9 @@ class SpriteFrames : public Resource { HashMap<StringName, Anim> animations; - Array _get_frames() const; - void _set_frames(const Array &p_frames); - Array _get_animations() const; void _set_animations(const Array &p_animations); - Vector<String> _get_animation_list() const; - protected: static void _bind_methods(); diff --git a/scene/resources/text_line.cpp b/scene/resources/text_line.cpp index f32b7feb4b..4e7ec9315a 100644 --- a/scene/resources/text_line.cpp +++ b/scene/resources/text_line.cpp @@ -74,7 +74,7 @@ void TextLine::_bind_methods() { ClassDB::bind_method(D_METHOD("set_flags", "flags"), &TextLine::set_flags); ClassDB::bind_method(D_METHOD("get_flags"), &TextLine::get_flags); - ADD_PROPERTY(PropertyInfo(Variant::INT, "flags", PROPERTY_HINT_FLAGS, "Kashida Justify,Word Justify,Trim Edge Spaces After Justify,Justify Only After Last Tab"), "set_flags", "get_flags"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "flags", PROPERTY_HINT_FLAGS, "Kashida Justification,Word Justication,Trim Edge Spaces After Justication,Justify Only After Last Tab,Constrain Ellipsis"), "set_flags", "get_flags"); ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "overrun_behavior"), &TextLine::set_text_overrun_behavior); ClassDB::bind_method(D_METHOD("get_text_overrun_behavior"), &TextLine::get_text_overrun_behavior); @@ -106,24 +106,24 @@ void TextLine::_shape() { TS->shaped_text_tab_align(rid, tab_stops); } - uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIM; + BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM; if (overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) { switch (overrun_behavior) { case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_WORD: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); break; case TextServer::OVERRUN_TRIM_CHAR: - overrun_flags |= TextServer::OVERRUN_TRIM; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); break; case TextServer::OVERRUN_NO_TRIMMING: break; @@ -131,7 +131,7 @@ void TextLine::_shape() { if (alignment == HORIZONTAL_ALIGNMENT_FILL) { TS->shaped_text_fit_to_width(rid, width, flags); - overrun_flags |= TextServer::OVERRUN_JUSTIFICATION_AWARE; + overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE); TS->shaped_text_overrun_trim_to_width(rid, width, overrun_flags); } else { TS->shaped_text_overrun_trim_to_width(rid, width, overrun_flags); @@ -241,14 +241,14 @@ void TextLine::tab_align(const Vector<float> &p_tab_stops) { dirty = true; } -void TextLine::set_flags(uint16_t p_flags) { +void TextLine::set_flags(BitField<TextServer::JustificationFlag> p_flags) { if (flags != p_flags) { flags = p_flags; dirty = true; } } -uint16_t TextLine::get_flags() const { +BitField<TextServer::JustificationFlag> TextLine::get_flags() const { return flags; } diff --git a/scene/resources/text_line.h b/scene/resources/text_line.h index 2d1548d079..e70e82cf2b 100644 --- a/scene/resources/text_line.h +++ b/scene/resources/text_line.h @@ -45,7 +45,7 @@ private: bool dirty = true; float width = -1.0; - uint16_t flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA; + BitField<TextServer::JustificationFlag> flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA; HorizontalAlignment alignment = HORIZONTAL_ALIGNMENT_LEFT; TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_TRIM_ELLIPSIS; @@ -84,8 +84,8 @@ public: void tab_align(const Vector<float> &p_tab_stops); - void set_flags(uint16_t p_flags); - uint16_t get_flags() const; + void set_flags(BitField<TextServer::JustificationFlag> p_flags); + BitField<TextServer::JustificationFlag> get_flags() const; void set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior); TextServer::OverrunBehavior get_text_overrun_behavior() const; diff --git a/scene/resources/text_paragraph.cpp b/scene/resources/text_paragraph.cpp index c8b9e895fc..2d9e0066e1 100644 --- a/scene/resources/text_paragraph.cpp +++ b/scene/resources/text_paragraph.cpp @@ -74,10 +74,15 @@ void TextParagraph::_bind_methods() { ClassDB::bind_method(D_METHOD("tab_align", "tab_stops"), &TextParagraph::tab_align); - ClassDB::bind_method(D_METHOD("set_flags", "flags"), &TextParagraph::set_flags); - ClassDB::bind_method(D_METHOD("get_flags"), &TextParagraph::get_flags); + ClassDB::bind_method(D_METHOD("set_break_flags", "flags"), &TextParagraph::set_break_flags); + ClassDB::bind_method(D_METHOD("get_break_flags"), &TextParagraph::get_break_flags); - ADD_PROPERTY(PropertyInfo(Variant::INT, "flags", PROPERTY_HINT_FLAGS, "Kashida Justify,Word Justify,Trim Edge Spaces After Justify,Justify Only After Last Tab,Break Mandatory,Break Words,Break Graphemes"), "set_flags", "get_flags"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "break_flags", PROPERTY_HINT_FLAGS, "Mandatory,Word Bouns,Grapheme Bound,Adaptive"), "set_break_flags", "get_break_flags"); + + ClassDB::bind_method(D_METHOD("set_justification_flags", "flags"), &TextParagraph::set_justification_flags); + ClassDB::bind_method(D_METHOD("get_justification_flags"), &TextParagraph::get_justification_flags); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "justification_flags", PROPERTY_HINT_FLAGS, "Kashida Justification,Word Justication,Trim Edge Spaces After Justication,Justify Only After Last Tab,Constrain Ellipsis"), "set_justification_flags", "get_justification_flags"); ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "overrun_behavior"), &TextParagraph::set_text_overrun_behavior); ClassDB::bind_method(D_METHOD("get_text_overrun_behavior"), &TextParagraph::get_text_overrun_behavior); @@ -154,7 +159,7 @@ void TextParagraph::_shape_lines() { if (h_offset > 0) { // Dropcap, flow around. - PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width - h_offset, 0, flags); + PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width - h_offset, 0, brk_flags); for (int i = 0; i < line_breaks.size(); i = i + 2) { RID line = TS->shaped_text_substr(rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]); float h = (TS->shaped_text_get_orientation(line) == TextServer::ORIENTATION_HORIZONTAL) ? TS->shaped_text_get_size(line).y : TS->shaped_text_get_size(line).x; @@ -172,7 +177,7 @@ void TextParagraph::_shape_lines() { } } // Use fixed for the rest of lines. - PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width, start, flags); + PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(rid, width, start, brk_flags); for (int i = 0; i < line_breaks.size(); i = i + 2) { RID line = TS->shaped_text_substr(rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]); if (!tab_stops.is_empty()) { @@ -181,43 +186,43 @@ void TextParagraph::_shape_lines() { lines_rid.push_back(line); } - uint16_t overrun_flags = TextServer::OVERRUN_NO_TRIM; + BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM; if (overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) { switch (overrun_behavior) { case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_ELLIPSIS: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_ADD_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); break; case TextServer::OVERRUN_TRIM_WORD: - overrun_flags |= TextServer::OVERRUN_TRIM; - overrun_flags |= TextServer::OVERRUN_TRIM_WORD_ONLY; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); break; case TextServer::OVERRUN_TRIM_CHAR: - overrun_flags |= TextServer::OVERRUN_TRIM; + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); break; case TextServer::OVERRUN_NO_TRIMMING: break; } } - bool autowrap_enabled = ((flags & TextServer::BREAK_WORD_BOUND) == TextServer::BREAK_WORD_BOUND) || ((flags & TextServer::BREAK_GRAPHEME_BOUND) == TextServer::BREAK_GRAPHEME_BOUND); + bool autowrap_enabled = brk_flags.has_flag(TextServer::BREAK_WORD_BOUND) || brk_flags.has_flag(TextServer::BREAK_GRAPHEME_BOUND); // Fill after min_size calculation. if (autowrap_enabled) { int visible_lines = (max_lines_visible >= 0) ? MIN(max_lines_visible, (int)lines_rid.size()) : (int)lines_rid.size(); bool lines_hidden = visible_lines > 0 && visible_lines < (int)lines_rid.size(); if (lines_hidden) { - overrun_flags |= TextServer::OVERRUN_ENFORCE_ELLIPSIS; + overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS); } if (alignment == HORIZONTAL_ALIGNMENT_FILL) { for (int i = 0; i < (int)lines_rid.size(); i++) { if (i < visible_lines - 1 || (int)lines_rid.size() == 1) { - TS->shaped_text_fit_to_width(lines_rid[i], width, flags); + TS->shaped_text_fit_to_width(lines_rid[i], width, jst_flags); } else if (i == (visible_lines - 1)) { TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags); } @@ -231,10 +236,10 @@ void TextParagraph::_shape_lines() { // Autowrap disabled. for (int i = 0; i < (int)lines_rid.size(); i++) { if (alignment == HORIZONTAL_ALIGNMENT_FILL) { - TS->shaped_text_fit_to_width(lines_rid[i], width, flags); - overrun_flags |= TextServer::OVERRUN_JUSTIFICATION_AWARE; + TS->shaped_text_fit_to_width(lines_rid[i], width, jst_flags); + overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE); TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); - TS->shaped_text_fit_to_width(lines_rid[i], width, flags | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS); + TS->shaped_text_fit_to_width(lines_rid[i], width, jst_flags | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS); } else { TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); } @@ -420,17 +425,30 @@ void TextParagraph::tab_align(const Vector<float> &p_tab_stops) { lines_dirty = true; } -void TextParagraph::set_flags(uint16_t p_flags) { +void TextParagraph::set_justification_flags(BitField<TextServer::JustificationFlag> p_flags) { + _THREAD_SAFE_METHOD_ + + if (jst_flags != p_flags) { + jst_flags = p_flags; + lines_dirty = true; + } +} + +BitField<TextServer::JustificationFlag> TextParagraph::get_justification_flags() const { + return jst_flags; +} + +void TextParagraph::set_break_flags(BitField<TextServer::LineBreakFlag> p_flags) { _THREAD_SAFE_METHOD_ - if (flags != p_flags) { - flags = p_flags; + if (brk_flags != p_flags) { + brk_flags = p_flags; lines_dirty = true; } } -uint16_t TextParagraph::get_flags() const { - return flags; +BitField<TextServer::LineBreakFlag> TextParagraph::get_break_flags() const { + return brk_flags; } void TextParagraph::set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior) { diff --git a/scene/resources/text_paragraph.h b/scene/resources/text_paragraph.h index f161cb5b8c..0fe82b4364 100644 --- a/scene/resources/text_paragraph.h +++ b/scene/resources/text_paragraph.h @@ -54,7 +54,8 @@ private: float width = -1.0; int max_lines_visible = -1; - uint16_t flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA; + BitField<TextServer::LineBreakFlag> brk_flags = TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND; + BitField<TextServer::JustificationFlag> jst_flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA; TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_NO_TRIMMING; HorizontalAlignment alignment = HORIZONTAL_ALIGNMENT_LEFT; @@ -102,8 +103,11 @@ public: void tab_align(const Vector<float> &p_tab_stops); - void set_flags(uint16_t p_flags); - uint16_t get_flags() const; + void set_justification_flags(BitField<TextServer::JustificationFlag> p_flags); + BitField<TextServer::JustificationFlag> get_justification_flags() const; + + void set_break_flags(BitField<TextServer::LineBreakFlag> p_flags); + BitField<TextServer::LineBreakFlag> get_break_flags() const; void set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior); TextServer::OverrunBehavior get_text_overrun_behavior() const; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 8c175e9ced..3a8f50c3c3 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -2157,7 +2157,7 @@ void GradientTexture1D::_bind_methods() { ClassDB::bind_method(D_METHOD("_update"), &GradientTexture1D::_update); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_gradient", "get_gradient"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_gradient", "get_gradient"); ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,16384,suffix:px"), "set_width", "get_width"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_hdr"), "set_use_hdr", "is_using_hdr"); } diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 05483db1e4..139ffaf510 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -3927,7 +3927,7 @@ void TileSetAtlasSource::_get_property_list(List<PropertyInfo> *p_list) const { tile_property_list.push_back(property_info); // animation_frames_count. - tile_property_list.push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NETWORK)); + tile_property_list.push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE)); // animation_frame_*. bool store_durations = tiles[E_tile.key].animation_frames_durations.size() >= 2; diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index b8eac6de00..b68cce9dda 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -30,6 +30,7 @@ #include "visual_shader.h" +#include "core/templates/rb_map.h" #include "core/templates/vmap.h" #include "servers/rendering/shader_types.h" #include "visual_shader_nodes.h" @@ -3189,18 +3190,18 @@ VisualShaderNodeInput::VisualShaderNodeInput() { ////////////// UniformRef -List<VisualShaderNodeUniformRef::Uniform> uniforms; +RBMap<RID, List<VisualShaderNodeUniformRef::Uniform>> uniforms; -void VisualShaderNodeUniformRef::add_uniform(const String &p_name, UniformType p_type) { - uniforms.push_back({ p_name, p_type }); +void VisualShaderNodeUniformRef::add_uniform(RID p_shader_rid, const String &p_name, UniformType p_type) { + uniforms[p_shader_rid].push_back({ p_name, p_type }); } -void VisualShaderNodeUniformRef::clear_uniforms() { - uniforms.clear(); +void VisualShaderNodeUniformRef::clear_uniforms(RID p_shader_rid) { + uniforms[p_shader_rid].clear(); } -bool VisualShaderNodeUniformRef::has_uniform(const String &p_name) { - for (const VisualShaderNodeUniformRef::Uniform &E : uniforms) { +bool VisualShaderNodeUniformRef::has_uniform(RID p_shader_rid, const String &p_name) { + for (const VisualShaderNodeUniformRef::Uniform &E : uniforms[p_shader_rid]) { if (E.name == p_name) { return true; } @@ -3313,14 +3314,24 @@ String VisualShaderNodeUniformRef::get_output_port_name(int p_port) const { return ""; } +void VisualShaderNodeUniformRef::set_shader_rid(const RID &p_shader_rid) { + shader_rid = p_shader_rid; +} + void VisualShaderNodeUniformRef::set_uniform_name(const String &p_name) { uniform_name = p_name; + if (shader_rid.is_valid()) { + update_uniform_type(); + } + emit_changed(); +} + +void VisualShaderNodeUniformRef::update_uniform_type() { if (uniform_name != "[None]") { uniform_type = get_uniform_type_by_name(uniform_name); } else { uniform_type = UniformType::UNIFORM_TYPE_FLOAT; } - emit_changed(); } String VisualShaderNodeUniformRef::get_uniform_name() const { @@ -3328,35 +3339,45 @@ String VisualShaderNodeUniformRef::get_uniform_name() const { } int VisualShaderNodeUniformRef::get_uniforms_count() const { - return uniforms.size(); + ERR_FAIL_COND_V(!shader_rid.is_valid(), 0); + + return uniforms[shader_rid].size(); } String VisualShaderNodeUniformRef::get_uniform_name_by_index(int p_idx) const { - if (p_idx >= 0 && p_idx < uniforms.size()) { - return uniforms[p_idx].name; + ERR_FAIL_COND_V(!shader_rid.is_valid(), String()); + + if (p_idx >= 0 && p_idx < uniforms[shader_rid].size()) { + return uniforms[shader_rid][p_idx].name; } return ""; } VisualShaderNodeUniformRef::UniformType VisualShaderNodeUniformRef::get_uniform_type_by_name(const String &p_name) const { - for (int i = 0; i < uniforms.size(); i++) { - if (uniforms[i].name == p_name) { - return uniforms[i].type; + ERR_FAIL_COND_V(!shader_rid.is_valid(), UNIFORM_TYPE_FLOAT); + + for (int i = 0; i < uniforms[shader_rid].size(); i++) { + if (uniforms[shader_rid][i].name == p_name) { + return uniforms[shader_rid][i].type; } } return UniformType::UNIFORM_TYPE_FLOAT; } VisualShaderNodeUniformRef::UniformType VisualShaderNodeUniformRef::get_uniform_type_by_index(int p_idx) const { - if (p_idx >= 0 && p_idx < uniforms.size()) { - return uniforms[p_idx].type; + ERR_FAIL_COND_V(!shader_rid.is_valid(), UNIFORM_TYPE_FLOAT); + + if (p_idx >= 0 && p_idx < uniforms[shader_rid].size()) { + return uniforms[shader_rid][p_idx].type; } return UniformType::UNIFORM_TYPE_FLOAT; } VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_port_type_by_index(int p_idx) const { - if (p_idx >= 0 && p_idx < uniforms.size()) { - switch (uniforms[p_idx].type) { + ERR_FAIL_COND_V(!shader_rid.is_valid(), PORT_TYPE_SCALAR); + + if (p_idx >= 0 && p_idx < uniforms[shader_rid].size()) { + switch (uniforms[shader_rid][p_idx].type) { case UniformType::UNIFORM_TYPE_FLOAT: return PORT_TYPE_SCALAR; case UniformType::UNIFORM_TYPE_INT: diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index afd84e49cc..7ca4e5fc4a 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -561,6 +561,7 @@ public: }; private: + RID shader_rid; String uniform_name = "[None]"; UniformType uniform_type = UniformType::UNIFORM_TYPE_FLOAT; @@ -568,9 +569,9 @@ protected: static void _bind_methods(); public: - static void add_uniform(const String &p_name, UniformType p_type); - static void clear_uniforms(); - static bool has_uniform(const String &p_name); + static void add_uniform(RID p_shader_rid, const String &p_name, UniformType p_type); + static void clear_uniforms(RID p_shader_rid); + static bool has_uniform(RID p_shader_rid, const String &p_name); public: virtual String get_caption() const override; @@ -583,9 +584,13 @@ public: virtual PortType get_output_port_type(int p_port) const override; virtual String get_output_port_name(int p_port) const override; + void set_shader_rid(const RID &p_shader); + void set_uniform_name(const String &p_name); String get_uniform_name() const; + void update_uniform_type(); + void _set_uniform_type(int p_uniform_type); int _get_uniform_type() const; diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 5d9a9e61dc..0408db2539 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -696,7 +696,7 @@ void AudioStreamRandomizer::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "streams_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_streams_count", "get_streams_count"); ADD_PROPERTY(PropertyInfo(Variant::INT, "playback_mode", PROPERTY_HINT_ENUM, "Random (Avoid Repeats),Random,Sequential"), "set_playback_mode", "get_playback_mode"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "random_pitch", PROPERTY_HINT_RANGE, "1,16,0.01"), "set_random_pitch", "get_random_pitch"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "random_volume_offset_db", PROPERTY_HINT_RANGE, "0,40,0,suffix:dB"), "set_random_volume_offset_db", "get_random_volume_offset_db"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "random_volume_offset_db", PROPERTY_HINT_RANGE, "0,40,0.01,suffix:dB"), "set_random_volume_offset_db", "get_random_volume_offset_db"); BIND_ENUM_CONSTANT(PLAYBACK_RANDOM_NO_REPEATS); BIND_ENUM_CONSTANT(PLAYBACK_RANDOM); diff --git a/servers/rendering/dummy/rasterizer_scene_dummy.h b/servers/rendering/dummy/rasterizer_scene_dummy.h index e6d2b93f99..b49d6cff69 100644 --- a/servers/rendering/dummy/rasterizer_scene_dummy.h +++ b/servers/rendering/dummy/rasterizer_scene_dummy.h @@ -143,8 +143,8 @@ public: void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) override {} void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) override {} - void shadows_quality_set(RS::ShadowQuality p_quality) override {} - void directional_shadow_quality_set(RS::ShadowQuality p_quality) override {} + void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override {} + void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override {} RID light_instance_create(RID p_light) override { return RID(); } void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override {} diff --git a/servers/rendering/dummy/storage/texture_storage.h b/servers/rendering/dummy/storage/texture_storage.h index fe10f6489c..195d378a41 100644 --- a/servers/rendering/dummy/storage/texture_storage.h +++ b/servers/rendering/dummy/storage/texture_storage.h @@ -169,6 +169,9 @@ public: virtual void render_target_set_sdf_size_and_scale(RID p_render_target, RS::ViewportSDFOversize p_size, RS::ViewportSDFScale p_scale) override {} virtual Rect2i render_target_get_sdf_rect(RID p_render_target) const override { return Rect2i(); } virtual void render_target_mark_sdf_enabled(RID p_render_target, bool p_enabled) override {} + + virtual void render_target_set_vrs_mode(RID p_render_target, RS::ViewportVRSMode p_mode) override{}; + virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override{}; }; } // namespace RendererDummy diff --git a/servers/rendering/renderer_canvas_render.cpp b/servers/rendering/renderer_canvas_render.cpp index f93fdd500a..623f0c647b 100644 --- a/servers/rendering/renderer_canvas_render.cpp +++ b/servers/rendering/renderer_canvas_render.cpp @@ -131,6 +131,6 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const { RendererCanvasRender::Item::CommandMesh::~CommandMesh() { if (mesh_instance.is_valid()) { - RSG::mesh_storage->mesh_free(mesh_instance); + RSG::mesh_storage->mesh_instance_free(mesh_instance); } } diff --git a/servers/rendering/renderer_rd/effects/copy_effects.cpp b/servers/rendering/renderer_rd/effects/copy_effects.cpp index c30e8ed58f..cbf7046887 100644 --- a/servers/rendering/renderer_rd/effects/copy_effects.cpp +++ b/servers/rendering/renderer_rd/effects/copy_effects.cpp @@ -100,11 +100,11 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) { { Vector<String> copy_modes; - copy_modes.push_back("\n"); - copy_modes.push_back("\n#define MODE_PANORAMA_TO_DP\n"); - copy_modes.push_back("\n#define MODE_TWO_SOURCES\n"); - copy_modes.push_back("\n#define MULTIVIEW\n"); - copy_modes.push_back("\n#define MULTIVIEW\n#define MODE_TWO_SOURCES\n"); + copy_modes.push_back("\n"); // COPY_TO_FB_COPY + copy_modes.push_back("\n#define MODE_PANORAMA_TO_DP\n"); // COPY_TO_FB_COPY_PANORAMA_TO_DP + copy_modes.push_back("\n#define MODE_TWO_SOURCES\n"); // COPY_TO_FB_COPY2 + copy_modes.push_back("\n#define MULTIVIEW\n"); // COPY_TO_FB_MULTIVIEW + copy_modes.push_back("\n#define MULTIVIEW\n#define MODE_TWO_SOURCES\n"); // COPY_TO_FB_MULTIVIEW_WITH_DEPTH copy_to_fb.shader.initialize(copy_modes); diff --git a/servers/rendering/renderer_rd/effects/vrs.cpp b/servers/rendering/renderer_rd/effects/vrs.cpp new file mode 100644 index 0000000000..505a35a269 --- /dev/null +++ b/servers/rendering/renderer_rd/effects/vrs.cpp @@ -0,0 +1,171 @@ +/*************************************************************************/ +/* vrs.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "vrs.h" +#include "../renderer_compositor_rd.h" +#include "../storage_rd/texture_storage.h" +#include "../uniform_set_cache_rd.h" +#include "servers/xr_server.h" + +using namespace RendererRD; + +VRS::VRS() { + { + Vector<String> vrs_modes; + vrs_modes.push_back("\n"); // VRS_DEFAULT + vrs_modes.push_back("\n#define MULTIVIEW\n"); // VRS_MULTIVIEW + + vrs_shader.shader.initialize(vrs_modes); + + if (!RendererCompositorRD::singleton->is_xr_enabled()) { + vrs_shader.shader.set_variant_enabled(VRS_MULTIVIEW, false); + } + + vrs_shader.shader_version = vrs_shader.shader.version_create(); + + //use additive + + for (int i = 0; i < VRS_MAX; i++) { + if (vrs_shader.shader.is_variant_enabled(i)) { + vrs_shader.pipelines[i].setup(vrs_shader.shader.version_get_shader(vrs_shader.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0); + } else { + vrs_shader.pipelines[i].clear(); + } + } + } +} + +VRS::~VRS() { + vrs_shader.shader.version_free(vrs_shader.shader_version); +} + +void VRS::copy_vrs(RID p_source_rd_texture, RID p_dest_framebuffer, bool p_multiview) { + UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); + ERR_FAIL_NULL(uniform_set_cache); + MaterialStorage *material_storage = MaterialStorage::get_singleton(); + ERR_FAIL_NULL(material_storage); + + // setup our uniforms + RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); + + RD::Uniform u_source_rd_texture(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_rd_texture })); + + VRSMode mode = p_multiview ? VRS_MULTIVIEW : VRS_DEFAULT; + + RID shader = vrs_shader.shader.version_get_shader(vrs_shader.shader_version, mode); + ERR_FAIL_COND(shader.is_null()); + + RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, Vector<Color>()); + RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, vrs_shader.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); + RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_rd_texture), 0); + RD::get_singleton()->draw_list_bind_index_array(draw_list, material_storage->get_quad_index_array()); + // RD::get_singleton()->draw_list_set_push_constant(draw_list, &vrs_shader.push_constant, sizeof(VRSPushConstant)); + RD::get_singleton()->draw_list_draw(draw_list, true); + RD::get_singleton()->draw_list_end(); +} + +void VRS::create_vrs_texture(const int p_base_width, const int p_base_height, const uint32_t p_view_count, RID &p_vrs_texture, RID &p_vrs_fb) { + // TODO find a way to skip this if VRS is not supported, but we don't have access to VulkanContext here, even though we're in vulkan.. hmmm + + // TODO we should find some way to store this properly, we're assuming 16x16 as this seems to be the standard but in our vrs_capacities we + // obtain a minimum and maximum size, and we should choose something within this range and then make sure that is consistantly set when creating + // our frame buffer. Also it is important that we make the resulting size we calculate down below available to the end user so they know the size + // of the VRS buffer to supply. + Size2i texel_size = Size2i(16, 16); + + RD::TextureFormat tf; + if (p_view_count > 1) { + tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; + } else { + tf.texture_type = RD::TEXTURE_TYPE_2D; + } + tf.format = RD::DATA_FORMAT_R8_UINT; + tf.width = p_base_width / texel_size.x; + if (p_base_width % texel_size.x != 0) { + tf.width++; + } + tf.height = p_base_height / texel_size.y; + if (p_base_height % texel_size.y != 0) { + tf.height++; + } + tf.array_layers = p_view_count; // create a layer for every view + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_VRS_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; + tf.samples = RD::TEXTURE_SAMPLES_1; + + p_vrs_texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + // by default VRS is assumed to be our VRS attachment, but if we need to write into it, we need a bit more control + Vector<RID> fb; + fb.push_back(p_vrs_texture); + + RD::FramebufferPass pass; + pass.color_attachments.push_back(0); + + Vector<RD::FramebufferPass> passes; + passes.push_back(pass); + + p_vrs_fb = RD::get_singleton()->framebuffer_create_multipass(fb, passes, RenderingDevice::INVALID_ID, p_view_count); +} + +void VRS::update_vrs_texture(RID p_vrs_fb, RID p_render_target) { + TextureStorage *texture_storage = TextureStorage::get_singleton(); + RS::ViewportVRSMode vrs_mode = texture_storage->render_target_get_vrs_mode(p_render_target); + + if (vrs_mode != RS::VIEWPORT_VRS_DISABLED) { + RD::get_singleton()->draw_command_begin_label("VRS Setup"); + + // TODO figure out if image has changed since it was last copied so we can save some resources.. + + if (vrs_mode == RS::VIEWPORT_VRS_TEXTURE) { + RID vrs_texture = texture_storage->render_target_get_vrs_texture(p_render_target); + if (vrs_texture.is_valid()) { + Texture *texture = texture_storage->get_texture(vrs_texture); + if (texture) { + // Copy into our density buffer + copy_vrs(texture->rd_texture, p_vrs_fb, texture->layers > 1); + } + } + } else if (vrs_mode == RS::VIEWPORT_VRS_XR) { + Ref<XRInterface> interface = XRServer::get_singleton()->get_primary_interface(); + if (interface.is_valid()) { + RID vrs_texture = interface->get_vrs_texture(); + if (vrs_texture.is_valid()) { + Texture *texture = texture_storage->get_texture(vrs_texture); + if (texture) { + // Copy into our density buffer + copy_vrs(texture->rd_texture, p_vrs_fb, texture->layers > 1); + } + } + } + } + + RD::get_singleton()->draw_command_end_label(); + } +} diff --git a/servers/rendering/renderer_rd/effects/vrs.h b/servers/rendering/renderer_rd/effects/vrs.h new file mode 100644 index 0000000000..0f2bdd31b6 --- /dev/null +++ b/servers/rendering/renderer_rd/effects/vrs.h @@ -0,0 +1,75 @@ +/*************************************************************************/ +/* vrs.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef VRS_RD_H +#define VRS_RD_H + +#include "servers/rendering/renderer_rd/pipeline_cache_rd.h" +#include "servers/rendering/renderer_rd/shaders/effects/vrs.glsl.gen.h" +#include "servers/rendering/renderer_scene_render.h" + +#include "servers/rendering_server.h" + +namespace RendererRD { + +class VRS { +private: + enum VRSMode { + VRS_DEFAULT, + VRS_MULTIVIEW, + VRS_MAX, + }; + + /* we have no push constant here (yet) + struct VRSPushConstant { + + }; + */ + + struct VRSShader { + // VRSPushConstant push_constant; + VrsShaderRD shader; + RID shader_version; + PipelineCacheRD pipelines[VRS_MAX]; + } vrs_shader; + +public: + VRS(); + ~VRS(); + + void copy_vrs(RID p_source_rd_texture, RID p_dest_framebuffer, bool p_multiview = false); + + void create_vrs_texture(const int p_base_width, const int p_base_height, const uint32_t p_view_count, RID &p_vrs_texture, RID &p_vrs_fb); + void update_vrs_texture(RID p_vrs_fb, RID p_render_target); +}; + +} // namespace RendererRD + +#endif // !VRS_RD_H diff --git a/servers/rendering/renderer_rd/effects_rd.cpp b/servers/rendering/renderer_rd/effects_rd.cpp index d45ddbc392..f731a0007a 100644 --- a/servers/rendering/renderer_rd/effects_rd.cpp +++ b/servers/rendering/renderer_rd/effects_rd.cpp @@ -1309,7 +1309,7 @@ EffectsRD::EffectsRD(bool p_prefer_raster_effects) { FSR_upscale_modes.push_back("\n#define MODE_FSR_UPSCALE_FALLBACK\n"); #else // Everyone else can use normal mode when available. - if (RD::get_singleton()->get_device_capabilities()->supports_fsr_half_float) { + if (RD::get_singleton()->has_feature(RD::SUPPORTS_FSR_HALF_FLOAT)) { FSR_upscale_modes.push_back("\n#define MODE_FSR_UPSCALE_NORMAL\n"); } else { FSR_upscale_modes.push_back("\n#define MODE_FSR_UPSCALE_FALLBACK\n"); diff --git a/servers/rendering/renderer_rd/environment/gi.cpp b/servers/rendering/renderer_rd/environment/gi.cpp index 16cd52dd9c..ce5a0eec02 100644 --- a/servers/rendering/renderer_rd/environment/gi.cpp +++ b/servers/rendering/renderer_rd/environment/gi.cpp @@ -109,6 +109,7 @@ void GI::voxel_gi_allocate_data(RID p_voxel_gi, const Transform3D &p_to_cell_xfo Vector<Vector<uint8_t>> s; s.push_back(p_distance_field); voxel_gi->sdf_texture = RD::get_singleton()->texture_create(tf, RD::TextureView(), s); + RD::get_singleton()->set_resource_name(voxel_gi->sdf_texture, "VoxelGI SDF Texture"); } #if 0 { @@ -122,6 +123,7 @@ void GI::voxel_gi_allocate_data(RID p_voxel_gi, const Transform3D &p_to_cell_xfo tf.shareable_formats.push_back(RD::DATA_FORMAT_R8_UNORM); tf.shareable_formats.push_back(RD::DATA_FORMAT_R8_UINT); voxel_gi->sdf_texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); + RD::get_singleton()->set_resource_name(voxel_gi->sdf_texture, "VoxelGI SDF Texture"); } RID shared_tex; { @@ -402,29 +404,38 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world RD::TextureFormat tf_render = tf_sdf; tf_render.format = RD::DATA_FORMAT_R16_UINT; render_albedo = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_albedo, "VoxelGI Render Albedo"); tf_render.format = RD::DATA_FORMAT_R32_UINT; render_emission = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_emission, "VoxelGI Render Emission"); render_emission_aniso = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_emission_aniso, "VoxelGI Render Emission Aniso"); tf_render.format = RD::DATA_FORMAT_R8_UNORM; //at least its easy to visualize for (int i = 0; i < 8; i++) { render_occlusion[i] = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_occlusion[i], String("VoxelGI Render Occlusion ") + itos(i)); } tf_render.format = RD::DATA_FORMAT_R32_UINT; render_geom_facing = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_geom_facing, "VoxelGI Render Geometry Facing"); tf_render.format = RD::DATA_FORMAT_R8G8B8A8_UINT; render_sdf[0] = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_sdf[0], "VoxelGI Render SDF 0"); render_sdf[1] = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_sdf[1], "VoxelGI Render SDF 1"); tf_render.width /= 2; tf_render.height /= 2; tf_render.depth /= 2; render_sdf_half[0] = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_sdf_half[0], "VoxelGI Render SDF Half 0"); render_sdf_half[1] = RD::get_singleton()->texture_create(tf_render, RD::TextureView()); + RD::get_singleton()->set_resource_name(render_sdf_half[1], "VoxelGI Render SDF Half 1"); } RD::TextureFormat tf_occlusion = tf_sdf; @@ -465,7 +476,9 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world tf_probe_average.texture_type = RD::TEXTURE_TYPE_2D; lightprobe_history_scroll = RD::get_singleton()->texture_create(tf_probe_history, RD::TextureView()); + RD::get_singleton()->set_resource_name(lightprobe_history_scroll, "VoxelGI LightProbe History Scroll"); lightprobe_average_scroll = RD::get_singleton()->texture_create(tf_probe_average, RD::TextureView()); + RD::get_singleton()->set_resource_name(lightprobe_average_scroll, "VoxelGI LightProbe Average Scroll"); { //octahedral lightprobes @@ -479,6 +492,7 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world //lightprobe texture is an octahedral texture lightprobe_data = RD::get_singleton()->texture_create(tf_octprobes, RD::TextureView()); + RD::get_singleton()->set_resource_name(lightprobe_data, "VoxelGI LightProbe Data"); RD::TextureView tv; tv.format_override = RD::DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32; lightprobe_texture = RD::get_singleton()->texture_create_shared(tv, lightprobe_data); @@ -492,11 +506,13 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world tf_ambient.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; //lightprobe texture is an octahedral texture ambient_texture = RD::get_singleton()->texture_create(tf_ambient, RD::TextureView()); + RD::get_singleton()->set_resource_name(ambient_texture, "VoxelGI Ambient Texture"); } cascades_ubo = RD::get_singleton()->uniform_buffer_create(sizeof(SDFGI::Cascade::UBO) * SDFGI::MAX_CASCADES); occlusion_data = RD::get_singleton()->texture_create(tf_occlusion, RD::TextureView()); + RD::get_singleton()->set_resource_name(occlusion_data, "VoxelGI Occlusion Data"); { RD::TextureView tv; tv.format_override = RD::DATA_FORMAT_R4G4B4A4_UNORM_PACK16; @@ -509,11 +525,15 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world /* 3D Textures */ cascade.sdf_tex = RD::get_singleton()->texture_create(tf_sdf, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.sdf_tex, "VoxelGI Cascade SDF Texture"); cascade.light_data = RD::get_singleton()->texture_create(tf_light, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.light_data, "VoxelGI Cascade Light Data"); cascade.light_aniso_0_tex = RD::get_singleton()->texture_create(tf_aniso0, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.light_aniso_0_tex, "VoxelGI Cascade Light Aniso 0 Texture"); cascade.light_aniso_1_tex = RD::get_singleton()->texture_create(tf_aniso1, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.light_aniso_1_tex, "VoxelGI Cascade Light Aniso 1 Texture"); { RD::TextureView tv; @@ -540,9 +560,11 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world /* Probe History */ cascade.lightprobe_history_tex = RD::get_singleton()->texture_create(tf_probe_history, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.lightprobe_history_tex, "VoxelGI Cascade LightProbe History Texture"); RD::get_singleton()->texture_clear(cascade.lightprobe_history_tex, Color(0, 0, 0, 0), 0, 1, 0, tf_probe_history.array_layers); //needs to be cleared for average to work cascade.lightprobe_average_tex = RD::get_singleton()->texture_create(tf_probe_average, RD::TextureView()); + RD::get_singleton()->set_resource_name(cascade.lightprobe_average_tex, "VoxelGI Cascade LightProbe Average Texture"); RD::get_singleton()->texture_clear(cascade.lightprobe_average_tex, Color(0, 0, 0, 0), 0, 1, 0, 1); //needs to be cleared for average to work /* Buffers */ @@ -2445,6 +2467,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); + RD::get_singleton()->set_resource_name(texture, "VoxelGI Instance Texture"); RD::get_singleton()->texture_clear(texture, Color(0, 0, 0, 0), 0, levels.size(), 0, 1); @@ -2574,6 +2597,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID dtf.usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; } dmap.texture = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.texture, "VoxelGI Instance DMap Texture"); if (dynamic_maps.size() == 0) { // Render depth for first one. @@ -2581,6 +2605,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID dtf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D16_UNORM, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D16_UNORM : RD::DATA_FORMAT_X8_D24_UNORM_PACK32; dtf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; dmap.fb_depth = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.fb_depth, "VoxelGI Instance DMap FB Depth"); } //just use depth as-is @@ -2588,13 +2613,17 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID dtf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; dmap.depth = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.depth, "VoxelGI Instance DMap Depth"); if (dynamic_maps.size() == 0) { dtf.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; dtf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; dmap.albedo = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.albedo, "VoxelGI Instance DMap Albedo"); dmap.normal = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.normal, "VoxelGI Instance DMap Normal"); dmap.orm = RD::get_singleton()->texture_create(dtf, RD::TextureView()); + RD::get_singleton()->set_resource_name(dmap.orm, "VoxelGI Instance DMap ORM"); Vector<RID> fb; fb.push_back(dmap.albedo); @@ -3343,37 +3372,40 @@ void GI::init(RendererSceneSkyRD *p_sky) { //calculate tables String defines = "\n#define SDFGI_OCT_SIZE " + itos(SDFGI::LIGHTPROBE_OCT_SIZE) + "\n"; Vector<String> gi_modes; + gi_modes.push_back("\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_VOXEL_GI gi_modes.push_back("\n#define USE_SDFGI\n"); // MODE_SDFGI gi_modes.push_back("\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_COMBINED - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_HALF_RES_VOXEL_GI - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_SDFGI\n"); // MODE_HALF_RES_SDFGI - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_HALF_RES_COMBINED - - gi_modes.push_back("\n#define USE_VOXEL_GI_INSTANCES\n#define USE_MULTIVIEW\n"); // MODE_VOXEL_GI_MULTIVIEW - gi_modes.push_back("\n#define USE_SDFGI\n#define USE_MULTIVIEW\n"); // MODE_SDFGI_MULTIVIEW - gi_modes.push_back("\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n#define USE_MULTIVIEW\n"); // MODE_COMBINED_MULTIVIEW - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_VOXEL_GI_INSTANCES\n#define USE_MULTIVIEW\n"); // MODE_HALF_RES_VOXEL_GI_MULTIVIEW - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_SDFGI\n#define USE_MULTIVIEW\n"); // MODE_HALF_RES_SDFGI_MULTIVIEW - gi_modes.push_back("\n#define MODE_HALF_RES\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n#define USE_MULTIVIEW\n"); // MODE_HALF_RES_COMBINED_MULTIVIEW shader.initialize(gi_modes, defines); + shader_version = shader.version_create(); + + Vector<RD::PipelineSpecializationConstant> specialization_constants; + + { + RD::PipelineSpecializationConstant sc; + sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL; + sc.constant_id = 0; // SHADER_SPECIALIZATION_HALF_RES + sc.bool_value = false; + specialization_constants.push_back(sc); - if (!RendererCompositorRD::singleton->is_xr_enabled()) { - shader.set_variant_enabled(MODE_VOXEL_GI_MULTIVIEW, false); - shader.set_variant_enabled(MODE_SDFGI_MULTIVIEW, false); - shader.set_variant_enabled(MODE_COMBINED_MULTIVIEW, false); - shader.set_variant_enabled(MODE_HALF_RES_VOXEL_GI_MULTIVIEW, false); - shader.set_variant_enabled(MODE_HALF_RES_SDFGI_MULTIVIEW, false); - shader.set_variant_enabled(MODE_HALF_RES_COMBINED_MULTIVIEW, false); + sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL; + sc.constant_id = 1; // SHADER_SPECIALIZATION_USE_FULL_PROJECTION_MATRIX + sc.bool_value = false; + specialization_constants.push_back(sc); + + sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL; + sc.constant_id = 2; // SHADER_SPECIALIZATION_USE_VRS + sc.bool_value = false; + specialization_constants.push_back(sc); } - shader_version = shader.version_create(); - for (int i = 0; i < MODE_MAX; i++) { - if (shader.is_variant_enabled(i)) { - pipelines[i] = RD::get_singleton()->compute_pipeline_create(shader.version_get_shader(shader_version, i)); - } else { - pipelines[i] = RID(); + for (int v = 0; v < SHADER_SPECIALIZATION_VARIATIONS; v++) { + specialization_constants.ptrw()[0].bool_value = (v & SHADER_SPECIALIZATION_HALF_RES) ? true : false; + specialization_constants.ptrw()[1].bool_value = (v & SHADER_SPECIALIZATION_USE_FULL_PROJECTION_MATRIX) ? true : false; + specialization_constants.ptrw()[2].bool_value = (v & SHADER_SPECIALIZATION_USE_VRS) ? true : false; + for (int i = 0; i < MODE_MAX; i++) { + pipelines[v][i] = RD::get_singleton()->compute_pipeline_create(shader.version_get_shader(shader_version, i), specialization_constants); } } @@ -3565,25 +3597,17 @@ void GI::RenderBuffersGI::free() { } if (ambient_buffer.is_valid()) { - if (view_count == 1) { - // Only one view? then these are copies of our main buffers. - ambient_view[0] = RID(); - reflection_view[0] = RID(); - } else { - // Multiple views? free our slices. - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(ambient_view[v]); - RD::get_singleton()->free(reflection_view[v]); - ambient_view[v] = RID(); - reflection_view[v] = RID(); - } - } - - // Now we can free our buffers. RD::get_singleton()->free(ambient_buffer); RD::get_singleton()->free(reflection_buffer); ambient_buffer = RID(); reflection_buffer = RID(); + + // these are automatically freed when we free the textures, so just reset.. + for (uint32_t v = 0; v < RendererSceneRender::MAX_RENDER_VIEWS; v++) { + ambient_slice[v] = RID(); + reflection_slice[v] = RID(); + } + view_count = 0; } @@ -3593,7 +3617,7 @@ void GI::RenderBuffersGI::free() { } } -void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_voxel_gi_buffer, RID p_environment, uint32_t p_view_count, const CameraMatrix *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances, RendererSceneRenderRD *p_scene_render) { +void GI::process_gi(RID p_render_buffers, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, const RID *p_vrs_slices, RID p_environment, uint32_t p_view_count, const CameraMatrix *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances, RendererSceneRenderRD *p_scene_render) { RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton(); @@ -3607,14 +3631,13 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v if (rb->rbgi.ambient_buffer.is_null() || rb->rbgi.using_half_size_gi != half_resolution || rb->rbgi.view_count != p_view_count) { // Free our old buffer if applicable if (rb->rbgi.ambient_buffer.is_valid()) { - if (rb->rbgi.view_count > 1) { - for (uint32_t v = 0; v < rb->rbgi.view_count; v++) { - RD::get_singleton()->free(rb->rbgi.ambient_view[v]); - RD::get_singleton()->free(rb->rbgi.reflection_view[v]); - } - } RD::get_singleton()->free(rb->rbgi.ambient_buffer); RD::get_singleton()->free(rb->rbgi.reflection_buffer); + + for (uint32_t v = 0; v < RendererSceneRender::MAX_RENDER_VIEWS; v++) { + rb->rbgi.ambient_slice[v] = RID(); + rb->rbgi.reflection_slice[v] = RID(); + } } // Remember the view count we're using @@ -3638,18 +3661,19 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v } tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; rb->rbgi.ambient_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); + RD::get_singleton()->set_resource_name(rb->rbgi.ambient_buffer, "GI Ambient Buffer"); rb->rbgi.reflection_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); + RD::get_singleton()->set_resource_name(rb->rbgi.reflection_buffer, "GI Reflection Buffer"); rb->rbgi.using_half_size_gi = half_resolution; if (p_view_count == 1) { - // Just one view? Copy our buffers - rb->rbgi.ambient_view[0] = rb->rbgi.ambient_buffer; - rb->rbgi.reflection_view[0] = rb->rbgi.reflection_buffer; + // Just copy, we don't need to create slices + rb->rbgi.ambient_slice[0] = rb->rbgi.ambient_buffer; + rb->rbgi.reflection_slice[0] = rb->rbgi.reflection_buffer; } else { - // More then one view? Create slices for each view for (uint32_t v = 0; v < p_view_count; v++) { - rb->rbgi.ambient_view[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->rbgi.ambient_buffer, v, 0); - rb->rbgi.reflection_view[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->rbgi.reflection_buffer, v, 0); + rb->rbgi.ambient_slice[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->rbgi.ambient_buffer, v, 0); + rb->rbgi.reflection_slice[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->rbgi.reflection_buffer, v, 0); } } } @@ -3682,29 +3706,45 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v // Now compute the contents of our buffers. RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(true); - for (uint32_t v = 0; v < p_view_count; v++) { - // Render each eye seperately. - // We need to look into whether we can make our compute shader use Multiview but not sure that works or makes a difference.. + // Render each eye seperately. + // We need to look into whether we can make our compute shader use Multiview but not sure that works or makes a difference.. - // setup our push constant + // setup our push constant - PushConstant push_constant; + PushConstant push_constant; - push_constant.view_index = v; - push_constant.orthogonal = p_projections[v].is_orthogonal(); - push_constant.max_voxel_gi_instances = MIN((uint64_t)MAX_VOXEL_GI_INSTANCES, p_voxel_gi_instances.size()); - push_constant.high_quality_vct = voxel_gi_quality == RS::VOXEL_GI_QUALITY_HIGH; + push_constant.max_voxel_gi_instances = MIN((uint64_t)MAX_VOXEL_GI_INSTANCES, p_voxel_gi_instances.size()); + push_constant.high_quality_vct = voxel_gi_quality == RS::VOXEL_GI_QUALITY_HIGH; - push_constant.z_near = p_projections[v].get_z_near(); - push_constant.z_far = p_projections[v].get_z_far(); + // these should be the same for all views + push_constant.orthogonal = p_projections[0].is_orthogonal(); + push_constant.z_near = p_projections[0].get_z_near(); + push_constant.z_far = p_projections[0].get_z_far(); - push_constant.proj_info[0] = -2.0f / (rb->internal_width * p_projections[v].matrix[0][0]); - push_constant.proj_info[1] = -2.0f / (rb->internal_height * p_projections[v].matrix[1][1]); - push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0]; - push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1]; + // these are only used if we have 1 view, else we use the projections in our scene data + push_constant.proj_info[0] = -2.0f / (rb->internal_width * p_projections[0].matrix[0][0]); + push_constant.proj_info[1] = -2.0f / (rb->internal_height * p_projections[0].matrix[1][1]); + push_constant.proj_info[2] = (1.0f - p_projections[0].matrix[0][2]) / p_projections[0].matrix[0][0]; + push_constant.proj_info[3] = (1.0f + p_projections[0].matrix[1][2]) / p_projections[0].matrix[1][1]; - bool use_sdfgi = rb->sdfgi != nullptr; - bool use_voxel_gi_instances = push_constant.max_voxel_gi_instances > 0; + bool use_sdfgi = rb->sdfgi != nullptr; + bool use_voxel_gi_instances = push_constant.max_voxel_gi_instances > 0; + + uint32_t pipeline_specialization = 0; + if (rb->rbgi.using_half_size_gi) { + pipeline_specialization |= SHADER_SPECIALIZATION_HALF_RES; + } + if (p_view_count > 1) { + pipeline_specialization |= SHADER_SPECIALIZATION_USE_FULL_PROJECTION_MATRIX; + } + if (p_vrs_slices[0].is_valid()) { + pipeline_specialization |= SHADER_SPECIALIZATION_USE_VRS; + } + + Mode mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_COMBINED : (use_sdfgi ? MODE_SDFGI : MODE_VOXEL_GI); + + for (uint32_t v = 0; v < p_view_count; v++) { + push_constant.view_index = v; // setup our uniform set if (rb->rbgi.uniform_set[v].is_null() || !RD::get_singleton()->uniform_set_is_valid(rb->rbgi.uniform_set[v])) { @@ -3791,7 +3831,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; u.binding = 9; - u.append_id(rb->rbgi.ambient_view[v]); + u.append_id(rb->rbgi.ambient_slice[v]); uniforms.push_back(u); } @@ -3799,7 +3839,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; u.binding = 10; - u.append_id(rb->rbgi.reflection_view[v]); + u.append_id(rb->rbgi.reflection_slice[v]); uniforms.push_back(u); } @@ -3825,7 +3865,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.binding = 13; - u.append_id(p_normal_roughness_views[v]); + u.append_id(p_normal_roughness_slices[v]); uniforms.push_back(u); } { @@ -3866,27 +3906,19 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v u.append_id(rb->rbgi.scene_data_ubo); uniforms.push_back(u); } + { + RD::Uniform u; + u.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u.binding = 19; + RID buffer = p_vrs_slices[v].is_valid() ? p_vrs_slices[v] : texture_storage->texture_rd_get_default(RendererRD::DEFAULT_RD_TEXTURE_VRS); + u.append_id(buffer); + uniforms.push_back(u); + } rb->rbgi.uniform_set[v] = RD::get_singleton()->uniform_set_create(uniforms, shader.version_get_shader(shader_version, 0), 0); } - Mode mode; - - if (p_view_count > 1) { - if (rb->rbgi.using_half_size_gi) { - mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_HALF_RES_COMBINED_MULTIVIEW : (use_sdfgi ? MODE_HALF_RES_SDFGI_MULTIVIEW : MODE_HALF_RES_VOXEL_GI_MULTIVIEW); - } else { - mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_COMBINED_MULTIVIEW : (use_sdfgi ? MODE_SDFGI_MULTIVIEW : MODE_VOXEL_GI_MULTIVIEW); - } - } else { - if (rb->rbgi.using_half_size_gi) { - mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_HALF_RES_COMBINED : (use_sdfgi ? MODE_HALF_RES_SDFGI : MODE_HALF_RES_VOXEL_GI); - } else { - mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_COMBINED : (use_sdfgi ? MODE_SDFGI : MODE_VOXEL_GI); - } - } - - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, pipelines[mode]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, pipelines[pipeline_specialization][mode]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, rb->rbgi.uniform_set[v], 0); RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(PushConstant)); diff --git a/servers/rendering/renderer_rd/environment/gi.h b/servers/rendering/renderer_rd/environment/gi.h index 380538374c..ac41ad20e1 100644 --- a/servers/rendering/renderer_rd/environment/gi.h +++ b/servers/rendering/renderer_rd/environment/gi.h @@ -661,13 +661,13 @@ public: /* GI buffers */ RID ambient_buffer; + RID ambient_slice[RendererSceneRender::MAX_RENDER_VIEWS]; RID reflection_buffer; - RID ambient_view[RendererSceneRender::MAX_RENDER_VIEWS]; - RID reflection_view[RendererSceneRender::MAX_RENDER_VIEWS]; - RID uniform_set[RendererSceneRender::MAX_RENDER_VIEWS]; + RID reflection_slice[RendererSceneRender::MAX_RENDER_VIEWS]; bool using_half_size_gi = false; uint32_t view_count = 1; + RID uniform_set[RendererSceneRender::MAX_RENDER_VIEWS]; RID scene_data_ubo; void free(); @@ -730,44 +730,41 @@ public: }; struct PushConstant { - uint32_t view_index; uint32_t max_voxel_gi_instances; uint32_t high_quality_vct; uint32_t orthogonal; + uint32_t view_index; float proj_info[4]; float z_near; float z_far; - float pad1; float pad2; + float pad3; }; RID sdfgi_ubo; + enum Mode { MODE_VOXEL_GI, MODE_SDFGI, MODE_COMBINED, - MODE_HALF_RES_VOXEL_GI, - MODE_HALF_RES_SDFGI, - MODE_HALF_RES_COMBINED, - - MODE_VOXEL_GI_MULTIVIEW, - MODE_SDFGI_MULTIVIEW, - MODE_COMBINED_MULTIVIEW, - MODE_HALF_RES_VOXEL_GI_MULTIVIEW, - MODE_HALF_RES_SDFGI_MULTIVIEW, - MODE_HALF_RES_COMBINED_MULTIVIEW, - MODE_MAX }; + enum ShaderSpecializations { + SHADER_SPECIALIZATION_HALF_RES = 1 << 0, + SHADER_SPECIALIZATION_USE_FULL_PROJECTION_MATRIX = 1 << 1, + SHADER_SPECIALIZATION_USE_VRS = 1 << 2, + SHADER_SPECIALIZATION_VARIATIONS = 0x07, + }; + RID default_voxel_gi_buffer; bool half_resolution = false; GiShaderRD shader; RID shader_version; - RID pipelines[MODE_MAX]; + RID pipelines[SHADER_SPECIALIZATION_VARIATIONS][MODE_MAX]; GI(); ~GI(); @@ -778,7 +775,7 @@ public: SDFGI *create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size); void setup_voxel_gi_instances(RID p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used, RendererSceneRenderRD *p_scene_render); - void process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_voxel_gi_buffer, RID p_environment, uint32_t p_view_count, const CameraMatrix *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances, RendererSceneRenderRD *p_scene_render); + void process_gi(RID p_render_buffers, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, const RID *p_vrs_slices, RID p_environment, uint32_t p_view_count, const CameraMatrix *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances, RendererSceneRenderRD *p_scene_render); RID voxel_gi_instance_create(RID p_base); void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform); diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index f759fa3aa5..85652a041d 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -171,29 +171,24 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::ensure_voxelgi() } void RenderForwardClustered::RenderBufferDataForwardClustered::clear() { + // note, slices are freed automatically when the parent texture is freed so we just clear them. + for (uint32_t v = 0; v < RendererSceneRender::MAX_RENDER_VIEWS; v++) { + color_views[v] = RID(); + depth_views[v] = RID(); + color_msaa_views[v] = RID(); + depth_msaa_views[v] = RID(); + normal_roughness_views[v] = RID(); + normal_roughness_msaa_views[v] = RID(); + voxelgi_views[v] = RID(); + voxelgi_msaa_views[v] = RID(); + vrs_views[v] = RID(); + } + if (voxelgi_buffer != RID()) { RD::get_singleton()->free(voxelgi_buffer); voxelgi_buffer = RID(); - if (view_count == 1) { - voxelgi_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(voxelgi_views[v]); - voxelgi_views[v] = RID(); - } - } - if (voxelgi_buffer_msaa.is_valid()) { - if (view_count == 1) { - voxelgi_msaa_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(voxelgi_msaa_views[v]); - voxelgi_msaa_views[v] = RID(); - } - } - RD::get_singleton()->free(voxelgi_buffer_msaa); voxelgi_buffer_msaa = RID(); } @@ -202,35 +197,11 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::clear() { } if (color_msaa.is_valid()) { - if (view_count == 1) { - color_views[0] = RID(); - color_msaa_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(color_views[v]); - RD::get_singleton()->free(color_msaa_views[v]); - color_views[v] = RID(); - color_msaa_views[v] = RID(); - } - } - RD::get_singleton()->free(color_msaa); color_msaa = RID(); } if (depth_msaa.is_valid()) { - if (view_count == 1) { - depth_views[0] = RID(); - depth_msaa_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(depth_views[v]); - RD::get_singleton()->free(depth_msaa_views[v]); - depth_views[v] = RID(); - depth_msaa_views[v] = RID(); - } - } - RD::get_singleton()->free(depth_msaa); depth_msaa = RID(); } @@ -245,33 +216,17 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::clear() { } color = RID(); + color_only_fb = RID(); depth = RID(); depth_fb = RID(); color_framebuffers.clear(); // Color pass framebuffers are freed automatically by their dependency relations if (normal_roughness_buffer.is_valid()) { - if (view_count == 1) { - normal_roughness_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(normal_roughness_views[v]); - normal_roughness_views[v] = RID(); - } - } - RD::get_singleton()->free(normal_roughness_buffer); normal_roughness_buffer = RID(); if (normal_roughness_buffer_msaa.is_valid()) { - if (view_count == 1) { - normal_roughness_msaa_views[0] = RID(); - } else { - for (uint32_t v = 0; v < view_count; v++) { - RD::get_singleton()->free(normal_roughness_msaa_views[v]); - normal_roughness_msaa_views[v] = RID(); - } - } RD::get_singleton()->free(normal_roughness_buffer_msaa); normal_roughness_buffer_msaa = RID(); } @@ -294,11 +249,12 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::clear() { } } -void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count) { +void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count, RID p_vrs_texture) { clear(); msaa = p_msaa; use_taa = p_use_taa; + vrs = p_vrs_texture; width = p_width; height = p_height; @@ -307,11 +263,26 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RID p_c color = p_color_buffer; depth = p_depth_buffer; + if (vrs.is_valid()) { + if (view_count == 1) { + // just reuse + vrs_views[0] = vrs; + } else { + // create slices + for (uint32_t v = 0; v < view_count; v++) { + vrs_views[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), vrs, v, 0); + } + } + } + if (p_msaa == RS::VIEWPORT_MSAA_DISABLED) { { Vector<RID> fb; fb.push_back(p_color_buffer); fb.push_back(depth); + if (vrs.is_valid()) { + fb.push_back(vrs); + } color_only_fb = RD::get_singleton()->framebuffer_create(fb, RenderingDevice::INVALID_ID, view_count); } @@ -371,6 +342,9 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RID p_c Vector<RID> fb; fb.push_back(color_msaa); fb.push_back(depth_msaa); + if (vrs.is_valid()) { + fb.push_back(vrs); + } color_only_fb = RD::get_singleton()->framebuffer_create(fb, RenderingDevice::INVALID_ID, view_count); } @@ -409,6 +383,10 @@ RID RenderForwardClustered::RenderBufferDataForwardClustered::get_color_pass_fb( fb.push_back(use_msaa ? depth_msaa : depth); + if (vrs.is_valid()) { + fb.push_back(vrs); + } + int v_count = (p_color_pass_flags & COLOR_PASS_FLAG_MULTIVIEW) ? view_count : 1; RID framebuffer = RD::get_singleton()->framebuffer_create(fb, RD::INVALID_ID, v_count); color_framebuffers[p_color_pass_flags] = framebuffer; @@ -1673,8 +1651,8 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co continue_depth = !finish_depth; } - RID null_rids[2]; - _pre_opaque_render(p_render_data, using_ssao, using_ssil, using_sdfgi || using_voxelgi, render_buffer ? render_buffer->normal_roughness_views : null_rids, render_buffer ? render_buffer->voxelgi_buffer : RID()); + RID nullrids[RendererSceneRender::MAX_RENDER_VIEWS]; + _pre_opaque_render(p_render_data, using_ssao, using_ssil, using_sdfgi || using_voxelgi, render_buffer ? render_buffer->normal_roughness_views : nullrids, render_buffer ? render_buffer->voxelgi_buffer : RID(), render_buffer ? render_buffer->vrs_views : nullrids); RD::get_singleton()->draw_command_begin_label("Render Opaque Pass"); diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index 9e1f1b9954..ff712a20a1 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -107,11 +107,14 @@ class RenderForwardClustered : public RendererSceneRenderRD { RID depth_normal_roughness_voxelgi_fb; RID color_only_fb; RID specular_only_fb; + + RID vrs; + int width, height; HashMap<uint32_t, RID> color_framebuffers; // for multiview - uint32_t view_count; + uint32_t view_count = 1; RID color_views[RendererSceneRender::MAX_RENDER_VIEWS]; // we should rewrite this so we get access to the existing views in our renderer, something we can address when we reorg this RID depth_views[RendererSceneRender::MAX_RENDER_VIEWS]; // we should rewrite this so we get access to the existing views in our renderer, something we can address when we reorg this RID color_msaa_views[RendererSceneRender::MAX_RENDER_VIEWS]; @@ -120,13 +123,14 @@ class RenderForwardClustered : public RendererSceneRenderRD { RID normal_roughness_msaa_views[RendererSceneRender::MAX_RENDER_VIEWS]; RID voxelgi_views[RendererSceneRender::MAX_RENDER_VIEWS]; RID voxelgi_msaa_views[RendererSceneRender::MAX_RENDER_VIEWS]; + RID vrs_views[RendererSceneRender::MAX_RENDER_VIEWS]; RID render_sdfgi_uniform_set; void ensure_specular(); void ensure_voxelgi(); void ensure_velocity(); void clear(); - virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count); + virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count, RID p_vrs_texture); RID get_color_pass_fb(uint32_t p_color_pass_flags); ~RenderBufferDataForwardClustered(); diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index e1855ddb36..966621c93e 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -87,10 +87,11 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::clear() { } } -void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count) { +void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count, RID p_vrs_texture) { clear(); msaa = p_msaa; + vrs = p_vrs_texture; Size2i target_size = RD::get_singleton()->texture_size(p_target_buffer); @@ -108,6 +109,9 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b Vector<RID> fb; fb.push_back(p_color_buffer); // 0 - color buffer fb.push_back(depth); // 1 - depth buffer + if (vrs.is_valid()) { + fb.push_back(vrs); // 2 - vrs texture + } // Now define our subpasses Vector<RD::FramebufferPass> passes; @@ -116,6 +120,9 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b // re-using the same attachments pass.color_attachments.push_back(0); pass.depth_attachment = 1; + if (vrs.is_valid()) { + pass.vrs_attachment = 2; + } // - opaque pass passes.push_back(pass); @@ -131,12 +138,13 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b if (!is_scaled) { // - add blit to 2D pass - fb.push_back(p_target_buffer); // 2 - target buffer + int target_buffer_id = fb.size(); + fb.push_back(p_target_buffer); // 2/3 - target buffer RD::FramebufferPass blit_pass; - blit_pass.color_attachments.push_back(2); + blit_pass.color_attachments.push_back(target_buffer_id); blit_pass.input_attachments.push_back(0); - passes.push_back(blit_pass); + passes.push_back(blit_pass); // this doesn't need VRS color_fbs[FB_CONFIG_FOUR_SUBPASSES] = RD::get_singleton()->framebuffer_create_multipass(fb, passes, RenderingDevice::INVALID_ID, view_count); } else { @@ -179,6 +187,9 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b Vector<RID> fb; fb.push_back(color_msaa); // 0 - msaa color buffer fb.push_back(depth_msaa); // 1 - msaa depth buffer + if (vrs.is_valid()) { + fb.push_back(vrs); // 2 - vrs texture + } // Now define our subpasses Vector<RD::FramebufferPass> passes; @@ -187,18 +198,22 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b // re-using the same attachments pass.color_attachments.push_back(0); pass.depth_attachment = 1; + if (vrs.is_valid()) { + pass.vrs_attachment = 2; + } // - opaque pass passes.push_back(pass); // - add sky pass - fb.push_back(color); // 2 - color buffer + int color_buffer_id = fb.size(); + fb.push_back(color); // color buffer passes.push_back(pass); // without resolve for our 3 + 4 subpass config { // but with resolve for our 2 subpass config Vector<RD::FramebufferPass> two_passes; two_passes.push_back(pass); // opaque subpass without resolve - pass.resolve_attachments.push_back(2); + pass.resolve_attachments.push_back(color_buffer_id); two_passes.push_back(pass); // sky subpass with resolve color_fbs[FB_CONFIG_TWO_SUBPASSES] = RD::get_singleton()->framebuffer_create_multipass(fb, two_passes, RenderingDevice::INVALID_ID, view_count); @@ -217,10 +232,11 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RID p_color_b if (!is_scaled) { // - add blit to 2D pass - fb.push_back(p_target_buffer); // 3 - target buffer + int target_buffer_id = fb.size(); + fb.push_back(p_target_buffer); // target buffer RD::FramebufferPass blit_pass; - blit_pass.color_attachments.push_back(3); - blit_pass.input_attachments.push_back(2); + blit_pass.color_attachments.push_back(target_buffer_id); + blit_pass.input_attachments.push_back(color_buffer_id); passes.push_back(blit_pass); color_fbs[FB_CONFIG_FOUR_SUBPASSES] = RD::get_singleton()->framebuffer_create_multipass(fb, passes, RenderingDevice::INVALID_ID, view_count); @@ -675,8 +691,8 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color RD::get_singleton()->draw_command_end_label(); // Setup Sky resolution buffers } - RID null_rids[2]; - _pre_opaque_render(p_render_data, false, false, false, null_rids, RID()); + RID nullrids[RendererSceneRender::MAX_RENDER_VIEWS]; + _pre_opaque_render(p_render_data, false, false, false, nullrids, RID(), nullrids); uint32_t spec_constant_base_flags = 0; diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index 473a58045c..bf4a52d466 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -131,12 +131,14 @@ protected: RID depth_msaa; // RID normal_roughness_buffer_msaa; + RID vrs; + RID color_fbs[FB_CONFIG_MAX]; int width, height; uint32_t view_count; void clear(); - virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count); + virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count, RID p_vrs_texture); ~RenderBufferDataForwardMobile(); }; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 5185d537ec..a2a0538e04 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -1827,6 +1827,16 @@ void RendererSceneRenderRD::_free_render_buffer_data(RenderBuffers *rb) { rb->sss_texture = RID(); } + if (rb->vrs_fb.is_valid()) { + RD::get_singleton()->free(rb->vrs_fb); + rb->vrs_fb = RID(); + } + + if (rb->vrs_texture.is_valid()) { + RD::get_singleton()->free(rb->vrs_texture); + rb->vrs_texture = RID(); + } + for (int i = 0; i < 2; i++) { for (int l = 0; l < rb->blur[i].layers.size(); l++) { for (int m = 0; m < rb->blur[i].layers[l].mipmaps.size(); m++) { @@ -3151,8 +3161,13 @@ void RendererSceneRenderRD::render_buffers_configure(RID p_render_buffers, RID p } } + RS::ViewportVRSMode vrs_mode = texture_storage->render_target_get_vrs_mode(rb->render_target); + if (is_vrs_supported() && vrs_mode != RS::VIEWPORT_VRS_DISABLED) { + vrs->create_vrs_texture(p_internal_width, p_internal_height, p_view_count, rb->vrs_texture, rb->vrs_fb); + } + RID target_texture = texture_storage->render_target_get_rd_texture(rb->render_target); - rb->data->configure(rb->internal_texture, rb->depth_texture, target_texture, p_internal_width, p_internal_height, p_msaa, p_use_taa, p_view_count); + rb->data->configure(rb->internal_texture, rb->depth_texture, target_texture, p_internal_width, p_internal_height, p_msaa, p_use_taa, p_view_count, rb->vrs_texture); if (is_clustered_enabled()) { rb->cluster_builder->setup(Size2i(p_internal_width, p_internal_height), max_cluster_elements, rb->depth_texture, RendererRD::MaterialStorage::get_singleton()->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED), rb->internal_texture); @@ -3176,7 +3191,7 @@ void RendererSceneRenderRD::sub_surface_scattering_set_scale(float p_scale, floa sss_depth_scale = p_depth_scale; } -void RendererSceneRenderRD::shadows_quality_set(RS::ShadowQuality p_quality) { +void RendererSceneRenderRD::positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { ERR_FAIL_INDEX_MSG(p_quality, RS::SHADOW_QUALITY_MAX, "Shadow quality too high, please see RenderingServer's ShadowQuality enum"); if (shadows_quality != p_quality) { @@ -3223,7 +3238,7 @@ void RendererSceneRenderRD::shadows_quality_set(RS::ShadowQuality p_quality) { _update_shader_quality_settings(); } -void RendererSceneRenderRD::directional_shadow_quality_set(RS::ShadowQuality p_quality) { +void RendererSceneRenderRD::directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { ERR_FAIL_INDEX_MSG(p_quality, RS::SHADOW_QUALITY_MAX, "Shadow quality too high, please see RenderingServer's ShadowQuality enum"); if (directional_shadow_quality != p_quality) { @@ -4929,7 +4944,7 @@ void RendererSceneRenderRD::_pre_resolve_render(RenderDataRD *p_render_data, boo } } -void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, RID *p_normal_roughness_views, RID p_voxel_gi_buffer) { +void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, const RID *p_vrs_slices) { // Render shadows while GI is rendering, due to how barriers are handled, this should happen at the same time RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); @@ -5004,7 +5019,7 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool //start GI if (render_gi) { - gi.process_gi(p_render_data->render_buffers, p_normal_roughness_views, p_voxel_gi_buffer, p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->view_eye_offset, p_render_data->cam_transform, *p_render_data->voxel_gi_instances, this); + gi.process_gi(p_render_data->render_buffers, p_normal_roughness_slices, p_voxel_gi_buffer, p_vrs_slices, p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->view_eye_offset, p_render_data->cam_transform, *p_render_data->voxel_gi_instances, this); } //Do shadow rendering (in parallel with GI) @@ -5045,13 +5060,13 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool } if (p_use_ssao) { - // TODO make these proper stereo and thus use p_normal_roughness_views correctly - _process_ssao(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_views[0], p_render_data->cam_projection); + // TODO make these proper stereo + _process_ssao(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection); } if (p_use_ssil) { - // TODO make these proper stereo and thus use p_normal_roughness_views correctly - _process_ssil(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_views[0], p_render_data->cam_projection, p_render_data->cam_transform); + // TODO make these proper stereo + _process_ssil(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection, p_render_data->cam_transform); } } @@ -5240,6 +5255,11 @@ void RendererSceneRenderRD::render_scene(RID p_render_buffers, const CameraData render_data.cluster_max_elements = current_cluster_builder->get_max_cluster_elements(); } + if (rb != nullptr && rb->vrs_fb.is_valid()) { + // vrs_fb will only be valid if vrs is enabled + vrs->update_vrs_texture(rb->vrs_fb, rb->render_target); + } + _render_scene(&render_data, clear_color); if (p_render_buffers.is_valid()) { @@ -5736,6 +5756,10 @@ int RendererSceneRenderRD::get_max_directional_lights() const { return cluster.max_directional_lights; } +bool RendererSceneRenderRD::is_vrs_supported() const { + return RD::get_singleton()->has_feature(RD::SUPPORTS_ATTACHMENT_VRS); +} + bool RendererSceneRenderRD::is_dynamic_gi_supported() const { // usable by default (unless low end = true) return true; @@ -5960,8 +5984,8 @@ void fog() { directional_soft_shadow_kernel = memnew_arr(float, 128); penumbra_shadow_kernel = memnew_arr(float, 128); soft_shadow_kernel = memnew_arr(float, 128); - shadows_quality_set(RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/shadows/soft_shadow_quality")))); - directional_shadow_quality_set(RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_quality")))); + positional_soft_shadow_filter_set_quality(RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/positional_shadow/soft_shadow_filter_quality")))); + directional_soft_shadow_filter_set_quality(RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_filter_quality")))); environment_set_volumetric_fog_volume_size(GLOBAL_GET("rendering/environment/volumetric_fog/volume_size"), GLOBAL_GET("rendering/environment/volumetric_fog/volume_depth")); environment_set_volumetric_fog_filter_active(GLOBAL_GET("rendering/environment/volumetric_fog/use_filter")); @@ -5975,6 +5999,7 @@ void fog() { bokeh_dof = memnew(RendererRD::BokehDOF(!can_use_storage)); copy_effects = memnew(RendererRD::CopyEffects(!can_use_storage)); tone_mapper = memnew(RendererRD::ToneMapper); + vrs = memnew(RendererRD::VRS); } RendererSceneRenderRD::~RendererSceneRenderRD() { @@ -5989,6 +6014,9 @@ RendererSceneRenderRD::~RendererSceneRenderRD() { if (tone_mapper) { memdelete(tone_mapper); } + if (vrs) { + memdelete(vrs); + } for (const KeyValue<int, ShadowCubemap> &E : shadow_cubemaps) { RD::get_singleton()->free(E.value.cubemap); diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index e8296882c9..d11bbd183e 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -38,6 +38,7 @@ #include "servers/rendering/renderer_rd/effects/bokeh_dof.h" #include "servers/rendering/renderer_rd/effects/copy_effects.h" #include "servers/rendering/renderer_rd/effects/tone_mapper.h" +#include "servers/rendering/renderer_rd/effects/vrs.h" #include "servers/rendering/renderer_rd/environment/gi.h" #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h" #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h" @@ -104,11 +105,12 @@ protected: RendererRD::BokehDOF *bokeh_dof = nullptr; RendererRD::CopyEffects *copy_effects = nullptr; RendererRD::ToneMapper *tone_mapper = nullptr; + RendererRD::VRS *vrs = nullptr; double time = 0.0; double time_step = 0.0; struct RenderBufferData { - virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count) = 0; + virtual void configure(RID p_color_buffer, RID p_depth_buffer, RID p_target_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa, bool p_use_taa, uint32_t p_view_count, RID p_vrs_texture) = 0; virtual ~RenderBufferData() {} }; virtual RenderBufferData *_create_render_buffer_data() = 0; @@ -149,7 +151,7 @@ protected: void _post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi); void _pre_resolve_render(RenderDataRD *p_render_data, bool p_use_gi); - void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, RID *p_normal_roughness_views, RID p_voxel_gi_buffer); + void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, const RID *p_vrs_slices); void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data); void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data); @@ -492,6 +494,8 @@ private: RID depth_texture; //main depth texture RID texture_fb; // framebuffer for the main texture, ONLY USED FOR MOBILE RENDERER POST EFFECTS, DO NOT USE FOR RENDERING 3D!!! RID upscale_texture; //used when upscaling internal_texture (This uses the same resource as internal_texture if there is no upscaling) + RID vrs_texture; // texture for vrs. + RID vrs_fb; // framebuffer to write to our vrs texture // Access to the layers for each of our views (specifically needed for applying post effects on stereoscopic images) struct View { @@ -1454,8 +1458,8 @@ public: RS::SubSurfaceScatteringQuality sub_surface_scattering_get_quality() const; virtual void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) override; - virtual void shadows_quality_set(RS::ShadowQuality p_quality) override; - virtual void directional_shadow_quality_set(RS::ShadowQuality p_quality) override; + virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; + virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; virtual void decals_set_filter(RS::DecalFilter p_filter) override; virtual void light_projectors_set_filter(RS::LightProjectorFilter p_filter) override; @@ -1503,6 +1507,7 @@ public: virtual void sdfgi_set_debug_probe_select(const Vector3 &p_position, const Vector3 &p_dir) override; + virtual bool is_vrs_supported() const; virtual bool is_dynamic_gi_supported() const; virtual bool is_clustered_enabled() const; virtual bool is_volumetric_supported() const; diff --git a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl index 9787c9879d..1c17eabb56 100644 --- a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl @@ -88,7 +88,7 @@ layout(set = 0, binding = 0) uniform sampler2DArray source_color; layout(set = 1, binding = 0) uniform sampler2DArray source_depth; layout(location = 1) out float depth; #endif /* MODE_TWO_SOURCES */ -#else +#else /* MULTIVIEW */ layout(set = 0, binding = 0) uniform sampler2D source_color; #ifdef MODE_TWO_SOURCES layout(set = 1, binding = 0) uniform sampler2D source_color2; @@ -139,7 +139,7 @@ void main() { //uv.y = 1.0 - uv.y; uv = 1.0 - uv; } -#endif +#endif /* MODE_PANORAMA_TO_DP */ #ifdef MULTIVIEW vec4 color = textureLod(source_color, uv, 0.0); @@ -148,12 +148,13 @@ void main() { depth = textureLod(source_depth, uv, 0.0).r; #endif /* MODE_TWO_SOURCES */ -#else +#else /* MULTIVIEW */ vec4 color = textureLod(source_color, uv, 0.0); #ifdef MODE_TWO_SOURCES color += textureLod(source_color2, uv, 0.0); #endif /* MODE_TWO_SOURCES */ #endif /* MULTIVIEW */ + if (params.force_luminance) { color.rgb = vec3(max(max(color.r, color.g), color.b)); } @@ -163,5 +164,6 @@ void main() { if (params.srgb) { color.rgb = linear_to_srgb(color.rgb); } + frag_color = color; } diff --git a/servers/rendering/renderer_rd/shaders/effects/vrs.glsl b/servers/rendering/renderer_rd/shaders/effects/vrs.glsl new file mode 100644 index 0000000000..5ef83c0b44 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/vrs.glsl @@ -0,0 +1,72 @@ +#[vertex] + +#version 450 + +#VERSION_DEFINES + +#ifdef MULTIVIEW +#ifdef has_VK_KHR_multiview +#extension GL_EXT_multiview : enable +#define ViewIndex gl_ViewIndex +#else // has_VK_KHR_multiview +#define ViewIndex 0 +#endif // has_VK_KHR_multiview +#endif //MULTIVIEW + +#ifdef MULTIVIEW +layout(location = 0) out vec3 uv_interp; +#else +layout(location = 0) out vec2 uv_interp; +#endif + +void main() { + vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); + uv_interp.xy = base_arr[gl_VertexIndex]; +#ifdef MULTIVIEW + uv_interp.z = ViewIndex; +#endif + + gl_Position = vec4(uv_interp.xy * 2.0 - 1.0, 0.0, 1.0); +} + +#[fragment] + +#version 450 + +#VERSION_DEFINES + +#ifdef MULTIVIEW +#ifdef has_VK_KHR_multiview +#extension GL_EXT_multiview : enable +#define ViewIndex gl_ViewIndex +#else // has_VK_KHR_multiview +#define ViewIndex 0 +#endif // has_VK_KHR_multiview +#endif //MULTIVIEW + +#ifdef MULTIVIEW +layout(location = 0) in vec3 uv_interp; +layout(set = 0, binding = 0) uniform sampler2DArray source_color; +#else /* MULTIVIEW */ +layout(location = 0) in vec2 uv_interp; +layout(set = 0, binding = 0) uniform sampler2D source_color; +#endif /* MULTIVIEW */ + +layout(location = 0) out uint frag_color; + +void main() { +#ifdef MULTIVIEW + vec3 uv = uv_interp; +#else + vec2 uv = uv_interp; +#endif + +#ifdef MULTIVIEW + vec4 color = textureLod(source_color, uv, 0.0); +#else /* MULTIVIEW */ + vec4 color = textureLod(source_color, uv, 0.0); +#endif /* MULTIVIEW */ + + // See if we can change the sampler to one that returns int... + frag_color = uint(color.r * 256.0); +} diff --git a/servers/rendering/renderer_rd/shaders/environment/gi.glsl b/servers/rendering/renderer_rd/shaders/environment/gi.glsl index f687d50a2d..5f34e7112d 100644 --- a/servers/rendering/renderer_rd/shaders/environment/gi.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/gi.glsl @@ -8,6 +8,12 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; #define M_PI 3.141592 +/* Specialization Constants (Toggles) */ + +layout(constant_id = 0) const bool sc_half_res = false; +layout(constant_id = 1) const bool sc_use_full_projection_matrix = false; +layout(constant_id = 2) const bool sc_use_vrs = false; + #define SDFGI_MAX_CASCADES 8 //set 0 for SDFGI and render buffers @@ -97,18 +103,20 @@ layout(set = 0, binding = 18, std140) uniform SceneData { } scene_data; +layout(r8ui, set = 0, binding = 19) uniform restrict readonly uimage2D vrs_buffer; + layout(push_constant, std430) uniform Params { - uint view_index; uint max_voxel_gi_instances; bool high_quality_vct; bool orthogonal; + uint view_index; vec4 proj_info; float z_near; float z_far; - float pad1; float pad2; + float pad3; } params; @@ -140,34 +148,34 @@ vec4 blend_color(vec4 src, vec4 dst) { } vec3 reconstruct_position(ivec2 screen_pos) { -#ifdef USE_MULTIVIEW - vec4 pos; - pos.xy = (2.0 * vec2(screen_pos) / vec2(scene_data.screen_size)) - 1.0; - pos.z = texelFetch(sampler2D(depth_buffer, linear_sampler), screen_pos, 0).r * 2.0 - 1.0; - pos.w = 1.0; + if (sc_use_full_projection_matrix) { + vec4 pos; + pos.xy = (2.0 * vec2(screen_pos) / vec2(scene_data.screen_size)) - 1.0; + pos.z = texelFetch(sampler2D(depth_buffer, linear_sampler), screen_pos, 0).r * 2.0 - 1.0; + pos.w = 1.0; - pos = scene_data.inv_projection[params.view_index] * pos; + pos = scene_data.inv_projection[params.view_index] * pos; - return pos.xyz / pos.w; -#else - vec3 pos; - pos.z = texelFetch(sampler2D(depth_buffer, linear_sampler), screen_pos, 0).r; - - pos.z = pos.z * 2.0 - 1.0; - if (params.orthogonal) { - pos.z = ((pos.z + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0; + return pos.xyz / pos.w; } else { - pos.z = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - pos.z * (params.z_far - params.z_near)); - } - pos.z = -pos.z; + vec3 pos; + pos.z = texelFetch(sampler2D(depth_buffer, linear_sampler), screen_pos, 0).r; + + pos.z = pos.z * 2.0 - 1.0; + if (params.orthogonal) { + pos.z = ((pos.z + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0; + } else { + pos.z = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - pos.z * (params.z_far - params.z_near)); + } + pos.z = -pos.z; - pos.xy = vec2(screen_pos) * params.proj_info.xy + params.proj_info.zw; - if (!params.orthogonal) { - pos.xy *= pos.z; - } + pos.xy = vec2(screen_pos) * params.proj_info.xy + params.proj_info.zw; + if (!params.orthogonal) { + pos.xy *= pos.z; + } - return pos; -#endif + return pos; + } } void sdfvoxel_gi_process(uint cascade, vec3 cascade_pos, vec3 cam_pos, vec3 cam_normal, vec3 cam_specular_normal, float roughness, out vec3 diffuse_light, out vec3 specular_light) { @@ -587,7 +595,6 @@ void voxel_gi_compute(uint index, vec3 position, vec3 normal, vec3 ref_vec, mat3 vec4 fetch_normal_and_roughness(ivec2 pos) { vec4 normal_roughness = texelFetch(sampler2D(normal_roughness_buffer, linear_sampler), pos, 0); - normal_roughness.xyz = normalize(normal_roughness.xyz * 2.0 - 1.0); return normal_roughness; } @@ -600,7 +607,7 @@ void process_gi(ivec2 pos, vec3 vertex, inout vec4 ambient_light, inout vec4 ref if (normal.length() > 0.5) { //valid normal, can do GI float roughness = normal_roughness.w; - vec3 view = -normalize(mat3(scene_data.cam_transform) * (vertex - scene_data.eye_offset[params.view_index].xyz)); + vec3 view = -normalize(mat3(scene_data.cam_transform) * (vertex - scene_data.eye_offset[gl_GlobalInvocationID.z].xyz)); vertex = mat3(scene_data.cam_transform) * vertex; normal = normalize(mat3(scene_data.cam_transform) * normal); vec3 reflection = normalize(reflect(-view, normal)); @@ -648,9 +655,35 @@ void process_gi(ivec2 pos, vec3 vertex, inout vec4 ambient_light, inout vec4 ref void main() { ivec2 pos = ivec2(gl_GlobalInvocationID.xy); -#ifdef MODE_HALF_RES - pos <<= 1; -#endif + uint vrs_x, vrs_y; + if (sc_use_vrs) { + ivec2 vrs_pos; + + // Currenty we use a 16x16 texel, possibly some day make this configurable. + if (sc_half_res) { + vrs_pos = pos >> 3; + } else { + vrs_pos = pos >> 4; + } + + uint vrs_texel = imageLoad(vrs_buffer, vrs_pos).r; + // note, valid values for vrs_x and vrs_y are 1, 2 and 4. + vrs_x = 1 << ((vrs_texel >> 2) & 3); + vrs_y = 1 << (vrs_texel & 3); + + if (mod(pos.x, vrs_x) != 0) { + return; + } + + if (mod(pos.y, vrs_y) != 0) { + return; + } + } + + if (sc_half_res) { + pos <<= 1; + } + if (any(greaterThanEqual(pos, scene_data.screen_size))) { //too large, do nothing return; } @@ -663,10 +696,69 @@ void main() { process_gi(pos, vertex, ambient_light, reflection_light); -#ifdef MODE_HALF_RES - pos >>= 1; -#endif + if (sc_half_res) { + pos >>= 1; + } imageStore(ambient_buffer, pos, ambient_light); imageStore(reflection_buffer, pos, reflection_light); + + if (sc_use_vrs) { + if (vrs_x > 1) { + imageStore(ambient_buffer, pos + ivec2(1, 0), ambient_light); + imageStore(reflection_buffer, pos + ivec2(1, 0), reflection_light); + } + + if (vrs_x > 2) { + imageStore(ambient_buffer, pos + ivec2(2, 0), ambient_light); + imageStore(reflection_buffer, pos + ivec2(2, 0), reflection_light); + + imageStore(ambient_buffer, pos + ivec2(3, 0), ambient_light); + imageStore(reflection_buffer, pos + ivec2(3, 0), reflection_light); + } + + if (vrs_y > 1) { + imageStore(ambient_buffer, pos + ivec2(0, 1), ambient_light); + imageStore(reflection_buffer, pos + ivec2(0, 1), reflection_light); + } + + if (vrs_y > 1 && vrs_x > 1) { + imageStore(ambient_buffer, pos + ivec2(1, 1), ambient_light); + imageStore(reflection_buffer, pos + ivec2(1, 1), reflection_light); + } + + if (vrs_y > 1 && vrs_x > 2) { + imageStore(ambient_buffer, pos + ivec2(2, 1), ambient_light); + imageStore(reflection_buffer, pos + ivec2(2, 1), reflection_light); + + imageStore(ambient_buffer, pos + ivec2(3, 1), ambient_light); + imageStore(reflection_buffer, pos + ivec2(3, 1), reflection_light); + } + + if (vrs_y > 2) { + imageStore(ambient_buffer, pos + ivec2(0, 2), ambient_light); + imageStore(reflection_buffer, pos + ivec2(0, 2), reflection_light); + imageStore(ambient_buffer, pos + ivec2(0, 3), ambient_light); + imageStore(reflection_buffer, pos + ivec2(0, 3), reflection_light); + } + + if (vrs_y > 2 && vrs_x > 1) { + imageStore(ambient_buffer, pos + ivec2(1, 2), ambient_light); + imageStore(reflection_buffer, pos + ivec2(1, 2), reflection_light); + imageStore(ambient_buffer, pos + ivec2(1, 3), ambient_light); + imageStore(reflection_buffer, pos + ivec2(1, 3), reflection_light); + } + + if (vrs_y > 2 && vrs_x > 2) { + imageStore(ambient_buffer, pos + ivec2(2, 2), ambient_light); + imageStore(reflection_buffer, pos + ivec2(2, 2), reflection_light); + imageStore(ambient_buffer, pos + ivec2(2, 3), ambient_light); + imageStore(reflection_buffer, pos + ivec2(2, 3), reflection_light); + + imageStore(ambient_buffer, pos + ivec2(3, 2), ambient_light); + imageStore(reflection_buffer, pos + ivec2(3, 2), reflection_light); + imageStore(ambient_buffer, pos + ivec2(3, 3), ambient_light); + imageStore(reflection_buffer, pos + ivec2(3, 3), reflection_light); + } + } } diff --git a/servers/rendering/renderer_rd/shaders/taa_resolve.glsl b/servers/rendering/renderer_rd/shaders/taa_resolve.glsl index a1a77b95aa..ddd984ad83 100644 --- a/servers/rendering/renderer_rd/shaders/taa_resolve.glsl +++ b/servers/rendering/renderer_rd/shaders/taa_resolve.glsl @@ -29,7 +29,8 @@ #VERSION_DEFINES -// Based on Spartan Engine's TAA implementation https://github.com/PanosK92/SpartanEngine/blob/master/Data/shaders/temporal_antialiasing.hlsl +// Based on Spartan Engine's TAA implementation (without TAA upscale). +// <https://github.com/PanosK92/SpartanEngine/blob/a8338d0609b85dc32f3732a5c27fb4463816a3b9/Data/shaders/temporal_antialiasing.hlsl> #define USE_SUBGROUPS diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 1109357a74..762ad685e8 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -349,7 +349,6 @@ TextureStorage::TextureStorage() { Vector<uint8_t> pv; pv.resize(16 * 4); - for (int i = 0; i < 16; i++) { pv.set(i * 4 + 0, 0); pv.set(i * 4 + 1, 0); @@ -358,7 +357,6 @@ TextureStorage::TextureStorage() { } { - //take the chance and initialize decal atlas to something Vector<Vector<uint8_t>> vpv; vpv.push_back(pv); decal_atlas.texture = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv); @@ -366,6 +364,29 @@ TextureStorage::TextureStorage() { } } + { //create default VRS + + RD::TextureFormat tformat; + tformat.format = RD::DATA_FORMAT_R8_UINT; + tformat.width = 4; + tformat.height = 4; + tformat.array_layers = 1; + tformat.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_VRS_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT; + tformat.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; + + Vector<uint8_t> pv; + pv.resize(4 * 4); + for (int i = 0; i < 4 * 4; i++) { + pv.set(i, 0); + } + + { + Vector<Vector<uint8_t>> vpv; + vpv.push_back(pv); + default_rd_textures[DEFAULT_RD_TEXTURE_VRS] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv); + } + } + { Vector<String> sdf_modes; sdf_modes.push_back("\n#define MODE_LOAD\n"); @@ -2751,3 +2772,31 @@ void TextureStorage::render_target_set_backbuffer_uniform_set(RID p_render_targe ERR_FAIL_COND(!rt); rt->backbuffer_uniform_set = p_uniform_set; } + +void TextureStorage::render_target_set_vrs_mode(RID p_render_target, RS::ViewportVRSMode p_mode) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_COND(!rt); + + rt->vrs_mode = p_mode; +} + +void TextureStorage::render_target_set_vrs_texture(RID p_render_target, RID p_texture) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_COND(!rt); + + rt->vrs_texture = p_texture; +} + +RS::ViewportVRSMode TextureStorage::render_target_get_vrs_mode(RID p_render_target) const { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_COND_V(!rt, RS::VIEWPORT_VRS_DISABLED); + + return rt->vrs_mode; +} + +RID TextureStorage::render_target_get_vrs_texture(RID p_render_target) const { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_COND_V(!rt, RID()); + + return rt->vrs_texture; +} diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.h b/servers/rendering/renderer_rd/storage_rd/texture_storage.h index 7a96e6c6ed..ac95e13604 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.h @@ -52,6 +52,7 @@ enum DefaultRDTexture { DEFAULT_RD_TEXTURE_3D_BLACK, DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE, DEFAULT_RD_TEXTURE_2D_UINT, + DEFAULT_RD_TEXTURE_VRS, DEFAULT_RD_TEXTURE_MAX }; @@ -229,6 +230,10 @@ struct RenderTarget { RS::ViewportSDFScale sdf_scale = RS::VIEWPORT_SDF_SCALE_50_PERCENT; Size2i process_size; + // VRS + RS::ViewportVRSMode vrs_mode = RS::VIEWPORT_VRS_DISABLED; + RID vrs_texture; + //texture generated for this owner (nor RD). RID texture; bool was_used; @@ -549,6 +554,12 @@ public: virtual void render_target_mark_sdf_enabled(RID p_render_target, bool p_enabled) override; bool render_target_is_sdf_enabled(RID p_render_target) const; + virtual void render_target_set_vrs_mode(RID p_render_target, RS::ViewportVRSMode p_mode) override; + virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override; + + RS::ViewportVRSMode render_target_get_vrs_mode(RID p_render_target) const; + RID render_target_get_vrs_texture(RID p_render_target) const; + Size2 render_target_get_size(RID p_render_target); RID render_target_get_rd_framebuffer(RID p_render_target); RID render_target_get_rd_texture(RID p_render_target); diff --git a/servers/rendering/renderer_scene.h b/servers/rendering/renderer_scene.h index b773ed61f4..d635c7065d 100644 --- a/servers/rendering/renderer_scene.h +++ b/servers/rendering/renderer_scene.h @@ -183,8 +183,8 @@ public: virtual void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) = 0; virtual void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) = 0; - virtual void shadows_quality_set(RS::ShadowQuality p_quality) = 0; - virtual void directional_shadow_quality_set(RS::ShadowQuality p_quality) = 0; + virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; + virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; virtual RID shadow_atlas_create() = 0; virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_use_16_bits = true) = 0; diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index aaf7ab8efd..ebb5849f85 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -470,7 +470,7 @@ void RendererSceneCull::_instance_update_mesh_instance(Instance *p_instance) { p_instance->mesh_instance = RSG::mesh_storage->mesh_instance_create(p_instance->base); } else { - RSG::mesh_storage->mesh_free(p_instance->mesh_instance); + RSG::mesh_storage->mesh_instance_free(p_instance->mesh_instance); p_instance->mesh_instance = RID(); } diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index 198898141e..8c722360ae 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -1150,8 +1150,8 @@ public: PASS8(camera_effects_set_dof_blur, RID, bool, float, float, bool, float, float, float) PASS3(camera_effects_set_custom_exposure, RID, bool, float) - PASS1(shadows_quality_set, RS::ShadowQuality) - PASS1(directional_shadow_quality_set, RS::ShadowQuality) + PASS1(positional_soft_shadow_filter_set_quality, RS::ShadowQuality) + PASS1(directional_soft_shadow_filter_set_quality, RS::ShadowQuality) PASS2(sdfgi_set_debug_probe_select, const Vector3 &, const Vector3 &) diff --git a/servers/rendering/renderer_scene_render.h b/servers/rendering/renderer_scene_render.h index 280277c6d8..74c7d55a57 100644 --- a/servers/rendering/renderer_scene_render.h +++ b/servers/rendering/renderer_scene_render.h @@ -166,8 +166,8 @@ public: virtual void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) = 0; virtual void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) = 0; - virtual void shadows_quality_set(RS::ShadowQuality p_quality) = 0; - virtual void directional_shadow_quality_set(RS::ShadowQuality p_quality) = 0; + virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; + virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; virtual RID light_instance_create(RID p_light) = 0; virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) = 0; diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index 2fccb1fd38..7c9b2567d6 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -1016,7 +1016,7 @@ void RendererViewport::viewport_set_canvas_stacking(RID p_viewport, RID p_canvas viewport->canvas_map[p_canvas].sublayer = p_sublayer; } -void RendererViewport::viewport_set_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits) { +void RendererViewport::viewport_set_positional_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits) { Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); @@ -1026,7 +1026,7 @@ void RendererViewport::viewport_set_shadow_atlas_size(RID p_viewport, int p_size RSG::scene->shadow_atlas_set_size(viewport->shadow_atlas, viewport->shadow_atlas_size, viewport->shadow_atlas_16_bits); } -void RendererViewport::viewport_set_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv) { +void RendererViewport::viewport_set_positional_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv) { Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); @@ -1207,6 +1207,22 @@ RID RendererViewport::viewport_find_from_screen_attachment(DisplayServer::Window return RID(); } +void RendererViewport::viewport_set_vrs_mode(RID p_viewport, RS::ViewportVRSMode p_mode) { + Viewport *viewport = viewport_owner.get_or_null(p_viewport); + ERR_FAIL_COND(!viewport); + + RSG::texture_storage->render_target_set_vrs_mode(viewport->render_target, p_mode); + _configure_3d_render_buffers(viewport); +} + +void RendererViewport::viewport_set_vrs_texture(RID p_viewport, RID p_texture) { + Viewport *viewport = viewport_owner.get_or_null(p_viewport); + ERR_FAIL_COND(!viewport); + + RSG::texture_storage->render_target_set_vrs_texture(viewport->render_target, p_texture); + _configure_3d_render_buffers(viewport); +} + bool RendererViewport::free(RID p_rid) { if (viewport_owner.owns(p_rid)) { Viewport *viewport = viewport_owner.get_or_null(p_rid); diff --git a/servers/rendering/renderer_viewport.h b/servers/rendering/renderer_viewport.h index acab8063d1..027f2dfad6 100644 --- a/servers/rendering/renderer_viewport.h +++ b/servers/rendering/renderer_viewport.h @@ -255,8 +255,8 @@ public: void viewport_set_global_canvas_transform(RID p_viewport, const Transform2D &p_transform); void viewport_set_canvas_stacking(RID p_viewport, RID p_canvas, int p_layer, int p_sublayer); - void viewport_set_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits = true); - void viewport_set_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv); + void viewport_set_positional_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits = true); + void viewport_set_positional_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv); void viewport_set_msaa(RID p_viewport, RS::ViewportMSAA p_msaa); void viewport_set_screen_space_aa(RID p_viewport, RS::ViewportScreenSpaceAA p_mode); @@ -284,6 +284,9 @@ public: virtual RID viewport_find_from_screen_attachment(DisplayServer::WindowID p_id = DisplayServer::MAIN_WINDOW_ID) const; + void viewport_set_vrs_mode(RID p_viewport, RS::ViewportVRSMode p_mode); + void viewport_set_vrs_texture(RID p_viewport, RID p_texture); + void handle_timestamp(String p_timestamp, uint64_t p_cpu_time, uint64_t p_gpu_time); void set_default_clear_color(const Color &p_color); diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 6fc5d0b3e8..0b76bb3051 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -64,12 +64,12 @@ Vector<uint8_t> RenderingDevice::shader_compile_spirv_from_source(ShaderStage p_ ERR_FAIL_COND_V(!compile_to_spirv_function, Vector<uint8_t>()); - return compile_to_spirv_function(p_stage, p_source_code, p_language, r_error, &device_capabilities); + return compile_to_spirv_function(p_stage, p_source_code, p_language, r_error, this); } String RenderingDevice::shader_get_spirv_cache_key() const { if (get_spirv_cache_key_function) { - return get_spirv_cache_key_function(&device_capabilities); + return get_spirv_cache_key_function(this); } return String(); } @@ -279,6 +279,7 @@ static Vector<RenderingDevice::PipelineSpecializationConstant> _get_spec_constan } return ret; } + RID RenderingDevice::_render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, int p_dynamic_state_flags, uint32_t p_for_render_pass, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants) { PipelineRasterizationState rasterization_state; if (p_rasterization_state.is_valid()) { diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 0973e29974..03aa6f7644 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -123,19 +123,10 @@ public: DeviceFamily device_family = DEVICE_UNKNOWN; uint32_t version_major = 1.0; uint32_t version_minor = 0.0; - - // subgroup capabilities - uint32_t subgroup_size = 0; - uint32_t subgroup_in_shaders = 0; // Set flags using SHADER_STAGE_VERTEX_BIT, SHADER_STAGE_FRAGMENT_BIT, etc. - uint32_t subgroup_operations = 0; // Set flags, using SubgroupOperations - - // features - bool supports_multiview = false; // If true this device supports multiview options - bool supports_fsr_half_float = false; // If true this device supports FSR scaling 3D in half float mode, otherwise use the fallback mode }; - typedef String (*ShaderSPIRVGetCacheKeyFunction)(const Capabilities *p_capabilities); - typedef Vector<uint8_t> (*ShaderCompileToSPIRVFunction)(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language, String *r_error, const Capabilities *p_capabilities); + typedef String (*ShaderSPIRVGetCacheKeyFunction)(const RenderingDevice *p_render_device); + typedef Vector<uint8_t> (*ShaderCompileToSPIRVFunction)(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language, String *r_error, const RenderingDevice *p_render_device); typedef Vector<uint8_t> (*ShaderCacheFunction)(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language); private: @@ -444,6 +435,7 @@ public: TEXTURE_USAGE_CAN_COPY_FROM_BIT = (1 << 7), TEXTURE_USAGE_CAN_COPY_TO_BIT = (1 << 8), TEXTURE_USAGE_INPUT_ATTACHMENT_BIT = (1 << 9), + TEXTURE_USAGE_VRS_ATTACHMENT_BIT = (1 << 10), }; enum TextureSwizzle { @@ -552,6 +544,7 @@ public: Vector<int32_t> resolve_attachments; Vector<int32_t> preserve_attachments; int32_t depth_attachment = ATTACHMENT_UNUSED; + int32_t vrs_attachment = ATTACHMENT_UNUSED; // density map for VRS, only used if supported }; virtual FramebufferFormatID framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, Vector<FramebufferPass> &p_passes, uint32_t p_view_count = 1) = 0; @@ -675,6 +668,13 @@ public: const Capabilities *get_device_capabilities() const { return &device_capabilities; }; + enum Features { + SUPPORTS_MULTIVIEW, + SUPPORTS_FSR_HALF_FLOAT, + SUPPORTS_ATTACHMENT_VRS, + }; + virtual bool has_feature(const Features p_feature) const = 0; + virtual Vector<uint8_t> shader_compile_spirv_from_source(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language = SHADER_LANGUAGE_GLSL, String *r_error = nullptr, bool p_allow_cache = true); virtual String shader_get_spirv_cache_key() const; @@ -1221,9 +1221,12 @@ public: LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X, LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y, LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z, + LIMIT_SUBGROUP_SIZE, + LIMIT_SUBGROUP_IN_SHADERS, // Set flags using SHADER_STAGE_VERTEX_BIT, SHADER_STAGE_FRAGMENT_BIT, etc. + LIMIT_SUBGROUP_OPERATIONS, }; - virtual uint64_t limit_get(Limit p_limit) = 0; + virtual uint64_t limit_get(Limit p_limit) const = 0; //methods below not exposed, used by RenderingDeviceRD virtual void prepare_screen_for_drawing() = 0; @@ -1324,6 +1327,7 @@ VARIANT_ENUM_CAST(RenderingDevice::InitialAction) VARIANT_ENUM_CAST(RenderingDevice::FinalAction) VARIANT_ENUM_CAST(RenderingDevice::Limit) VARIANT_ENUM_CAST(RenderingDevice::MemoryType) +VARIANT_ENUM_CAST(RenderingDevice::Features) typedef RenderingDevice RD; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 584d9a7a51..429b8a06e2 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -615,9 +615,9 @@ public: FUNC2(viewport_set_global_canvas_transform, RID, const Transform2D &) FUNC4(viewport_set_canvas_stacking, RID, RID, int, int) - FUNC3(viewport_set_shadow_atlas_size, RID, int, bool) + FUNC3(viewport_set_positional_shadow_atlas_size, RID, int, bool) FUNC3(viewport_set_sdf_oversize_and_scale, RID, ViewportSDFOversize, ViewportSDFScale) - FUNC3(viewport_set_shadow_atlas_quadrant_subdivision, RID, int, int) + FUNC3(viewport_set_positional_shadow_atlas_quadrant_subdivision, RID, int, int) FUNC2(viewport_set_msaa, RID, ViewportMSAA) FUNC2(viewport_set_screen_space_aa, RID, ViewportScreenSpaceAA) FUNC2(viewport_set_use_taa, RID, bool) @@ -637,6 +637,9 @@ public: FUNC2(call_set_vsync_mode, DisplayServer::VSyncMode, DisplayServer::WindowID) + FUNC2(viewport_set_vrs_mode, RID, ViewportVRSMode) + FUNC2(viewport_set_vrs_texture, RID, RID) + /* ENVIRONMENT API */ #undef server_name @@ -715,8 +718,8 @@ public: FUNC8(camera_effects_set_dof_blur, RID, bool, float, float, bool, float, float, float) FUNC3(camera_effects_set_custom_exposure, RID, bool, float) - FUNC1(shadows_quality_set, ShadowQuality); - FUNC1(directional_shadow_quality_set, ShadowQuality); + FUNC1(positional_soft_shadow_filter_set_quality, ShadowQuality); + FUNC1(directional_soft_shadow_filter_set_quality, ShadowQuality); FUNC1(decals_set_filter, RS::DecalFilter); FUNC1(light_projectors_set_filter, RS::LightProjectorFilter); diff --git a/servers/rendering/storage/texture_storage.h b/servers/rendering/storage/texture_storage.h index e90a028713..92238c19ee 100644 --- a/servers/rendering/storage/texture_storage.h +++ b/servers/rendering/storage/texture_storage.h @@ -143,6 +143,9 @@ public: virtual void render_target_set_sdf_size_and_scale(RID p_render_target, RS::ViewportSDFOversize p_size, RS::ViewportSDFScale p_scale) = 0; virtual Rect2i render_target_get_sdf_rect(RID p_render_target) const = 0; virtual void render_target_mark_sdf_enabled(RID p_render_target, bool p_enabled) = 0; + + virtual void render_target_set_vrs_mode(RID p_render_target, RS::ViewportVRSMode p_mode) = 0; + virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) = 0; }; #endif // !TEXTURE_STORAGE_H diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 9b407043fc..5ee12d04d9 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -1939,8 +1939,8 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_ONLY); BIND_ENUM_CONSTANT(LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY); - ClassDB::bind_method(D_METHOD("shadows_quality_set", "quality"), &RenderingServer::shadows_quality_set); - ClassDB::bind_method(D_METHOD("directional_shadow_quality_set", "quality"), &RenderingServer::directional_shadow_quality_set); + ClassDB::bind_method(D_METHOD("positional_soft_shadow_filter_set_quality", "quality"), &RenderingServer::positional_soft_shadow_filter_set_quality); + ClassDB::bind_method(D_METHOD("directional_soft_shadow_filter_set_quality", "quality"), &RenderingServer::directional_soft_shadow_filter_set_quality); ClassDB::bind_method(D_METHOD("directional_shadow_atlas_set_size", "size", "is_16bits"), &RenderingServer::directional_shadow_atlas_set_size); BIND_ENUM_CONSTANT(SHADOW_QUALITY_HARD); @@ -2207,8 +2207,8 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("viewport_set_sdf_oversize_and_scale", "viewport", "oversize", "scale"), &RenderingServer::viewport_set_sdf_oversize_and_scale); - ClassDB::bind_method(D_METHOD("viewport_set_shadow_atlas_size", "viewport", "size", "use_16_bits"), &RenderingServer::viewport_set_shadow_atlas_size, DEFVAL(false)); - ClassDB::bind_method(D_METHOD("viewport_set_shadow_atlas_quadrant_subdivision", "viewport", "quadrant", "subdivision"), &RenderingServer::viewport_set_shadow_atlas_quadrant_subdivision); + ClassDB::bind_method(D_METHOD("viewport_set_positional_shadow_atlas_size", "viewport", "size", "use_16_bits"), &RenderingServer::viewport_set_positional_shadow_atlas_size, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("viewport_set_positional_shadow_atlas_quadrant_subdivision", "viewport", "quadrant", "subdivision"), &RenderingServer::viewport_set_positional_shadow_atlas_quadrant_subdivision); ClassDB::bind_method(D_METHOD("viewport_set_msaa", "viewport", "msaa"), &RenderingServer::viewport_set_msaa); ClassDB::bind_method(D_METHOD("viewport_set_screen_space_aa", "viewport", "mode"), &RenderingServer::viewport_set_screen_space_aa); ClassDB::bind_method(D_METHOD("viewport_set_use_taa", "viewport", "enable"), &RenderingServer::viewport_set_use_taa); @@ -2225,6 +2225,9 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("viewport_get_measured_render_time_gpu", "viewport"), &RenderingServer::viewport_get_measured_render_time_gpu); + ClassDB::bind_method(D_METHOD("viewport_set_vrs_mode", "viewport", "mode"), &RenderingServer::viewport_set_vrs_mode); + ClassDB::bind_method(D_METHOD("viewport_set_vrs_texture", "viewport", "texture"), &RenderingServer::viewport_set_vrs_texture); + BIND_ENUM_CONSTANT(VIEWPORT_SCALING_3D_MODE_BILINEAR); BIND_ENUM_CONSTANT(VIEWPORT_SCALING_3D_MODE_FSR); BIND_ENUM_CONSTANT(VIEWPORT_SCALING_3D_MODE_MAX); @@ -2300,6 +2303,11 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_OCCLUDERS); BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_MOTION_VECTORS); + BIND_ENUM_CONSTANT(VIEWPORT_VRS_DISABLED); + BIND_ENUM_CONSTANT(VIEWPORT_VRS_TEXTURE); + BIND_ENUM_CONSTANT(VIEWPORT_VRS_XR); + BIND_ENUM_CONSTANT(VIEWPORT_VRS_MAX); + /* SKY API */ ClassDB::bind_method(D_METHOD("sky_create"), &RenderingServer::sky_create); @@ -2841,14 +2849,14 @@ void RenderingServer::init() { GLOBAL_DEF("rendering/shadows/directional_shadow/size", 4096); GLOBAL_DEF("rendering/shadows/directional_shadow/size.mobile", 2048); ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/directional_shadow/size", PropertyInfo(Variant::INT, "rendering/shadows/directional_shadow/size", PROPERTY_HINT_RANGE, "256,16384")); - GLOBAL_DEF("rendering/shadows/directional_shadow/soft_shadow_quality", 2); - GLOBAL_DEF("rendering/shadows/directional_shadow/soft_shadow_quality.mobile", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/directional_shadow/soft_shadow_quality", PropertyInfo(Variant::INT, "rendering/shadows/directional_shadow/soft_shadow_quality", PROPERTY_HINT_ENUM, "Hard (Fastest),Soft Very Low (Faster),Soft Low (Fast),Soft Medium (Average),Soft High (Slow),Soft Ultra (Slowest)")); + GLOBAL_DEF("rendering/shadows/directional_shadow/soft_shadow_filter_quality", 2); + GLOBAL_DEF("rendering/shadows/directional_shadow/soft_shadow_filter_quality.mobile", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/directional_shadow/soft_shadow_filter_quality", PropertyInfo(Variant::INT, "rendering/shadows/directional_shadow/soft_shadow_filter_quality", PROPERTY_HINT_ENUM, "Hard (Fastest),Soft Very Low (Faster),Soft Low (Fast),Soft Medium (Average),Soft High (Slow),Soft Ultra (Slowest)")); GLOBAL_DEF("rendering/shadows/directional_shadow/16_bits", true); - GLOBAL_DEF("rendering/shadows/shadows/soft_shadow_quality", 2); - GLOBAL_DEF("rendering/shadows/shadows/soft_shadow_quality.mobile", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/shadows/soft_shadow_quality", PropertyInfo(Variant::INT, "rendering/shadows/shadows/soft_shadow_quality", PROPERTY_HINT_ENUM, "Hard (Fastest),Soft Very Low (Faster),Soft Low (Fast),Soft Medium (Average),Soft High (Slow),Soft Ultra (Slowest)")); + GLOBAL_DEF("rendering/shadows/positional_shadow/soft_shadow_filter_quality", 2); + GLOBAL_DEF("rendering/shadows/positional_shadow/soft_shadow_filter_quality.mobile", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/shadows/positional_shadow/soft_shadow_filter_quality", PropertyInfo(Variant::INT, "rendering/shadows/positional_shadow/soft_shadow_filter_quality", PROPERTY_HINT_ENUM, "Hard (Fastest),Soft Very Low (Faster),Soft Low (Fast),Soft Medium (Average),Soft High (Slow),Soft Ultra (Slowest)")); GLOBAL_DEF("rendering/2d/shadow_atlas/size", 2048); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index ccef95f5f2..8d224f2832 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -491,8 +491,8 @@ public: SHADOW_QUALITY_MAX }; - virtual void shadows_quality_set(ShadowQuality p_quality) = 0; - virtual void directional_shadow_quality_set(ShadowQuality p_quality) = 0; + virtual void positional_soft_shadow_filter_set_quality(ShadowQuality p_quality) = 0; + virtual void directional_soft_shadow_filter_set_quality(ShadowQuality p_quality) = 0; enum LightProjectorFilter { LIGHT_PROJECTOR_FILTER_NEAREST, @@ -856,8 +856,8 @@ public: virtual void viewport_set_sdf_oversize_and_scale(RID p_viewport, ViewportSDFOversize p_oversize, ViewportSDFScale p_scale) = 0; - virtual void viewport_set_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits = true) = 0; - virtual void viewport_set_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv) = 0; + virtual void viewport_set_positional_shadow_atlas_size(RID p_viewport, int p_size, bool p_16_bits = true) = 0; + virtual void viewport_set_positional_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv) = 0; enum ViewportMSAA { VIEWPORT_MSAA_DISABLED, @@ -946,6 +946,16 @@ public: virtual RID viewport_find_from_screen_attachment(DisplayServer::WindowID p_id = DisplayServer::MAIN_WINDOW_ID) const = 0; + enum ViewportVRSMode { + VIEWPORT_VRS_DISABLED, + VIEWPORT_VRS_TEXTURE, + VIEWPORT_VRS_XR, + VIEWPORT_VRS_MAX, + }; + + virtual void viewport_set_vrs_mode(RID p_viewport, ViewportVRSMode p_mode) = 0; + virtual void viewport_set_vrs_texture(RID p_viewport, RID p_texture) = 0; + /* SKY API */ enum SkyMode { @@ -1609,6 +1619,7 @@ VARIANT_ENUM_CAST(RenderingServer::ViewportDebugDraw); VARIANT_ENUM_CAST(RenderingServer::ViewportOcclusionCullingBuildQuality); VARIANT_ENUM_CAST(RenderingServer::ViewportSDFOversize); VARIANT_ENUM_CAST(RenderingServer::ViewportSDFScale); +VARIANT_ENUM_CAST(RenderingServer::ViewportVRSMode); VARIANT_ENUM_CAST(RenderingServer::SkyMode); VARIANT_ENUM_CAST(RenderingServer::EnvironmentBG); VARIANT_ENUM_CAST(RenderingServer::EnvironmentAmbientSource); diff --git a/servers/text/text_server_extension.cpp b/servers/text/text_server_extension.cpp index 68959819c9..47598abce7 100644 --- a/servers/text/text_server_extension.cpp +++ b/servers/text/text_server_extension.cpp @@ -438,12 +438,12 @@ int64_t TextServerExtension::font_get_face_count(const RID &p_font_rid) const { return 0; } -void TextServerExtension::font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) { +void TextServerExtension::font_set_style(const RID &p_font_rid, BitField<TextServer::FontStyle> p_style) { GDVIRTUAL_CALL(font_set_style, p_font_rid, p_style); } -int64_t /*FontStyle*/ TextServerExtension::font_get_style(const RID &p_font_rid) const { - int64_t ret; +BitField<TextServer::FontStyle> TextServerExtension::font_get_style(const RID &p_font_rid) const { + BitField<TextServer::FontStyle> ret = 0; if (GDVIRTUAL_CALL(font_get_style, p_font_rid, ret)) { return ret; } @@ -1192,7 +1192,7 @@ RID TextServerExtension::shaped_text_get_parent(const RID &p_shaped) const { return RID(); } -double TextServerExtension::shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t p_jst_flags) { +double TextServerExtension::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags) { double ret; if (GDVIRTUAL_CALL(shaped_text_fit_to_width, p_shaped, p_width, p_jst_flags, ret)) { return ret; @@ -1272,7 +1272,7 @@ Vector2i TextServerExtension::shaped_text_get_range(const RID &p_shaped) const { return Vector2i(); } -PackedInt32Array TextServerExtension::shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start, bool p_once, int64_t p_break_flags) const { +PackedInt32Array TextServerExtension::shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start, bool p_once, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array ret; if (GDVIRTUAL_CALL(shaped_text_get_line_breaks_adv, p_shaped, p_width, p_start, p_once, p_break_flags, ret)) { return ret; @@ -1280,7 +1280,7 @@ PackedInt32Array TextServerExtension::shaped_text_get_line_breaks_adv(const RID return TextServer::shaped_text_get_line_breaks_adv(p_shaped, p_width, p_start, p_once, p_break_flags); } -PackedInt32Array TextServerExtension::shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start, int64_t p_break_flags) const { +PackedInt32Array TextServerExtension::shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array ret; if (GDVIRTUAL_CALL(shaped_text_get_line_breaks, p_shaped, p_width, p_start, p_break_flags, ret)) { return ret; @@ -1288,7 +1288,7 @@ PackedInt32Array TextServerExtension::shaped_text_get_line_breaks(const RID &p_s return TextServer::shaped_text_get_line_breaks(p_shaped, p_width, p_start, p_break_flags); } -PackedInt32Array TextServerExtension::shaped_text_get_word_breaks(const RID &p_shaped, int64_t p_grapheme_flags) const { +PackedInt32Array TextServerExtension::shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags) const { PackedInt32Array ret; if (GDVIRTUAL_CALL(shaped_text_get_word_breaks, p_shaped, p_grapheme_flags, ret)) { return ret; @@ -1328,7 +1328,7 @@ int64_t TextServerExtension::shaped_text_get_ellipsis_glyph_count(const RID &p_s return -1; } -void TextServerExtension::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, int64_t p_trim_flags) { +void TextServerExtension::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { GDVIRTUAL_CALL(shaped_text_overrun_trim_to_width, p_shaped_line, p_width, p_trim_flags); } diff --git a/servers/text/text_server_extension.h b/servers/text/text_server_extension.h index d948a97c66..571753ea67 100644 --- a/servers/text/text_server_extension.h +++ b/servers/text/text_server_extension.h @@ -92,10 +92,10 @@ public: virtual int64_t font_get_face_count(const RID &p_font_rid) const override; GDVIRTUAL1RC(int64_t, font_get_face_count, RID); - virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) override; - virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_style, RID, int64_t); - GDVIRTUAL1RC(int64_t, font_get_style, RID); + virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; + virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; + GDVIRTUAL2(font_set_style, RID, BitField<FontStyle>); + GDVIRTUAL1RC(BitField<FontStyle>, font_get_style, RID); virtual void font_set_name(const RID &p_font_rid, const String &p_name) override; virtual String font_get_name(const RID &p_font_rid) const override; @@ -396,9 +396,9 @@ public: GDVIRTUAL3RC(RID, shaped_text_substr, RID, int64_t, int64_t); GDVIRTUAL1RC(RID, shaped_text_get_parent, RID); - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; + virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; - GDVIRTUAL3R(double, shaped_text_fit_to_width, RID, double, int64_t); + GDVIRTUAL3R(double, shaped_text_fit_to_width, RID, double, BitField<TextServer::JustificationFlag>); GDVIRTUAL2R(double, shaped_text_tab_align, RID, const PackedFloat32Array &); virtual bool shaped_text_shape(const RID &p_shaped) override; @@ -421,12 +421,12 @@ public: virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override; GDVIRTUAL1RC(Vector2i, shaped_text_get_range, RID); - virtual PackedInt32Array shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start = 0, bool p_once = true, int64_t /*TextBreakFlag*/ p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; - virtual PackedInt32Array shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start = 0, int64_t p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; - virtual PackedInt32Array shaped_text_get_word_breaks(const RID &p_shaped, int64_t p_grapheme_flags = GRAPHEME_IS_SPACE | GRAPHEME_IS_PUNCTUATION) const override; - GDVIRTUAL5RC(PackedInt32Array, shaped_text_get_line_breaks_adv, RID, const PackedFloat32Array &, int64_t, bool, int64_t); - GDVIRTUAL4RC(PackedInt32Array, shaped_text_get_line_breaks, RID, double, int64_t, int64_t); - GDVIRTUAL2RC(PackedInt32Array, shaped_text_get_word_breaks, RID, int64_t); + virtual PackedInt32Array shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start = 0, bool p_once = true, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; + virtual PackedInt32Array shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start = 0, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; + virtual PackedInt32Array shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags = GRAPHEME_IS_SPACE | GRAPHEME_IS_PUNCTUATION) const override; + GDVIRTUAL5RC(PackedInt32Array, shaped_text_get_line_breaks_adv, RID, const PackedFloat32Array &, int64_t, bool, BitField<TextServer::LineBreakFlag>); + GDVIRTUAL4RC(PackedInt32Array, shaped_text_get_line_breaks, RID, double, int64_t, BitField<TextServer::LineBreakFlag>); + GDVIRTUAL2RC(PackedInt32Array, shaped_text_get_word_breaks, RID, BitField<TextServer::GraphemeFlag>); virtual int64_t shaped_text_get_trim_pos(const RID &p_shaped) const override; virtual int64_t shaped_text_get_ellipsis_pos(const RID &p_shaped) const override; @@ -437,8 +437,8 @@ public: GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, shaped_text_get_ellipsis_glyphs, RID); GDVIRTUAL1RC(int64_t, shaped_text_get_ellipsis_glyph_count, RID); - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, int64_t p_trim_flags) override; - GDVIRTUAL3(shaped_text_overrun_trim_to_width, RID, double, int64_t); + virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; + GDVIRTUAL3(shaped_text_overrun_trim_to_width, RID, double, BitField<TextServer::TextOverrunFlag>); virtual Array shaped_text_get_objects(const RID &p_shaped) const override; virtual Rect2 shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const override; diff --git a/servers/text_server.cpp b/servers/text_server.cpp index c1293230d8..4a6b03d943 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -463,12 +463,12 @@ void TextServer::_bind_methods() { BIND_ENUM_CONSTANT(ORIENTATION_VERTICAL); /* JustificationFlag */ - BIND_ENUM_CONSTANT(JUSTIFICATION_NONE); - BIND_ENUM_CONSTANT(JUSTIFICATION_KASHIDA); - BIND_ENUM_CONSTANT(JUSTIFICATION_WORD_BOUND); - BIND_ENUM_CONSTANT(JUSTIFICATION_TRIM_EDGE_SPACES); - BIND_ENUM_CONSTANT(JUSTIFICATION_AFTER_LAST_TAB); - BIND_ENUM_CONSTANT(JUSTIFICATION_CONSTRAIN_ELLIPSIS); + BIND_BITFIELD_FLAG(JUSTIFICATION_NONE); + BIND_BITFIELD_FLAG(JUSTIFICATION_KASHIDA); + BIND_BITFIELD_FLAG(JUSTIFICATION_WORD_BOUND); + BIND_BITFIELD_FLAG(JUSTIFICATION_TRIM_EDGE_SPACES); + BIND_BITFIELD_FLAG(JUSTIFICATION_AFTER_LAST_TAB); + BIND_BITFIELD_FLAG(JUSTIFICATION_CONSTRAIN_ELLIPSIS); /* AutowrapMode */ BIND_ENUM_CONSTANT(AUTOWRAP_OFF); @@ -477,11 +477,11 @@ void TextServer::_bind_methods() { BIND_ENUM_CONSTANT(AUTOWRAP_WORD_SMART); /* LineBreakFlag */ - BIND_ENUM_CONSTANT(BREAK_NONE); - BIND_ENUM_CONSTANT(BREAK_MANDATORY); - BIND_ENUM_CONSTANT(BREAK_WORD_BOUND); - BIND_ENUM_CONSTANT(BREAK_GRAPHEME_BOUND); - BIND_ENUM_CONSTANT(BREAK_WORD_BOUND_ADAPTIVE); + BIND_BITFIELD_FLAG(BREAK_NONE); + BIND_BITFIELD_FLAG(BREAK_MANDATORY); + BIND_BITFIELD_FLAG(BREAK_WORD_BOUND); + BIND_BITFIELD_FLAG(BREAK_GRAPHEME_BOUND); + BIND_BITFIELD_FLAG(BREAK_ADAPTIVE); /* VisibleCharactersBehavior */ BIND_ENUM_CONSTANT(VC_CHARS_BEFORE_SHAPING); @@ -498,25 +498,25 @@ void TextServer::_bind_methods() { BIND_ENUM_CONSTANT(OVERRUN_TRIM_WORD_ELLIPSIS); /* TextOverrunFlag */ - BIND_ENUM_CONSTANT(OVERRUN_NO_TRIM); - BIND_ENUM_CONSTANT(OVERRUN_TRIM); - BIND_ENUM_CONSTANT(OVERRUN_TRIM_WORD_ONLY); - BIND_ENUM_CONSTANT(OVERRUN_ADD_ELLIPSIS); - BIND_ENUM_CONSTANT(OVERRUN_ENFORCE_ELLIPSIS); - BIND_ENUM_CONSTANT(OVERRUN_JUSTIFICATION_AWARE); + BIND_BITFIELD_FLAG(OVERRUN_NO_TRIM); + BIND_BITFIELD_FLAG(OVERRUN_TRIM); + BIND_BITFIELD_FLAG(OVERRUN_TRIM_WORD_ONLY); + BIND_BITFIELD_FLAG(OVERRUN_ADD_ELLIPSIS); + BIND_BITFIELD_FLAG(OVERRUN_ENFORCE_ELLIPSIS); + BIND_BITFIELD_FLAG(OVERRUN_JUSTIFICATION_AWARE); /* GraphemeFlag */ - BIND_ENUM_CONSTANT(GRAPHEME_IS_VALID); - BIND_ENUM_CONSTANT(GRAPHEME_IS_RTL); - BIND_ENUM_CONSTANT(GRAPHEME_IS_VIRTUAL); - BIND_ENUM_CONSTANT(GRAPHEME_IS_SPACE); - BIND_ENUM_CONSTANT(GRAPHEME_IS_BREAK_HARD); - BIND_ENUM_CONSTANT(GRAPHEME_IS_BREAK_SOFT); - BIND_ENUM_CONSTANT(GRAPHEME_IS_TAB); - BIND_ENUM_CONSTANT(GRAPHEME_IS_ELONGATION); - BIND_ENUM_CONSTANT(GRAPHEME_IS_PUNCTUATION); - BIND_ENUM_CONSTANT(GRAPHEME_IS_UNDERSCORE); - BIND_ENUM_CONSTANT(GRAPHEME_IS_CONNECTED); + BIND_BITFIELD_FLAG(GRAPHEME_IS_VALID); + BIND_BITFIELD_FLAG(GRAPHEME_IS_RTL); + BIND_BITFIELD_FLAG(GRAPHEME_IS_VIRTUAL); + BIND_BITFIELD_FLAG(GRAPHEME_IS_SPACE); + BIND_BITFIELD_FLAG(GRAPHEME_IS_BREAK_HARD); + BIND_BITFIELD_FLAG(GRAPHEME_IS_BREAK_SOFT); + BIND_BITFIELD_FLAG(GRAPHEME_IS_TAB); + BIND_BITFIELD_FLAG(GRAPHEME_IS_ELONGATION); + BIND_BITFIELD_FLAG(GRAPHEME_IS_PUNCTUATION); + BIND_BITFIELD_FLAG(GRAPHEME_IS_UNDERSCORE); + BIND_BITFIELD_FLAG(GRAPHEME_IS_CONNECTED); /* Hinting */ BIND_ENUM_CONSTANT(HINTING_NONE); @@ -556,11 +556,12 @@ void TextServer::_bind_methods() { BIND_ENUM_CONSTANT(SPACING_SPACE); BIND_ENUM_CONSTANT(SPACING_TOP); BIND_ENUM_CONSTANT(SPACING_BOTTOM); + BIND_ENUM_CONSTANT(SPACING_MAX); /* Font Style */ - BIND_ENUM_CONSTANT(FONT_BOLD); - BIND_ENUM_CONSTANT(FONT_ITALIC); - BIND_ENUM_CONSTANT(FONT_FIXED_WIDTH); + BIND_BITFIELD_FLAG(FONT_BOLD); + BIND_BITFIELD_FLAG(FONT_ITALIC); + BIND_BITFIELD_FLAG(FONT_FIXED_WIDTH); /* Structured text parser */ BIND_ENUM_CONSTANT(STRUCTURED_TEXT_DEFAULT); @@ -650,7 +651,7 @@ void TextServer::draw_hex_code_box(const RID &p_canvas, int64_t p_size, const Ve } } -PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start, bool p_once, int64_t /*TextBreakFlag*/ p_break_flags) const { +PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start, bool p_once, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array lines; ERR_FAIL_COND_V(p_width.is_empty(), lines); @@ -687,7 +688,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped } continue; } - if ((p_break_flags & BREAK_MANDATORY) == BREAK_MANDATORY) { + if (p_break_flags.has_flag(BREAK_MANDATORY)) { if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) { lines.push_back(line_start); lines.push_back(l_gl[i].end); @@ -701,12 +702,12 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped continue; } } - if ((p_break_flags & BREAK_WORD_BOUND) == BREAK_WORD_BOUND) { + if (p_break_flags.has_flag(BREAK_WORD_BOUND)) { if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { last_safe_break = i; } } - if ((p_break_flags & BREAK_GRAPHEME_BOUND) == BREAK_GRAPHEME_BOUND) { + if (p_break_flags.has_flag(BREAK_GRAPHEME_BOUND)) { last_safe_break = i; } } @@ -726,7 +727,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped return lines; } -PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start, int64_t /*TextBreakFlag*/ p_break_flags) const { +PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array lines; const_cast<TextServer *>(this)->shaped_text_update_breaks(p_shaped); @@ -755,7 +756,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do word_count = 0; continue; } - if ((p_break_flags & BREAK_MANDATORY) == BREAK_MANDATORY) { + if (p_break_flags.has_flag(BREAK_MANDATORY)) { if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) { lines.push_back(line_start); lines.push_back(l_gl[i].end); @@ -765,16 +766,16 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do continue; } } - if ((p_break_flags & BREAK_WORD_BOUND) == BREAK_WORD_BOUND) { + if (p_break_flags.has_flag(BREAK_WORD_BOUND)) { if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { last_safe_break = i; word_count++; } + if (p_break_flags.has_flag(BREAK_ADAPTIVE) && word_count == 0) { + last_safe_break = i; + } } - if (((p_break_flags & BREAK_WORD_BOUND_ADAPTIVE) == BREAK_WORD_BOUND_ADAPTIVE) && word_count == 0) { - last_safe_break = i; - } - if ((p_break_flags & BREAK_GRAPHEME_BOUND) == BREAK_GRAPHEME_BOUND) { + if (p_break_flags.has_flag(BREAK_GRAPHEME_BOUND)) { last_safe_break = i; } } @@ -794,7 +795,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do return lines; } -PackedInt32Array TextServer::shaped_text_get_word_breaks(const RID &p_shaped, int64_t p_grapheme_flags) const { +PackedInt32Array TextServer::shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags) const { PackedInt32Array words; const_cast<TextServer *>(this)->shaped_text_update_justification_ops(p_shaped); diff --git a/servers/text_server.h b/servers/text_server.h index 0fd35f2ec0..f6ab165bfc 100644 --- a/servers/text_server.h +++ b/servers/text_server.h @@ -79,12 +79,12 @@ public: AUTOWRAP_WORD_SMART }; - enum LineBreakFlag { // LineBreakFlag can be passed in the same value as the JustificationFlag, do not use the same values. + enum LineBreakFlag { BREAK_NONE = 0, - BREAK_MANDATORY = 1 << 5, - BREAK_WORD_BOUND = 1 << 6, - BREAK_GRAPHEME_BOUND = 1 << 7, - BREAK_WORD_BOUND_ADAPTIVE = 1 << 6 | 1 << 8, + BREAK_MANDATORY = 1 << 0, + BREAK_WORD_BOUND = 1 << 1, + BREAK_GRAPHEME_BOUND = 1 << 2, + BREAK_ADAPTIVE = 1 << 3, }; enum OverrunBehavior { @@ -218,8 +218,8 @@ public: virtual int64_t font_get_face_count(const RID &p_font_rid) const = 0; - virtual void font_set_style(const RID &p_font_rid, int64_t /*FontStyle*/ p_style) = 0; - virtual int64_t /*FontStyle*/ font_get_style(const RID &p_font_rid) const = 0; + virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) = 0; + virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const = 0; virtual void font_set_name(const RID &p_font_rid, const String &p_name) = 0; virtual String font_get_name(const RID &p_font_rid) const = 0; @@ -398,7 +398,7 @@ public: virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const = 0; // Copy shaped substring (e.g. line break) without reshaping, but correctly reordered, preservers range. virtual RID shaped_text_get_parent(const RID &p_shaped) const = 0; - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, int64_t /*JustificationFlag*/ p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) = 0; + virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) = 0; virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) = 0; virtual bool shaped_text_shape(const RID &p_shaped) = 0; @@ -415,9 +415,9 @@ public: virtual Vector2i shaped_text_get_range(const RID &p_shaped) const = 0; - virtual PackedInt32Array shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start = 0, bool p_once = true, int64_t /*TextBreakFlag*/ p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const; - virtual PackedInt32Array shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start = 0, int64_t /*TextBreakFlag*/ p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const; - virtual PackedInt32Array shaped_text_get_word_breaks(const RID &p_shaped, int64_t p_grapheme_flags = GRAPHEME_IS_SPACE | GRAPHEME_IS_PUNCTUATION) const; + virtual PackedInt32Array shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start = 0, bool p_once = true, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const; + virtual PackedInt32Array shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start = 0, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const; + virtual PackedInt32Array shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags = GRAPHEME_IS_SPACE | GRAPHEME_IS_PUNCTUATION) const; virtual int64_t shaped_text_get_trim_pos(const RID &p_shaped) const = 0; virtual int64_t shaped_text_get_ellipsis_pos(const RID &p_shaped) const = 0; @@ -425,7 +425,7 @@ public: Array _shaped_text_get_ellipsis_glyphs_wrapper(const RID &p_shaped) const; virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const = 0; - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, int64_t p_trim_flags) = 0; + virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) = 0; virtual Array shaped_text_get_objects(const RID &p_shaped) const = 0; virtual Rect2 shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const = 0; @@ -551,16 +551,16 @@ VARIANT_ENUM_CAST(TextServer::AutowrapMode); VARIANT_ENUM_CAST(TextServer::OverrunBehavior); VARIANT_ENUM_CAST(TextServer::Direction); VARIANT_ENUM_CAST(TextServer::Orientation); -VARIANT_ENUM_CAST(TextServer::JustificationFlag); -VARIANT_ENUM_CAST(TextServer::LineBreakFlag); -VARIANT_ENUM_CAST(TextServer::TextOverrunFlag); -VARIANT_ENUM_CAST(TextServer::GraphemeFlag); +VARIANT_BITFIELD_CAST(TextServer::JustificationFlag); +VARIANT_BITFIELD_CAST(TextServer::LineBreakFlag); +VARIANT_BITFIELD_CAST(TextServer::TextOverrunFlag); +VARIANT_BITFIELD_CAST(TextServer::GraphemeFlag); VARIANT_ENUM_CAST(TextServer::Hinting); VARIANT_ENUM_CAST(TextServer::SubpixelPositioning); VARIANT_ENUM_CAST(TextServer::Feature); VARIANT_ENUM_CAST(TextServer::ContourPointTag); VARIANT_ENUM_CAST(TextServer::SpacingType); -VARIANT_ENUM_CAST(TextServer::FontStyle); +VARIANT_BITFIELD_CAST(TextServer::FontStyle); VARIANT_ENUM_CAST(TextServer::StructuredTextParser); GDVIRTUAL_NATIVE_PTR(Glyph); diff --git a/servers/xr/xr_interface.cpp b/servers/xr/xr_interface.cpp index 7ae111b5e7..0808b1fd7b 100644 --- a/servers/xr/xr_interface.cpp +++ b/servers/xr/xr_interface.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "xr_interface.h" -// #include "servers/rendering/renderer_compositor.h" +#include "servers/rendering/renderer_compositor.h" void XRInterface::_bind_methods() { ADD_SIGNAL(MethodInfo("play_area_changed", PropertyInfo(Variant::INT, "mode"))); @@ -114,7 +114,12 @@ void XRInterface::set_primary(bool p_primary) { XRInterface::XRInterface() {} -XRInterface::~XRInterface() {} +XRInterface::~XRInterface() { + if (vrs.vrs_texture.is_valid()) { + RS::get_singleton()->free(vrs.vrs_texture); + vrs.vrs_texture = RID(); + } +} // query if this interface supports this play area mode bool XRInterface::supports_play_area_mode(XRInterface::PlayAreaMode p_mode) { @@ -151,6 +156,85 @@ int XRInterface::get_camera_feed_id() { return 0; } +RID XRInterface::get_vrs_texture() { + // Default logic will return a standard VRS image based on our target size and default projections. + // Note that this only gets called if VRS is supported on the hardware. + + Size2 texel_size = Size2(16.0, 16.0); // For now we assume we always use 16x16 texels, seems to be the standard. + int view_count = get_view_count(); + Size2 target_size = get_render_target_size(); + real_t aspect = target_size.x / target_size.y; // is this y/x ? + Size2 vrs_size = Size2(round(0.5 + target_size.x / texel_size.x), round(0.5 + target_size.y / texel_size.y)); + real_t radius = vrs_size.length() * 0.5; + Size2 vrs_sizei = vrs_size; + + if (vrs.size != vrs_sizei) { + const uint8_t densities[] = { + 0, // 1x1 + 1, // 1x2 + // 4, // 2x1 + 5, // 2x2 + 6, // 2x4 + // 9, // 4x2 + 10, // 4x4 + }; + + // out with the old + if (vrs.vrs_texture.is_valid()) { + RS::get_singleton()->free(vrs.vrs_texture); + vrs.vrs_texture = RID(); + } + + // in with the new + Vector<Ref<Image>> images; + vrs.size = vrs_sizei; + + for (int i = 0; i < view_count && i < 2; i++) { + PackedByteArray data; + data.resize(vrs_sizei.x * vrs_sizei.y); + uint8_t *data_ptr = data.ptrw(); + + // Our near and far don't matter much for what we're doing here, but there are some interfaces that will remember this as the near and far and may fail as a result... + CameraMatrix cm = get_projection_for_view(i, aspect, 0.1, 1000.0); + Vector3 center = cm.xform(Vector3(0.0, 0.0, 999.0)); + + Vector2i view_center; + view_center.x = int(vrs_size.x * (center.x + 1.0) * 0.5); + view_center.y = int(vrs_size.y * (center.y + 1.0) * 0.5); + + int d = 0; + for (int y = 0; y < vrs_sizei.y; y++) { + for (int x = 0; x < vrs_sizei.x; x++) { + Vector2 offset = Vector2(x - view_center.x, y - view_center.y); + offset.y *= aspect; + real_t distance = offset.length(); + int idx = round(5.0 * distance / radius); + if (idx > 4) { + idx = 4; + } + uint8_t density = densities[idx]; + + data_ptr[d++] = density; + } + } + + Ref<Image> image; + image.instantiate(); + image->create_from_data(vrs_sizei.x, vrs_sizei.y, false, Image::FORMAT_R8, data); + + images.push_back(image); + } + + if (images.size() == 1) { + vrs.vrs_texture = RS::get_singleton()->texture_2d_create(images[0]); + } else { + vrs.vrs_texture = RS::get_singleton()->texture_2d_layered_create(images, RS::TEXTURE_LAYERED_2D_ARRAY); + } + } + + return vrs.vrs_texture; +} + /** these are optional, so we want dummies **/ PackedStringArray XRInterface::get_suggested_tracker_names() const { PackedStringArray arr; diff --git a/servers/xr/xr_interface.h b/servers/xr/xr_interface.h index 62eba2f00b..b4eb4694f6 100644 --- a/servers/xr/xr_interface.h +++ b/servers/xr/xr_interface.h @@ -120,6 +120,7 @@ public: virtual Transform3D get_camera_transform() = 0; /* returns the position of our camera for updating our camera node. For monoscopic this is equal to the views transform, for stereoscopic this should be an average */ virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) = 0; /* get each views transform */ virtual CameraMatrix get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) = 0; /* get each view projection matrix */ + virtual RID get_vrs_texture(); /* obtain VRS texture */ // note, external color/depth/vrs texture support will be added here soon. @@ -133,6 +134,12 @@ public: XRInterface(); ~XRInterface(); + +private: + struct VRSData { + RID vrs_texture; + Size2i size; + } vrs; }; VARIANT_ENUM_CAST(XRInterface::Capabilities); diff --git a/servers/xr/xr_interface_extension.cpp b/servers/xr/xr_interface_extension.cpp index 1f3d07c357..94953c69a9 100644 --- a/servers/xr/xr_interface_extension.cpp +++ b/servers/xr/xr_interface_extension.cpp @@ -50,6 +50,7 @@ void XRInterfaceExtension::_bind_methods() { GDVIRTUAL_BIND(_get_camera_transform); GDVIRTUAL_BIND(_get_transform_for_view, "view", "cam_transform"); GDVIRTUAL_BIND(_get_projection_for_view, "view", "aspect", "z_near", "z_far"); + GDVIRTUAL_BIND(_get_vrs_texture); GDVIRTUAL_BIND(_process); GDVIRTUAL_BIND(_pre_render); @@ -273,6 +274,15 @@ CameraMatrix XRInterfaceExtension::get_projection_for_view(uint32_t p_view, doub return CameraMatrix(); } +RID XRInterfaceExtension::get_vrs_texture() { + RID vrs_texture; + if (GDVIRTUAL_CALL(_get_vrs_texture, vrs_texture)) { + return vrs_texture; + } else { + return XRInterface::get_vrs_texture(); + } +} + void XRInterfaceExtension::add_blit(RID p_render_target, Rect2 p_src_rect, Rect2i p_dst_rect, bool p_use_layer, uint32_t p_layer, bool p_apply_lens_distortion, Vector2 p_eye_center, double p_k1, double p_k2, double p_upscale, double p_aspect_ratio) { BlitToScreen blit; diff --git a/servers/xr/xr_interface_extension.h b/servers/xr/xr_interface_extension.h index 5a436b9fd0..7174b412c5 100644 --- a/servers/xr/xr_interface_extension.h +++ b/servers/xr/xr_interface_extension.h @@ -101,12 +101,14 @@ public: virtual Transform3D get_camera_transform() override; virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override; virtual CameraMatrix get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override; + virtual RID get_vrs_texture() override; GDVIRTUAL0R(Size2, _get_render_target_size); GDVIRTUAL0R(uint32_t, _get_view_count); GDVIRTUAL0R(Transform3D, _get_camera_transform); GDVIRTUAL2R(Transform3D, _get_transform_for_view, uint32_t, const Transform3D &); GDVIRTUAL4R(PackedFloat64Array, _get_projection_for_view, uint32_t, double, double, double); + GDVIRTUAL0R(RID, _get_vrs_texture); void add_blit(RID p_render_target, Rect2 p_src_rect, Rect2i p_dst_rect, bool p_use_layer = false, uint32_t p_layer = 0, bool p_apply_lens_distortion = false, Vector2 p_eye_center = Vector2(), double p_k1 = 0.0, double p_k2 = 0.0, double p_upscale = 1.0, double p_aspect_ratio = 1.0); diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h index 4098dd7ace..5d969b1fbc 100644 --- a/tests/scene/test_text_edit.h +++ b/tests/scene/test_text_edit.h @@ -3139,7 +3139,7 @@ TEST_CASE("[SceneTree][TextEdit] viewport") { v_scroll = text_edit->get_v_scroll(); SEND_GUI_MOUSE_BUTTON_EVENT(text_edit, Point2i(10, 10), MouseButton::WHEEL_DOWN, MouseButton::WHEEL_DOWN, Key::NONE); text_edit->notification(TextEdit::NOTIFICATION_INTERNAL_PHYSICS_PROCESS); - CHECK(text_edit->get_v_scroll() > v_scroll); + CHECK(text_edit->get_v_scroll() >= v_scroll); SEND_GUI_MOUSE_BUTTON_EVENT(text_edit, Point2i(10, 10), MouseButton::WHEEL_UP, MouseButton::WHEEL_UP, Key::NONE); text_edit->notification(TextEdit::NOTIFICATION_INTERNAL_PHYSICS_PROCESS); CHECK(text_edit->get_v_scroll() == v_scroll); @@ -3148,7 +3148,7 @@ TEST_CASE("[SceneTree][TextEdit] viewport") { text_edit->set_v_scroll_speed(10000); SEND_GUI_MOUSE_BUTTON_EVENT(text_edit, Point2i(10, 10), MouseButton::WHEEL_DOWN, MouseButton::WHEEL_DOWN, Key::NONE); text_edit->notification(TextEdit::NOTIFICATION_INTERNAL_PHYSICS_PROCESS); - CHECK(text_edit->get_v_scroll() > v_scroll); + CHECK(text_edit->get_v_scroll() >= v_scroll); SEND_GUI_MOUSE_BUTTON_EVENT(text_edit, Point2i(10, 10), MouseButton::WHEEL_UP, MouseButton::WHEEL_UP, Key::NONE); text_edit->notification(TextEdit::NOTIFICATION_INTERNAL_PHYSICS_PROCESS); CHECK(text_edit->get_v_scroll() == v_scroll); |