diff options
378 files changed, 10116 insertions, 7019 deletions
diff --git a/core/class_db.cpp b/core/class_db.cpp index 794d990083..49e3f94d8f 100644 --- a/core/class_db.cpp +++ b/core/class_db.cpp @@ -480,6 +480,7 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { PropertySetGet *psg = t->property_setget.getptr(F->get()); + ERR_FAIL_COND_V(!psg, 0); hash = hash_djb2_one_64(F->get().hash(), hash); hash = hash_djb2_one_64(psg->setter.hash(), hash); diff --git a/core/io/packet_peer.cpp b/core/io/packet_peer.cpp index c77c81f9e2..1e4ea715b3 100644 --- a/core/io/packet_peer.cpp +++ b/core/io/packet_peer.cpp @@ -110,10 +110,11 @@ Error PacketPeer::put_var(const Variant &p_packet, bool p_full_objects) { Variant PacketPeer::_bnd_get_var(bool p_allow_objects) { Variant var; - get_var(var, p_allow_objects); + Error err = get_var(var, p_allow_objects); + ERR_FAIL_COND_V(err != OK, Variant()); return var; -}; +} Error PacketPeer::_put_packet(const PoolVector<uint8_t> &p_buffer) { return put_packet_buffer(p_buffer); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 38bef2768e..146480e5a2 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -718,8 +718,8 @@ Error ResourceInteractiveLoaderBinary::poll() { Resource *r = Object::cast_to<Resource>(obj); if (!r) { error = ERR_FILE_CORRUPT; - memdelete(obj); //bye ERR_EXPLAIN(local_path + ":Resource type in resource field not a resource, type is: " + obj->get_class()); + memdelete(obj); //bye ERR_FAIL_V(ERR_FILE_CORRUPT); } diff --git a/core/make_binders.py b/core/make_binders.py index 24901c42a1..c38db5cef4 100644 --- a/core/make_binders.py +++ b/core/make_binders.py @@ -334,9 +334,6 @@ def make_version(template, nargs, argmax, const, ret): elif (cmd == "noarg"): for i in range(nargs + 1, argmax + 1): outtext += data.replace("@", str(i)) - elif (cmd == "noarg"): - for i in range(nargs + 1, argmax + 1): - outtext += data.replace("@", str(i)) from_pos = end + 1 diff --git a/core/map.h b/core/map.h index a701ba36f7..c8197639f2 100644 --- a/core/map.h +++ b/core/map.h @@ -38,7 +38,7 @@ */ // based on the very nice implementation of rb-trees by: -// http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html +// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html template <class K, class V, class C = Comparator<K>, class A = DefaultAllocator> class Map { diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index 8b3b6c82f3..30c0cab909 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -302,8 +302,8 @@ Vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transform) /** Fast Plane Extraction from combined modelview/projection matrices. * References: - * http://www.markmorley.com/opengl/frustumculling.html - * http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf + * https://web.archive.org/web/20011221205252/http://www.markmorley.com/opengl/frustumculling.html + * https://web.archive.org/web/20061020020112/http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf */ Vector<Plane> planes; diff --git a/core/math/math_funcs.cpp b/core/math/math_funcs.cpp index 7a2e74a413..f04e40cb6c 100644 --- a/core/math/math_funcs.cpp +++ b/core/math/math_funcs.cpp @@ -79,6 +79,15 @@ int Math::step_decimals(double p_step) { return 0; } +// Only meant for editor usage in float ranges, where a step of 0 +// means that decimal digits should not be limited in String::num. +int Math::range_step_decimals(double p_step) { + if (p_step < 0.0000000000001) { + return 16; // Max value hardcoded in String::num + } + return step_decimals(p_step); +} + double Math::dectime(double p_value, double p_amount, double p_step) { double sgn = p_value < 0 ? -1.0 : 1.0; double val = Math::abs(p_value); diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index b8b5151802..a712356ddc 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -270,6 +270,7 @@ public: // double only, as these functions are mainly used by the editor and not performance-critical, static double ease(double p_x, double p_c); static int step_decimals(double p_step); + static int range_step_decimals(double p_step); static double stepify(double p_value, double p_step); static double dectime(double p_value, double p_amount, double p_step); diff --git a/core/object.h b/core/object.h index e6c5b7c5b9..dce1cc74ae 100644 --- a/core/object.h +++ b/core/object.h @@ -58,7 +58,7 @@ enum PropertyHint { PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "full" to also include in/out. (ie: "attenuation,inout") PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - PROPERTY_HINT_SPRITE_FRAME, + PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat. Keeping now for GDNative compat. PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) PROPERTY_HINT_LAYERS_2D_RENDER, @@ -104,7 +104,8 @@ enum PropertyUsageFlags { PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor PROPERTY_USAGE_CATEGORY = 256, - //those below are deprecated thanks to ClassDB's now class value cache + // FIXME: Drop in 4.0, possibly reorder other flags? + // Those below are deprecated thanks to ClassDB's now class value cache //PROPERTY_USAGE_STORE_IF_NONZERO = 512, //only store if nonzero //PROPERTY_USAGE_STORE_IF_NONONE = 1024, //only store if false PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, @@ -121,6 +122,7 @@ enum PropertyUsageFlags { 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_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, diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index 0cdb5b41b7..b444f0ae1e 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -179,14 +179,6 @@ Error DirAccess::make_dir_recursive(String p_dir) { return OK; } -String DirAccess::get_next(bool *p_is_dir) { - - String next = get_next(); - if (p_is_dir) - *p_is_dir = current_is_dir(); - return next; -} - String DirAccess::fix_path(String p_path) const { switch (_access_type) { diff --git a/core/os/dir_access.h b/core/os/dir_access.h index bde19bd5ae..704eedae5b 100644 --- a/core/os/dir_access.h +++ b/core/os/dir_access.h @@ -71,7 +71,6 @@ protected: public: virtual Error list_dir_begin() = 0; ///< This starts dir listing - virtual String get_next(bool *p_is_dir); // compatibility virtual String get_next() = 0; virtual bool current_is_dir() const = 0; virtual bool current_is_hidden() const = 0; diff --git a/core/set.h b/core/set.h index 81250068af..b2c717880d 100644 --- a/core/set.h +++ b/core/set.h @@ -39,7 +39,7 @@ */ // based on the very nice implementation of rb-trees by: -// http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html +// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html template <class T, class C = Comparator<T>, class A = DefaultAllocator> class Set { diff --git a/core/ustring.cpp b/core/ustring.cpp index 75e3b6f22e..ed401c3763 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -2729,6 +2729,51 @@ bool String::is_quoted() const { return is_enclosed_in("\"") || is_enclosed_in("'"); } +int String::_count(const String &p_string, int p_from, int p_to, bool p_case_insensitive) const { + if (p_string.empty()) { + return 0; + } + int len = length(); + int slen = p_string.length(); + if (len < slen) { + return 0; + } + String str; + if (p_from >= 0 && p_to >= 0) { + if (p_to == 0) { + p_to = len; + } else if (p_from >= p_to) { + return 0; + } + if (p_from == 0 && p_to == len) { + str = String(); + str.copy_from_unchecked(&c_str()[0], len); + } else { + str = substr(p_from, p_to - p_from); + } + } else { + return 0; + } + int c = 0; + int idx = -1; + do { + idx = p_case_insensitive ? str.findn(p_string) : str.find(p_string); + if (idx != -1) { + str = str.substr(idx + slen, str.length() - slen); + ++c; + } + } while (idx != -1); + return c; +} + +int String::count(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, false); +} + +int String::countn(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, true); +} + bool String::_base_is_subsequence_of(const String &p_string, bool case_insensitive) const { int len = length(); diff --git a/core/ustring.h b/core/ustring.h index 8a52c53238..3eb5c47b3a 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -137,6 +137,7 @@ class String { void copy_from(const CharType &p_char); void copy_from_unchecked(const CharType *p_char, const int p_length); bool _base_is_subsequence_of(const String &p_string, bool case_insensitive) const; + int _count(const String &p_string, int p_from, int p_to, bool p_case_insensitive) const; public: enum { @@ -279,6 +280,9 @@ public: String to_upper() const; String to_lower() const; + int count(const String &p_string, int p_from = 0, int p_to = 0) const; + int countn(const String &p_string, int p_from = 0, int p_to = 0) const; + String left(int p_pos) const; String right(int p_pos) const; String dedent() const; diff --git a/core/variant_call.cpp b/core/variant_call.cpp index b637e745af..1f6e5bb653 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -237,6 +237,8 @@ struct _VariantCall { VCALL_LOCALMEM1R(String, casecmp_to); VCALL_LOCALMEM1R(String, nocasecmp_to); VCALL_LOCALMEM0R(String, length); + VCALL_LOCALMEM3R(String, count); + VCALL_LOCALMEM3R(String, countn); VCALL_LOCALMEM2R(String, substr); VCALL_LOCALMEM2R(String, find); VCALL_LOCALMEM1R(String, find_last); @@ -912,7 +914,7 @@ struct _VariantCall { static void Quat_init2(Variant &r_ret, const Variant **p_args) { - r_ret = Quat(((Vector3)(*p_args[0])), ((float)(*p_args[1]))); + r_ret = Quat(((Vector3)(*p_args[0])), ((real_t)(*p_args[1]))); } static void Quat_init3(Variant &r_ret, const Variant **p_args) { @@ -1502,6 +1504,9 @@ void register_variant_methods() { ADDFUNC2R(STRING, INT, String, find, STRING, "what", INT, "from", varray(0)); + ADDFUNC3R(STRING, INT, String, count, STRING, "what", INT, "from", INT, "to", varray(0, 0)); + ADDFUNC3R(STRING, INT, String, countn, STRING, "what", INT, "from", INT, "to", varray(0, 0)); + ADDFUNC1R(STRING, INT, String, find_last, STRING, "what", varray()); ADDFUNC2R(STRING, INT, String, findn, STRING, "what", INT, "from", varray(0)); ADDFUNC2R(STRING, INT, String, rfind, STRING, "what", INT, "from", varray(-1)); diff --git a/doc/classes/CollisionObject2D.xml b/doc/classes/CollisionObject2D.xml index eb69a4aed4..b9ec9480cf 100644 --- a/doc/classes/CollisionObject2D.xml +++ b/doc/classes/CollisionObject2D.xml @@ -19,7 +19,7 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> - Accepts unhandled [InputEvent]s. [code]shape_idx[/code] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events. + Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be [code]true[/code]. [code]shape_idx[/code] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events. </description> </method> <method name="create_shape_owner"> @@ -227,17 +227,17 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> - Emitted when an input event occurs. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. See [method _input_event] for details. + Emitted when an input event occurs. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. See [method _input_event] for details. </description> </signal> <signal name="mouse_entered"> <description> - Emitted when the mouse pointer enters any of this object's shapes. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. + Emitted when the mouse pointer enters any of this object's shapes. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. </description> </signal> <signal name="mouse_exited"> <description> - Emitted when the mouse pointer exits all this object's shapes. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. + Emitted when the mouse pointer exits all this object's shapes. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. </description> </signal> </signals> diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index bbf1ee186f..91ebcd52f6 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -222,7 +222,7 @@ <argument index="0" name="action" type="String"> </argument> <description> - Returns [code]true[/code] if you are pressing the action event. + Returns [code]true[/code] if you are pressing the action event. Note that if an action has multiple buttons asigned and more than one of them is pressed, releasing one button will release the action, even if some other button assigned to this action is still pressed. </description> </method> <method name="is_joy_button_pressed" qualifiers="const"> @@ -318,6 +318,7 @@ <description> Sets the default cursor shape to be used in the viewport instead of [constant CURSOR_ARROW]. [b]Note:[/b] If you want to change the default cursor shape for [Control]'s nodes, use [member Control.mouse_default_cursor_shape] instead. + [b]Note:[/b] This method generates an [InputEventMouseMotion] to update cursor immediately. </description> </method> <method name="set_mouse_mode"> diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml index b7c4200b95..2fab689f89 100644 --- a/doc/classes/KinematicBody.xml +++ b/doc/classes/KinematicBody.xml @@ -5,7 +5,7 @@ </brief_description> <description> Kinematic bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a character or a rigid body, these are the same as a static body. However, they have two main uses: - [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an AnimationPlayer (with process mode set to fixed), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). + [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an [AnimationPlayer] (with [member AnimationPlayer.playback_process_mode] set to "physics"), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). [b]Kinematic characters:[/b] KinematicBody also has an API for moving objects (the [method move_and_collide] and [method move_and_slide] methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics. </description> <tutorials> diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml index 39d84c6e31..99a83765eb 100644 --- a/doc/classes/KinematicBody2D.xml +++ b/doc/classes/KinematicBody2D.xml @@ -5,7 +5,7 @@ </brief_description> <description> Kinematic bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a character or a rigid body, these are the same as a static body. However, they have two main uses: - [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an AnimationPlayer (with process mode set to fixed), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). + [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an [AnimationPlayer] (with [member AnimationPlayer.playback_process_mode] set to "physics"), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). [b]Kinematic characters:[/b] KinematicBody2D also has an API for moving objects (the [method move_and_collide] and [method move_and_slide] methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics. </description> <tutorials> @@ -76,6 +76,7 @@ </argument> <description> Moves the body along the vector [code]rel_vec[/code]. The body will stop if it collides. Returns a [KinematicCollision2D], which contains information about the collision. + If [code]test_only[/code] is [code]true[/code], the body does not move but the would-be collision information is given. </description> </method> <method name="move_and_slide"> diff --git a/doc/classes/PointMesh.xml b/doc/classes/PointMesh.xml new file mode 100644 index 0000000000..dc7dd065cf --- /dev/null +++ b/doc/classes/PointMesh.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="PointMesh" inherits="PrimitiveMesh" category="Core" version="3.2"> + <brief_description> + Mesh with a single Point primitive. + </brief_description> + <description> + The PointMesh is made from a single point. Instead of relying on triangles, points are rendered as a single rectangle on the screen with a constant size. They are intended to be used with Particle systems, but can be used as a cheap way to render constant size billboarded sprites (for example in a point cloud). + PointMeshes, must be used with a material that has a point size. Point size can be accessed in a shader with [code]POINT_SIZE[/code], or in a [SpatialMaterial] by setting [member SpatialMaterial.flags_use_point_size] and the variable [member SpatialMaterial.params_point_size]. + When using PointMeshes, properties that normally alter vertices will be ignored, including billboard mode, grow, and cull face. + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <constants> + </constants> +</class> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 7ab29e67ae..80d21e07ea 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -727,6 +727,12 @@ <member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter="" default="65536"> Max amount of elements renderable in a frame. If more than this are visible per frame, they will be dropped. Keep in mind elements refer to mesh surfaces and not meshes themselves. </member> + <member name="rendering/limits/rendering/max_renderable_lights" type="int" setter="" getter="" default="4096"> + Max number of lights renderable in a frame. If more than this number are used, they will be ignored. On some systems (particularly web) setting this number as low as possible can increase the speed of shader compilation. + </member> + <member name="rendering/limits/rendering/max_renderable_reflections" type="int" setter="" getter="" default="1024"> + Max number of reflection probes renderable in a frame. If more than this number are used, they will be ignored. On some systems (particularly web) setting this number as low as possible can increase the speed of shader compilation. + </member> <member name="rendering/limits/time/time_rollover_secs" type="float" setter="" getter="" default="3600"> Shaders have a time variable that constantly increases. At some point, it needs to be rolled back to zero to avoid precision errors on shader animations. This setting specifies when (in seconds). </member> @@ -825,7 +831,7 @@ <member name="rendering/quality/subsurface_scattering/weight_samples" type="bool" setter="" getter="" default="true"> Weight subsurface scattering samples. Helps to avoid reading samples from unrelated parts of the screen. </member> - <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter="" default="true"> + <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter="" default="false"> Use high-quality voxel cone tracing. This results in better-looking reflections, but is much more expensive on the GPU. </member> <member name="rendering/threads/thread_model" type="int" setter="" getter="" default="1"> diff --git a/doc/classes/Sprite.xml b/doc/classes/Sprite.xml index e5aea961f4..b77db1ce9a 100644 --- a/doc/classes/Sprite.xml +++ b/doc/classes/Sprite.xml @@ -46,6 +46,9 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> Current frame to display from sprite sheet. [member vframes] or [member hframes] must be greater than 1. </member> + <member name="frame_coords" type="Vector2" setter="set_frame_coords" getter="get_frame_coords" default="Vector2( 0, 0 )"> + Coordinates of the frame to display from sprite sheet. This is as an alias for the [member frame] property. [member vframes] or [member hframes] must be greater than 1. + </member> <member name="hframes" type="int" setter="set_hframes" getter="get_hframes" default="1"> The number of columns in the sprite sheet. </member> diff --git a/doc/classes/Sprite3D.xml b/doc/classes/Sprite3D.xml index 9a51302bf1..e458d4301e 100644 --- a/doc/classes/Sprite3D.xml +++ b/doc/classes/Sprite3D.xml @@ -14,6 +14,9 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> Current frame to display from sprite sheet. [member vframes] or [member hframes] must be greater than 1. </member> + <member name="frame_coords" type="Vector2" setter="set_frame_coords" getter="get_frame_coords" default="Vector2( 0, 0 )"> + Coordinates of the frame to display from sprite sheet. This is as an alias for the [member frame] property. [member vframes] or [member hframes] must be greater than 1. + </member> <member name="hframes" type="int" setter="set_hframes" getter="get_hframes" default="1"> The number of columns in the sprite sheet. </member> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index e513a44b1d..f6ec85c87d 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -272,6 +272,32 @@ Performs a case-sensitive comparison to another string. Returns [code]-1[/code] if less than, [code]+1[/code] if greater than, or [code]0[/code] if equal. </description> </method> + <method name="count"> + <return type="int"> + </return> + <argument index="0" name="what" type="String"> + </argument> + <argument index="1" name="from" type="int" default="0"> + </argument> + <argument index="2" name="to" type="int" default="0"> + </argument> + <description> + Returns the number of occurrences of substring [code]what[/code] between [code]from[/code] and [code]to[/code] positions. If [code]from[/code] and [code]to[/code] equals 0 the whole string will be used. If only [code]to[/code] equals 0 the remained substring will be used. + </description> + </method> + <method name="countn"> + <return type="int"> + </return> + <argument index="0" name="what" type="String"> + </argument> + <argument index="1" name="from" type="int" default="0"> + </argument> + <argument index="2" name="to" type="int" default="0"> + </argument> + <description> + Returns the number of occurrences of substring [code]what[/code] (ignoring case) between [code]from[/code] and [code]to[/code] positions. If [code]from[/code] and [code]to[/code] equals 0 the whole string will be used. If only [code]to[/code] equals 0 the remained substring will be used. + </description> + </method> <method name="dedent"> <return type="String"> </return> diff --git a/doc/classes/VehicleWheel.xml b/doc/classes/VehicleWheel.xml index 6de6429531..ff6004bcba 100644 --- a/doc/classes/VehicleWheel.xml +++ b/doc/classes/VehicleWheel.xml @@ -13,6 +13,7 @@ <return type="float"> </return> <description> + Returns the rotational speed of the wheel in revolutions per minute. </description> </method> <method name="get_skidinfo" qualifiers="const"> @@ -31,12 +32,23 @@ </method> </methods> <members> + <member name="brake" type="float" setter="set_brake" getter="get_brake" default="0.0"> + Slows down the wheel by applying a braking force. The wheel is only slowed down if it is in contact with a surface. The force you need to apply to adequately slow down your vehicle depends on the [member RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 30 range for hard braking. + </member> <member name="damping_compression" type="float" setter="set_damping_compression" getter="get_damping_compression" default="0.83"> The damping applied to the spring when the spring is being compressed. This value should be between 0.0 (no damping) and 1.0. A value of 0.0 means the car will keep bouncing as the spring keeps its energy. A good value for this is around 0.3 for a normal car, 0.5 for a race car. </member> <member name="damping_relaxation" type="float" setter="set_damping_relaxation" getter="get_damping_relaxation" default="0.88"> 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 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. + [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> + <member name="steering" type="float" setter="set_steering" getter="get_steering" default="0.0"> + The steering angle for the wheel. Setting this to a non-zero value will result in the vehicle turning when it's moving. + </member> <member name="suspension_max_force" type="float" setter="set_suspension_max_force" getter="get_suspension_max_force" default="6000.0"> The maximum force the spring can resist. This value should be higher than a quarter of the [member RigidBody.mass] of the [VehicleBody] or the spring will not carry the weight of the vehicle. Good results are often obtained by a value that is about 3× to 4× this number. </member> @@ -47,10 +59,10 @@ This is the distance the suspension can travel. As Godot units are equivalent to meters, keep this setting relatively low. Try a value between 0.1 and 0.3 depending on the type of car. </member> <member name="use_as_steering" type="bool" setter="set_use_as_steering" getter="is_used_as_steering" default="false"> - If [code]true[/code], this wheel will be turned when the car steers. + If [code]true[/code], this wheel will be turned when the car steers. This value is used in conjunction with [member VehicleBody.steering] and ignored if you are using the per-wheel [member steering] value instead. </member> <member name="use_as_traction" type="bool" setter="set_use_as_traction" getter="is_used_as_traction" default="false"> - If [code]true[/code], this wheel transfers engine force to the ground to propel the vehicle forward. + If [code]true[/code], this wheel transfers engine force to the ground to propel the vehicle forward. This value is used in conjunction with [member VehicleBody.engine_force] and ignored if you are using the per-wheel [member engine_force] value instead. </member> <member name="wheel_friction_slip" type="float" setter="set_friction_slip" getter="get_friction_slip" default="10.5"> This determines how much grip this wheel has. It is combined with the friction setting of the surface the wheel is in contact with. 0.0 means no grip, 1.0 is normal grip. For a drift car setup, try setting the grip of the rear wheels slightly lower than the front wheels, or use a lower value to simulate tire wear. diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py index 763c29ab4e..b42ae3ce01 100755 --- a/doc/tools/makerst.py +++ b/doc/tools/makerst.py @@ -347,6 +347,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S f = open(os.path.join(output_dir, "class_" + class_name.lower() + '.rst'), 'w', encoding='utf-8') # Warn contributors not to edit this file directly + f.write(":github_url: hide\n\n") f.write(".. Generated automatically by doc/tools/makerst.py in Godot's source tree.\n") f.write(".. DO NOT EDIT THIS FILE, but the " + class_name + ".xml source instead.\n") f.write(".. The source is found in doc/classes or modules/<name>/doc_classes.\n\n") diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index df7eee2301..630a5ed6c6 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -733,6 +733,17 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener code += ")"; + if (p_default_actions.usage_defines.has(var_node->name) && !used_name_defines.has(var_node->name)) { + String define = p_default_actions.usage_defines[var_node->name]; + + if (define.begins_with("@")) { + define = p_default_actions.usage_defines[define.substr(1, define.length())]; + } + + r_gen_code.custom_defines.push_back(define.utf8()); + used_name_defines.insert(var_node->name); + } + } break; case SL::OP_INDEX: { @@ -917,6 +928,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMAL"] = "#define NORMAL_USED\n"; actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMALMAP"] = "#define NORMALMAP_USED\n"; actions[VS::SHADER_CANVAS_ITEM].usage_defines["LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["round"] = "#define ROUND_USED\n"; actions[VS::SHADER_CANVAS_ITEM].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; /** SPATIAL SHADER **/ diff --git a/drivers/gles2/shaders/canvas.glsl b/drivers/gles2/shaders/canvas.glsl index 0818942b0a..fa0b315e29 100644 --- a/drivers/gles2/shaders/canvas.glsl +++ b/drivers/gles2/shaders/canvas.glsl @@ -258,6 +258,8 @@ precision mediump int; #endif #endif +#include "stdlib.glsl" + uniform sampler2D color_texture; // texunit:-1 /* clang-format on */ uniform highp vec2 color_texpixel_size; @@ -489,8 +491,7 @@ FRAGMENT_SHADER_CODE highp float shadow_attenuation = 0.0; #ifdef USE_RGBA_SHADOWS - -#define SHADOW_DEPTH(m_tex, m_uv) dot(texture2D((m_tex), (m_uv)), vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_tex, m_uv) dot(texture2D((m_tex), (m_uv)), vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else diff --git a/drivers/gles2/shaders/canvas_shadow.glsl b/drivers/gles2/shaders/canvas_shadow.glsl index 01b2c59325..dcb43d523f 100644 --- a/drivers/gles2/shaders/canvas_shadow.glsl +++ b/drivers/gles2/shaders/canvas_shadow.glsl @@ -47,8 +47,8 @@ void main() { #ifdef USE_RGBA_SHADOWS - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); gl_FragColor = comp; #else diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index b7f8ec3ce9..534c977a87 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -1365,7 +1365,7 @@ LIGHT_SHADER_CODE #ifdef USE_RGBA_SHADOWS -#define SHADOW_DEPTH(m_val) dot(m_val, vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_val) dot(m_val, vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else @@ -2207,8 +2207,8 @@ FRAGMENT_SHADER_CODE #ifdef USE_RGBA_SHADOWS highp float depth = ((position_interp.z / position_interp.w) + 1.0) * 0.5 + 0.0; // bias - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); gl_FragColor = comp; #endif diff --git a/drivers/gles2/shaders/stdlib.glsl b/drivers/gles2/shaders/stdlib.glsl index 3674d70c9f..b9ecfec65e 100644 --- a/drivers/gles2/shaders/stdlib.glsl +++ b/drivers/gles2/shaders/stdlib.glsl @@ -35,6 +35,23 @@ highp vec4 texel2DFetch(highp sampler2D tex, ivec2 size, ivec2 coord) { return texture2DLod(tex, vec2(x_coord, y_coord), 0.0); } +#ifdef ROUND_USED +highp float round(highp float x) { + return floor(x + 0.5); +} + +highp vec2 round(highp vec2 x) { + return floor(x + vec2(0.5)); +} + +highp vec3 round(highp vec3 x) { + return floor(x + vec3(0.5)); +} + +highp vec4 round(highp vec4 x) { + return floor(x + vec4(0.5)); +} +#endif #ifndef USE_GLES_OVER_GL highp mat4 transpose(highp mat4 src) { diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 812e3711c5..30ca07aa28 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2365,7 +2365,7 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G if (p_depth_pass) { - if (has_blend_alpha || p_material->shader->spatial.uses_depth_texture || (has_base_alpha && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) || p_material->shader->spatial.depth_draw_mode == RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_NEVER || p_material->shader->spatial.no_depth_test) + if (has_blend_alpha || p_material->shader->spatial.uses_depth_texture || (has_base_alpha && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) || p_material->shader->spatial.depth_draw_mode == RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_NEVER || p_material->shader->spatial.no_depth_test || p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_OFF) return; //bye if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { @@ -2824,7 +2824,7 @@ void RasterizerSceneGLES3::_setup_lights(RID *p_light_cull_result, int p_light_c for (int i = 0; i < p_light_cull_count; i++) { - ERR_BREAK(i >= RenderList::MAX_LIGHTS); + ERR_BREAK(i >= render_list.max_lights); LightInstance *li = light_instance_owner.getptr(p_light_cull_result[i]); @@ -4189,7 +4189,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const for (int i = 0; i < p_light_cull_count; i++) { - ERR_BREAK(i >= RenderList::MAX_LIGHTS); + ERR_BREAK(i >= render_list.max_lights); LightInstance *li = light_instance_owner.getptr(p_light_cull_result[i]); if (li->light_ptr->param[VS::LIGHT_PARAM_CONTACT_SHADOW_SIZE] > CMP_EPSILON) { @@ -5064,6 +5064,10 @@ void RasterizerSceneGLES3::initialize() { render_list.max_elements = GLOBAL_DEF_RST("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS); ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_elements", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_elements", PROPERTY_HINT_RANGE, "1024,1000000,1")); + render_list.max_lights = GLOBAL_DEF("rendering/limits/rendering/max_renderable_lights", (int)RenderList::DEFAULT_MAX_LIGHTS); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_lights", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_lights", PROPERTY_HINT_RANGE, "16,4096,1")); + render_list.max_reflections = GLOBAL_DEF("rendering/limits/rendering/max_renderable_reflections", (int)RenderList::DEFAULT_MAX_REFLECTIONS); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_reflections", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_reflections", PROPERTY_HINT_RANGE, "8,1024,1")); { //quad buffers @@ -5158,7 +5162,7 @@ void RasterizerSceneGLES3::initialize() { glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_ubo_size); const int ubo_light_size = 160; state.ubo_light_size = ubo_light_size; - state.max_ubo_lights = MIN(RenderList::MAX_LIGHTS, max_ubo_size / ubo_light_size); + state.max_ubo_lights = MIN(render_list.max_lights, max_ubo_size / ubo_light_size); state.spot_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); state.omni_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); @@ -5183,7 +5187,7 @@ void RasterizerSceneGLES3::initialize() { state.scene_shader.add_custom_define("#define MAX_LIGHT_DATA_STRUCTS " + itos(state.max_ubo_lights) + "\n"); state.scene_shader.add_custom_define("#define MAX_FORWARD_LIGHTS " + itos(state.max_forward_lights_per_object) + "\n"); - state.max_ubo_reflections = MIN((int)RenderList::MAX_REFLECTIONS, max_ubo_size / sizeof(ReflectionProbeDataUBO)); + state.max_ubo_reflections = MIN(render_list.max_reflections, max_ubo_size / (int)sizeof(ReflectionProbeDataUBO)); state.reflection_array_tmp = (uint8_t *)memalloc(sizeof(ReflectionProbeDataUBO) * state.max_ubo_reflections); @@ -5296,7 +5300,7 @@ void RasterizerSceneGLES3::initialize() { GLOBAL_DEF("rendering/quality/subsurface_scattering/follow_surface", false); GLOBAL_DEF("rendering/quality/subsurface_scattering/weight_samples", true); - GLOBAL_DEF("rendering/quality/voxel_cone_tracing/high_quality", true); + GLOBAL_DEF("rendering/quality/voxel_cone_tracing/high_quality", false); } exposure_shrink_size = 243; diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 910f90edc2..b5e64b6162 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -669,8 +669,8 @@ public: SORT_FLAG_SKELETON = 1, SORT_FLAG_INSTANCING = 2, MAX_DIRECTIONAL_LIGHTS = 16, - MAX_LIGHTS = 4096, - MAX_REFLECTIONS = 1024, + DEFAULT_MAX_LIGHTS = 4096, + DEFAULT_MAX_REFLECTIONS = 1024, SORT_KEY_PRIORITY_SHIFT = 56, SORT_KEY_PRIORITY_MASK = 0xFF, @@ -701,6 +701,8 @@ public: }; int max_elements; + int max_lights; + int max_reflections; struct Element { @@ -813,6 +815,8 @@ public: RenderList() { max_elements = DEFAULT_MAX_ELEMENTS; + max_lights = DEFAULT_MAX_LIGHTS; + max_reflections = DEFAULT_MAX_REFLECTIONS; } ~RenderList() { diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 57b4c198eb..e0ca388da9 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -8093,7 +8093,7 @@ void RasterizerStorageGLES3::initialize() { glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &config.max_texture_image_units); glGetIntegerv(GL_MAX_TEXTURE_SIZE, &config.max_texture_size); - config.use_rgba_2d_shadows = config.framebuffer_float_supported; + config.use_rgba_2d_shadows = !config.framebuffer_float_supported; //generic quadie for copying diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index a46b31c92e..10c8764b8e 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -597,7 +597,7 @@ FRAGMENT_SHADER_CODE #ifdef USE_RGBA_SHADOWS -#define SHADOW_DEPTH(m_tex, m_uv) dot(texture((m_tex), (m_uv)), vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_tex, m_uv) dot(texture((m_tex), (m_uv)), vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else diff --git a/drivers/gles3/shaders/canvas_shadow.glsl b/drivers/gles3/shaders/canvas_shadow.glsl index 13fff7f4d1..4f706c5505 100644 --- a/drivers/gles3/shaders/canvas_shadow.glsl +++ b/drivers/gles3/shaders/canvas_shadow.glsl @@ -35,8 +35,8 @@ void main() { #ifdef USE_RGBA_SHADOWS - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); distance_buf = comp; #else diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 251bab5783..6817137a94 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -126,37 +126,32 @@ String DirAccessUnix::get_next() { if (!dir_stream) return ""; - dirent *entry; - entry = readdir(dir_stream); + dirent *entry = readdir(dir_stream); if (entry == NULL) { - list_dir_end(); return ""; } - //typedef struct stat Stat; - struct stat flags; - String fname = fix_unicode_name(entry->d_name); - String f = current_dir.plus_file(fname); - - if (stat(f.utf8().get_data(), &flags) == 0) { - - if (S_ISDIR(flags.st_mode)) { - - _cisdir = true; - + // Look at d_type to determine if the entry is a directory, unless + // its type is unknown (the file system does not support it) or if + // the type is a link, in that case we want to resolve the link to + // known if it points to a directory. stat() will resolve the link + // for us. + if (entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK) { + String f = current_dir.plus_file(fname); + + struct stat flags; + if (stat(f.utf8().get_data(), &flags) == 0) { + _cisdir = S_ISDIR(flags.st_mode); } else { - _cisdir = false; } - } else { - - _cisdir = false; + _cisdir = (entry->d_type == DT_DIR); } _cishidden = (fname != "." && fname != ".." && fname.begins_with(".")); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index d1ac69c8d8..9b376ae090 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -82,22 +82,23 @@ public: } void _update_obj(const Ref<Animation> &p_anim) { - if (setting) - return; - if (!(animation == p_anim)) + + if (setting || animation != p_anim) return; notify_change(); } void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) { - if (!(animation == p_anim)) - return; - if (from != key_ofs) + + if (animation != p_anim || from != key_ofs) return; + key_ofs = to; + if (setting) return; + notify_change(); } @@ -118,6 +119,7 @@ public: } new_time /= fps; } + if (new_time == key_ofs) return true; @@ -141,12 +143,13 @@ public: trans = animation->track_get_key_transition(track, existing); undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, new_time, v, trans); } - undo_redo->commit_action(); - setting = false; + setting = false; return true; - } else if (name == "easing") { + } + + if (name == "easing") { float val = p_value; float prev_val = animation->track_get_key_transition(track, key); @@ -157,6 +160,7 @@ public: undo_redo->add_do_method(this, "_update_obj", animation); undo_redo->add_undo_method(this, "_update_obj", animation); undo_redo->commit_action(); + setting = false; return true; } @@ -166,7 +170,7 @@ public: case Animation::TYPE_TRANSFORM: { Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old; + Dictionary d_new = d_old.duplicate(); d_new[p_name] = p_value; setting = true; undo_redo->create_action(TTR("Anim Change Transform")); @@ -178,7 +182,6 @@ public: setting = false; return true; - } break; case Animation::TYPE_VALUE: { @@ -187,7 +190,6 @@ public: Variant value = p_value; if (value.get_type() == Variant::NODE_PATH) { - _fix_node_path(value); } @@ -203,12 +205,11 @@ public: setting = false; return true; } - } break; case Animation::TYPE_METHOD: { Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old; + Dictionary d_new = d_old.duplicate(); bool change_notify_deserved = false; bool mergeable = false; @@ -216,17 +217,13 @@ public: if (name == "name") { d_new["method"] = p_value; - } - - if (name == "arg_count") { + } else if (name == "arg_count") { Vector<Variant> args = d_old["args"]; args.resize(p_value); d_new["args"] = args; change_notify_deserved = true; - } - - if (name.begins_with("args/")) { + } else if (name.begins_with("args/")) { Vector<Variant> args = d_old["args"]; int idx = name.get_slice("/", 1).to_int(); @@ -249,8 +246,7 @@ public: change_notify_deserved = true; d_new["args"] = args; } - } - if (what == "value") { + } else if (what == "value") { Variant value = p_value; if (value.get_type() == Variant::NODE_PATH) { @@ -300,6 +296,7 @@ public: setting = false; return true; } + if (name == "in_handle") { const Variant &value = p_value; @@ -316,6 +313,7 @@ public: setting = false; return true; } + if (name == "out_handle") { const Variant &value = p_value; @@ -332,7 +330,6 @@ public: setting = false; return true; } - } break; case Animation::TYPE_AUDIO: { @@ -352,6 +349,7 @@ public: setting = false; return true; } + if (name == "start_offset") { float value = p_value; @@ -368,6 +366,7 @@ public: setting = false; return true; } + if (name == "end_offset") { float value = p_value; @@ -384,7 +383,6 @@ public: setting = false; return true; } - } break; case Animation::TYPE_ANIMATION: { @@ -400,10 +398,10 @@ public: undo_redo->add_do_method(this, "_update_obj", animation); undo_redo->add_undo_method(this, "_update_obj", animation); undo_redo->commit_action(); + setting = false; return true; } - } break; } @@ -419,20 +417,24 @@ public: if (name == "time") { r_ret = key_ofs; return true; - } else if (name == "frame") { + } + + if (name == "frame") { + float fps = animation->get_step(); if (fps > 0) { fps = 1.0 / fps; } r_ret = key_ofs * fps; return true; - } else if (name == "easing") { + } + + if (name == "easing") { r_ret = animation->track_get_key_transition(track, key); return true; } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM: { Dictionary d = animation->track_get_key_value(track, key); @@ -465,7 +467,6 @@ public: Vector<Variant> args = d["args"]; if (name == "arg_count") { - r_ret = args.size(); return true; } @@ -480,6 +481,7 @@ public: r_ret = args[idx].get_type(); return true; } + if (what == "value") { r_ret = args[idx]; return true; @@ -493,10 +495,12 @@ public: r_ret = animation->bezier_track_get_key_value(track, key); return true; } + if (name == "in_handle") { r_ret = animation->bezier_track_get_key_in_handle(track, key); return true; } + if (name == "out_handle") { r_ret = animation->bezier_track_get_key_out_handle(track, key); return true; @@ -509,10 +513,12 @@ public: r_ret = animation->audio_track_get_key_stream(track, key); return true; } + if (name == "start_offset") { r_ret = animation->audio_track_get_key_start_offset(track, key); return true; } + if (name == "end_offset") { r_ret = animation->audio_track_get_key_end_offset(track, key); return true; @@ -691,6 +697,702 @@ public: } }; +class AnimationMultiTrackKeyEdit : public Object { + + GDCLASS(AnimationMultiTrackKeyEdit, Object); + +public: + bool setting; + + bool _hide_script_from_inspector() { + return true; + } + + bool _dont_undo_redo() { + return true; + } + + static void _bind_methods() { + + ClassDB::bind_method("_update_obj", &AnimationMultiTrackKeyEdit::_update_obj); + ClassDB::bind_method("_key_ofs_changed", &AnimationMultiTrackKeyEdit::_key_ofs_changed); + ClassDB::bind_method("_hide_script_from_inspector", &AnimationMultiTrackKeyEdit::_hide_script_from_inspector); + ClassDB::bind_method("get_root_path", &AnimationMultiTrackKeyEdit::get_root_path); + ClassDB::bind_method("_dont_undo_redo", &AnimationMultiTrackKeyEdit::_dont_undo_redo); + } + + void _fix_node_path(Variant &value, NodePath &base) { + + NodePath np = value; + + if (np == NodePath()) + return; + + Node *root = EditorNode::get_singleton()->get_tree()->get_root(); + + Node *np_node = root->get_node(np); + ERR_FAIL_COND(!np_node); + + Node *edited_node = root->get_node(base); + ERR_FAIL_COND(!edited_node); + + value = edited_node->get_path_to(np_node); + } + + void _update_obj(const Ref<Animation> &p_anim) { + + if (setting || animation != p_anim) + return; + + notify_change(); + } + + void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) { + + if (animation != p_anim) + return; + + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + if (from != key_ofs) + continue; + + int track = E->key(); + key_ofs_map[track][key_ofs] = to; + + if (setting) + return; + + notify_change(); + + return; + } + } + } + + bool _set(const StringName &p_name, const Variant &p_value) { + + bool update_obj = false; + bool change_notify_deserved = false; + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + int key = animation->track_find_key(track, key_ofs, true); + ERR_FAIL_COND_V(key == -1, false); + + String name = p_name; + if (name == "time" || name == "frame") { + + float new_time = p_value; + + if (name == "frame") { + float fps = animation->get_step(); + if (fps > 0) { + fps = 1.0 / fps; + } + new_time /= fps; + } + + int existing = animation->track_find_key(track, new_time, true); + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Time"), UndoRedo::MERGE_ENDS); + } + + Variant val = animation->track_get_key_value(track, key); + float trans = animation->track_get_key_transition(track, key); + + undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, key); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, new_time, val, trans); + undo_redo->add_do_method(this, "_key_ofs_changed", animation, key_ofs, new_time); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", track, new_time); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, key_ofs, val, trans); + undo_redo->add_undo_method(this, "_key_ofs_changed", animation, new_time, key_ofs); + + if (existing != -1) { + Variant v = animation->track_get_key_value(track, existing); + trans = animation->track_get_key_transition(track, existing); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, new_time, v, trans); + } + } else if (name == "easing") { + + float val = p_value; + float prev_val = animation->track_get_key_transition(track, key); + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Transition"), UndoRedo::MERGE_ENDS); + } + undo_redo->add_do_method(animation.ptr(), "track_set_key_transition", track, key, val); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_transition", track, key, prev_val); + update_obj = true; + } + + switch (animation->track_get_type(track)) { + + case Animation::TYPE_TRANSFORM: { + + Dictionary d_old = animation->track_get_key_value(track, key); + Dictionary d_new = d_old.duplicate(); + d_new[p_name] = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Transform")); + } + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, d_new); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, d_old); + update_obj = true; + } break; + case Animation::TYPE_VALUE: { + + if (name == "value") { + + Variant value = p_value; + + if (value.get_type() == Variant::NODE_PATH) { + _fix_node_path(value, base_map[track]); + } + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Variant prev = animation->track_get_key_value(track, key); + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_METHOD: { + + Dictionary d_old = animation->track_get_key_value(track, key); + Dictionary d_new = d_old.duplicate(); + + bool mergeable = false; + + if (name == "name") { + + d_new["method"] = p_value; + } else if (name == "arg_count") { + + Vector<Variant> args = d_old["args"]; + args.resize(p_value); + d_new["args"] = args; + change_notify_deserved = true; + } else if (name.begins_with("args/")) { + + Vector<Variant> args = d_old["args"]; + int idx = name.get_slice("/", 1).to_int(); + ERR_FAIL_INDEX_V(idx, args.size(), false); + + String what = name.get_slice("/", 2); + if (what == "type") { + Variant::Type t = Variant::Type(int(p_value)); + + if (t != args[idx].get_type()) { + Variant::CallError err; + if (Variant::can_convert(args[idx].get_type(), t)) { + Variant old = args[idx]; + Variant *ptrs[1] = { &old }; + args.write[idx] = Variant::construct(t, (const Variant **)ptrs, 1, err); + } else { + + args.write[idx] = Variant::construct(t, NULL, 0, err); + } + change_notify_deserved = true; + d_new["args"] = args; + } + } else if (what == "value") { + + Variant value = p_value; + if (value.get_type() == Variant::NODE_PATH) { + + _fix_node_path(value, base_map[track]); + } + + args.write[idx] = value; + d_new["args"] = args; + mergeable = true; + } + } + + Variant prev = animation->track_get_key_value(track, key); + + if (!setting) { + if (mergeable) + undo_redo->create_action(TTR("Anim Multi Change Call"), UndoRedo::MERGE_ENDS); + else + undo_redo->create_action(TTR("Anim Multi Change Call")); + + setting = true; + } + + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, d_new); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, d_old); + update_obj = true; + } break; + case Animation::TYPE_BEZIER: { + + if (name == "value") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->bezier_track_get_key_value(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_value", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_value", track, key, prev); + update_obj = true; + } else if (name == "in_handle") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Vector2 prev = animation->bezier_track_get_key_in_handle(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, prev); + update_obj = true; + } else if (name == "out_handle") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Vector2 prev = animation->bezier_track_get_key_out_handle(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_AUDIO: { + + if (name == "stream") { + + Ref<AudioStream> stream = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + RES prev = animation->audio_track_get_key_stream(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_stream", track, key, stream); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_stream", track, key, prev); + update_obj = true; + } else if (name == "start_offset") { + + float value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->audio_track_get_key_start_offset(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, prev); + update_obj = true; + } else if (name == "end_offset") { + + float value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->audio_track_get_key_end_offset(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_ANIMATION: { + + if (name == "animation") { + + StringName anim_name = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + StringName prev = animation->animation_track_get_key_animation(track, key); + undo_redo->add_do_method(animation.ptr(), "animation_track_set_key_animation", track, key, anim_name); + undo_redo->add_undo_method(animation.ptr(), "animation_track_set_key_animation", track, key, prev); + update_obj = true; + } + } break; + } + } + } + + if (setting) { + + if (update_obj) { + undo_redo->add_do_method(this, "_update_obj", animation); + undo_redo->add_undo_method(this, "_update_obj", animation); + } + + undo_redo->commit_action(); + setting = false; + + if (change_notify_deserved) + notify_change(); + + return true; + } + + return false; + } + + bool _get(const StringName &p_name, Variant &r_ret) const { + + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + int key = animation->track_find_key(track, key_ofs, true); + ERR_CONTINUE(key == -1); + + String name = p_name; + if (name == "time") { + r_ret = key_ofs; + return true; + } + + if (name == "frame") { + + float fps = animation->get_step(); + if (fps > 0) { + fps = 1.0 / fps; + } + r_ret = key_ofs * fps; + return true; + } + + if (name == "easing") { + r_ret = animation->track_get_key_transition(track, key); + return true; + } + + switch (animation->track_get_type(track)) { + + case Animation::TYPE_TRANSFORM: { + + Dictionary d = animation->track_get_key_value(track, key); + ERR_FAIL_COND_V(!d.has(name), false); + r_ret = d[p_name]; + return true; + + } break; + case Animation::TYPE_VALUE: { + + if (name == "value") { + r_ret = animation->track_get_key_value(track, key); + return true; + } + + } break; + case Animation::TYPE_METHOD: { + + Dictionary d = animation->track_get_key_value(track, key); + + if (name == "name") { + + ERR_FAIL_COND_V(!d.has("method"), false); + r_ret = d["method"]; + return true; + } + + ERR_FAIL_COND_V(!d.has("args"), false); + + Vector<Variant> args = d["args"]; + + if (name == "arg_count") { + + r_ret = args.size(); + return true; + } + + if (name.begins_with("args/")) { + + int idx = name.get_slice("/", 1).to_int(); + ERR_FAIL_INDEX_V(idx, args.size(), false); + + String what = name.get_slice("/", 2); + if (what == "type") { + r_ret = args[idx].get_type(); + return true; + } + + if (what == "value") { + r_ret = args[idx]; + return true; + } + } + + } break; + case Animation::TYPE_BEZIER: { + + if (name == "value") { + r_ret = animation->bezier_track_get_key_value(track, key); + return true; + } + + if (name == "in_handle") { + r_ret = animation->bezier_track_get_key_in_handle(track, key); + return true; + } + + if (name == "out_handle") { + r_ret = animation->bezier_track_get_key_out_handle(track, key); + return true; + } + + } break; + case Animation::TYPE_AUDIO: { + + if (name == "stream") { + r_ret = animation->audio_track_get_key_stream(track, key); + return true; + } + + if (name == "start_offset") { + r_ret = animation->audio_track_get_key_start_offset(track, key); + return true; + } + + if (name == "end_offset") { + r_ret = animation->audio_track_get_key_end_offset(track, key); + return true; + } + + } break; + case Animation::TYPE_ANIMATION: { + + if (name == "animation") { + r_ret = animation->animation_track_get_key_animation(track, key); + return true; + } + + } break; + } + } + } + + return false; + } + void _get_property_list(List<PropertyInfo> *p_list) const { + + if (animation.is_null()) + return; + + int first_track = -1; + float first_key = -1.0; + + bool show_time = true; + bool same_track_type = true; + bool same_key_type = true; + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + ERR_FAIL_INDEX(track, animation->get_track_count()); + + if (first_track < 0) + first_track = track; + + if (show_time && E->value().size() > 1) + show_time = false; + + if (same_track_type) { + + if (animation->track_get_type(first_track) != animation->track_get_type(track)) { + same_track_type = false; + same_key_type = false; + } + + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + int key = animation->track_find_key(track, F->get(), true); + ERR_FAIL_COND(key == -1); + if (first_key < 0) + first_key = key; + + if (animation->track_get_key_value(first_track, first_key).get_type() != animation->track_get_key_value(track, key).get_type()) + same_key_type = false; + } + } + } + + if (show_time) { + + if (use_fps && animation->get_step() > 0) { + float max_frame = animation->get_length() / animation->get_step(); + p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1")); + } else { + p_list->push_back(PropertyInfo(Variant::REAL, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01")); + } + } + + if (same_track_type) { + switch (animation->track_get_type(first_track)) { + + case Animation::TYPE_TRANSFORM: { + + p_list->push_back(PropertyInfo(Variant::VECTOR3, "location")); + p_list->push_back(PropertyInfo(Variant::QUAT, "rotation")); + p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale")); + } break; + case Animation::TYPE_VALUE: { + + if (!same_key_type) + break; + + Variant v = animation->track_get_key_value(first_track, first_key); + + if (hint.type != Variant::NIL) { + + PropertyInfo pi = hint; + pi.name = "value"; + p_list->push_back(pi); + } else { + + PropertyHint hint = PROPERTY_HINT_NONE; + String hint_string; + + if (v.get_type() == Variant::OBJECT) { + //could actually check the object property if exists..? yes i will! + Ref<Resource> res = v; + if (res.is_valid()) { + + hint = PROPERTY_HINT_RESOURCE_TYPE; + hint_string = res->get_class(); + } + } + + if (v.get_type() != Variant::NIL) + p_list->push_back(PropertyInfo(v.get_type(), "value", hint, hint_string)); + } + + p_list->push_back(PropertyInfo(Variant::REAL, "easing", PROPERTY_HINT_EXP_EASING)); + } break; + case Animation::TYPE_METHOD: { + + p_list->push_back(PropertyInfo(Variant::STRING, "name")); + p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1")); + + Dictionary d = animation->track_get_key_value(first_track, first_key); + ERR_FAIL_COND(!d.has("args")); + Vector<Variant> args = d["args"]; + String vtypes; + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + + if (i > 0) + vtypes += ","; + vtypes += Variant::get_type_name(Variant::Type(i)); + } + + for (int i = 0; i < args.size(); i++) { + + p_list->push_back(PropertyInfo(Variant::INT, "args/" + itos(i) + "/type", PROPERTY_HINT_ENUM, vtypes)); + if (args[i].get_type() != Variant::NIL) + p_list->push_back(PropertyInfo(args[i].get_type(), "args/" + itos(i) + "/value")); + } + } break; + case Animation::TYPE_BEZIER: { + + p_list->push_back(PropertyInfo(Variant::REAL, "value")); + p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle")); + p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle")); + } break; + case Animation::TYPE_AUDIO: { + + p_list->push_back(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream")); + p_list->push_back(PropertyInfo(Variant::REAL, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater")); + p_list->push_back(PropertyInfo(Variant::REAL, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater")); + } break; + case Animation::TYPE_ANIMATION: { + + if (key_ofs_map.size() > 1) + break; + + String animations; + + if (root_path && root_path->has_node(animation->track_get_path(first_track))) { + + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(root_path->get_node(animation->track_get_path(first_track))); + if (ap) { + List<StringName> anims; + ap->get_animation_list(&anims); + for (List<StringName>::Element *G = anims.front(); G; G = G->next()) { + if (animations != String()) { + animations += ","; + } + + animations += String(G->get()); + } + } + } + + if (animations != String()) { + animations += ","; + } + animations += "[stop]"; + + p_list->push_back(PropertyInfo(Variant::STRING, "animation", PROPERTY_HINT_ENUM, animations)); + } break; + } + } + } + + Ref<Animation> animation; + + Map<int, List<float> > key_ofs_map; + Map<int, NodePath> base_map; + PropertyInfo hint; + + Node *root_path; + + bool use_fps; + + UndoRedo *undo_redo; + + void notify_change() { + + _change_notify(); + } + + Node *get_root_path() { + return root_path; + } + + void set_use_fps(bool p_enable) { + use_fps = p_enable; + _change_notify(); + } + + AnimationMultiTrackKeyEdit() { + use_fps = false; + setting = false; + root_path = NULL; + } +}; + void AnimationTimelineEdit::_zoom_changed(double) { update(); @@ -4133,12 +4835,19 @@ void AnimationTrackEditor::_clear_key_edit() { } #else //if key edit is the object being inspected, remove it first - if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == key_edit) { + if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == key_edit || + EditorNode::get_singleton()->get_inspector()->get_edited_object() == multi_key_edit) { EditorNode::get_singleton()->push_item(NULL); } + //then actually delete it - memdelete(key_edit); - key_edit = NULL; + if (key_edit) { + memdelete(key_edit); + key_edit = NULL; + } else if (multi_key_edit) { + memdelete(multi_key_edit); + multi_key_edit = NULL; + } #endif } } @@ -4156,38 +4865,70 @@ void AnimationTrackEditor::_update_key_edit() { _clear_key_edit(); if (!animation.is_valid()) return; - if (selection.size() != 1) { - return; - } - key_edit = memnew(AnimationTrackKeyEdit); - key_edit->animation = animation; - key_edit->track = selection.front()->key().track; - key_edit->use_fps = timeline->is_using_fps(); + if (selection.size() == 1) { + + key_edit = memnew(AnimationTrackKeyEdit); + key_edit->animation = animation; + key_edit->track = selection.front()->key().track; + key_edit->use_fps = timeline->is_using_fps(); + + float ofs = animation->track_get_key_time(key_edit->track, selection.front()->key().key); + key_edit->key_ofs = ofs; + key_edit->root_path = root; + + NodePath np; + key_edit->hint = _find_hint_for_track(key_edit->track, np); + key_edit->undo_redo = undo_redo; + key_edit->base = np; - float ofs = animation->track_get_key_time(key_edit->track, selection.front()->key().key); - key_edit->key_ofs = ofs; - key_edit->root_path = root; + EditorNode::get_singleton()->push_item(key_edit); + } else if (selection.size() > 1) { - NodePath np; - key_edit->hint = _find_hint_for_track(key_edit->track, np); - key_edit->undo_redo = undo_redo; - key_edit->base = np; + multi_key_edit = memnew(AnimationMultiTrackKeyEdit); + multi_key_edit->animation = animation; - EditorNode::get_singleton()->push_item(key_edit); + Map<int, List<float> > key_ofs_map; + Map<int, NodePath> base_map; + int first_track = -1; + for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) { + + int track = E->key().track; + if (first_track < 0) + first_track = track; + + if (!key_ofs_map.has(track)) { + key_ofs_map[track] = List<float>(); + base_map[track] = *memnew(NodePath); + } + + key_ofs_map[track].push_back(animation->track_get_key_time(track, E->key().key)); + } + multi_key_edit->key_ofs_map = key_ofs_map; + multi_key_edit->base_map = base_map; + multi_key_edit->hint = _find_hint_for_track(first_track, base_map[first_track]); + + multi_key_edit->use_fps = timeline->is_using_fps(); + + multi_key_edit->root_path = root; + + multi_key_edit->undo_redo = undo_redo; + + EditorNode::get_singleton()->push_item(multi_key_edit); + } } void AnimationTrackEditor::_clear_selection_for_anim(const Ref<Animation> &p_anim) { - if (!(animation == p_anim)) + if (animation != p_anim) return; - //selection.clear(); + _clear_selection(); } void AnimationTrackEditor::_select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos) { - if (!(animation == p_anim)) + if (animation != p_anim) return; int idx = animation->track_find_key(p_track, p_pos, true); @@ -4209,12 +4950,12 @@ void AnimationTrackEditor::_move_selection_commit() { List<_AnimMoveRestore> to_restore; float motion = moving_selection_offset; - // 1-remove the keys + // 1 - remove the keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key); } - // 2- remove overlapped keys + // 2 - remove overlapped keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newtime = snap_time(E->get().pos + motion); @@ -4238,35 +4979,27 @@ void AnimationTrackEditor::_move_selection_commit() { to_restore.push_back(amr); } - // 3-move the keys (re insert them) + // 3 - move the keys (re insert them) for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newpos = snap_time(E->get().pos + motion); - /* - if (newpos<0) - continue; //no add at the beginning - */ undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->key().track, newpos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key)); } - // 4-(undo) remove inserted keys + // 4 - (undo) remove inserted keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newpos = snap_time(E->get().pos + motion); - /* - if (newpos<0) - continue; //no remove what no inserted - */ undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newpos); } - // 5-(undo) reinsert keys + // 5 - (undo) reinsert keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->key().track, E->get().pos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key)); } - // 6-(undo) reinsert overlapped keys + // 6 - (undo) reinsert overlapped keys for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) { _AnimMoveRestore &amr = E->get(); @@ -4276,12 +5009,12 @@ void AnimationTrackEditor::_move_selection_commit() { undo_redo->add_do_method(this, "_clear_selection_for_anim", animation); undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - // 7-reselect + // 7 - reselect for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float oldpos = E->get().pos; float newpos = snap_time(oldpos + motion); - //if (newpos>=0) + undo_redo->add_do_method(this, "_select_at_anim", animation, E->key().track, newpos); undo_redo->add_undo_method(this, "_select_at_anim", animation, E->key().track, oldpos); } diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 8dc2304a95..9e16f2faf7 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -246,6 +246,7 @@ public: }; class AnimationTrackKeyEdit; +class AnimationMultiTrackKeyEdit; class AnimationBezierTrackEdit; class AnimationTrackEditGroup : public Control { @@ -415,6 +416,7 @@ class AnimationTrackEditor : public VBoxContainer { void _move_selection_cancel(); AnimationTrackKeyEdit *key_edit; + AnimationMultiTrackKeyEdit *multi_key_edit; void _update_key_edit(); void _clear_key_edit(); diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp index 6f09e73fab..5b8c8fffb8 100644 --- a/editor/doc/doc_data.cpp +++ b/editor/doc/doc_data.cpp @@ -741,10 +741,9 @@ Error DocData::load_classes(const String &p_dir) { da->list_dir_begin(); String path; - bool isdir; - path = da->get_next(&isdir); + path = da->get_next(); while (path != String()) { - if (!isdir && path.ends_with("xml")) { + if (!da->current_is_dir() && path.ends_with("xml")) { Ref<XMLParser> parser = memnew(XMLParser); Error err2 = parser->open(p_dir.plus_file(path)); if (err2) @@ -752,7 +751,7 @@ Error DocData::load_classes(const String &p_dir) { _load(parser); } - path = da->get_next(&isdir); + path = da->get_next(); } da->list_dir_end(); @@ -771,13 +770,12 @@ Error DocData::erase_classes(const String &p_dir) { da->list_dir_begin(); String path; - bool isdir; - path = da->get_next(&isdir); + path = da->get_next(); while (path != String()) { - if (!isdir && path.ends_with("xml")) { + if (!da->current_is_dir() && path.ends_with("xml")) { to_erase.push_back(path); } - path = da->get_next(&isdir); + path = da->get_next(); } da->list_dir_end(); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 24c5a788b6..1f43740858 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "editor_file_dialog.h" + #include "core/os/file_access.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -679,7 +680,12 @@ void EditorFileDialog::update_file_name() { String filter_str = filters[idx]; String file_str = file->get_text(); String base_name = file_str.get_basename(); - file_str = base_name + "." + filter_str.split(";")[1].strip_edges().to_lower(); + Vector<String> filter_substr = filter_str.split(";"); + if (filter_substr.size() >= 2) { + file_str = base_name + "." + filter_substr[1].strip_edges().to_lower(); + } else { + file_str = base_name + "." + filter_str.get_extension().strip_edges().to_lower(); + } file->set_text(file_str); } } @@ -731,19 +737,15 @@ void EditorFileDialog::update_file_list() { List<String> files; List<String> dirs; - bool is_dir; - bool is_hidden; String item; - while ((item = dir_access->get_next(&is_dir)) != "") { + while ((item = dir_access->get_next()) != "") { if (item == "." || item == "..") continue; - is_hidden = dir_access->current_is_hidden(); - - if (show_hidden_files || !is_hidden) { - if (!is_dir) + if (show_hidden_files || !dir_access->current_is_hidden()) { + if (!dir_access->current_is_dir()) files.push_back(item); else dirs.push_back(item); @@ -1507,9 +1509,9 @@ EditorFileDialog::EditorFileDialog() { HBoxContainer *pathhb = memnew(HBoxContainer); dir_prev = memnew(ToolButton); - dir_prev->set_tooltip(TTR("Previous Folder")); + dir_prev->set_tooltip(TTR("Go to previous folder.")); dir_next = memnew(ToolButton); - dir_next->set_tooltip(TTR("Next Folder")); + dir_next->set_tooltip(TTR("Go to next folder.")); dir_up = memnew(ToolButton); dir_up->set_tooltip(TTR("Go to parent folder.")); @@ -1528,7 +1530,7 @@ EditorFileDialog::EditorFileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); - refresh->set_tooltip(TTR("Refresh")); + refresh->set_tooltip(TTR("Refresh files.")); refresh->connect("pressed", this, "_update_file_list"); pathhb->add_child(refresh); @@ -1541,7 +1543,7 @@ EditorFileDialog::EditorFileDialog() { show_hidden = memnew(ToolButton); show_hidden->set_toggle_mode(true); show_hidden->set_pressed(is_showing_hidden_files()); - show_hidden->set_tooltip(TTR("Toggle visibility of hidden files.")); + show_hidden->set_tooltip(TTR("Toggle the visibility of hidden files.")); show_hidden->connect("toggled", this, "set_show_hidden_files"); pathhb->add_child(show_hidden); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 87a37acac6..be3df2815e 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -673,12 +673,11 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess da->list_dir_begin(); while (true) { - bool isdir; - String f = da->get_next(&isdir); + String f = da->get_next(); if (f == "") break; - if (isdir) { + if (da->current_is_dir()) { if (f.begins_with(".")) //ignore hidden and . / .. continue; @@ -870,12 +869,11 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const da->list_dir_begin(); while (true) { - bool isdir; - String f = da->get_next(&isdir); + String f = da->get_next(); if (f == "") break; - if (isdir) { + if (da->current_is_dir()) { if (f.begins_with(".")) //ignore hidden and . / .. continue; diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 40ecffbb3b..73438ffc0c 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -93,8 +93,8 @@ void editor_register_fonts(Ref<Theme> p_theme) { /* Custom font */ - bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/main_font_antialiased"); - DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/main_font_hinting"); + bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased"); + DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/font_hinting"); String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font"); Ref<DynamicFontData> CustomFont; @@ -125,13 +125,11 @@ void editor_register_fonts(Ref<Theme> p_theme) { /* Custom source code font */ String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font"); - bool font_source_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/code_font_antialiased"); - DynamicFontData::Hinting font_source_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/code_font_hinting"); Ref<DynamicFontData> CustomFontSource; if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) { CustomFontSource.instance(); - CustomFontSource->set_antialiased(font_source_antialiased); - CustomFontSource->set_hinting(font_source_hinting); + CustomFontSource->set_antialiased(font_antialiased); + CustomFontSource->set_hinting(font_hinting); CustomFontSource->set_font_path(custom_font_path_source); } else { EditorSettings::get_singleton()->set_manually("interface/editor/code_font", ""); @@ -201,8 +199,8 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<DynamicFontData> dfmono; dfmono.instance(); - dfmono->set_antialiased(font_source_antialiased); - dfmono->set_hinting(font_source_hinting); + dfmono->set_antialiased(font_antialiased); + dfmono->set_hinting(font_hinting); dfmono->set_font_ptr(_font_Hack_Regular, _font_Hack_Regular_size); int default_font_size = int(EDITOR_GET("interface/editor/main_font_size")) * EDSCALE; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index e4ddf44bc4..70bbd0fd6c 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -504,7 +504,7 @@ bool EditorProperty::use_keying_next() const { PropertyInfo &p = I->get(); if (p.name == property) { - return p.hint == PROPERTY_HINT_SPRITE_FRAME; + return (p.usage & PROPERTY_USAGE_KEYING_INCREMENTS); } } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index b59d42a5f7..2cbe408828 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -397,6 +397,8 @@ void EditorNode::_notification(int p_what) { distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons")); scene_tab_add->set_icon(gui_base->get_icon("Add", "EditorIcons")); + bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); + // clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons")); dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons")); @@ -1963,6 +1965,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { break; opening_prev = true; open_request(previous_scenes.back()->get()); + previous_scenes.pop_back(); } break; case FILE_CLOSE_OTHERS: @@ -2488,12 +2491,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { screenshot_timer->start(); } break; - case EDITOR_OPEN_SCREENSHOT: { - - bool is_checked = settings_menu->get_popup()->is_item_checked(settings_menu->get_popup()->get_item_index(EDITOR_OPEN_SCREENSHOT)); - settings_menu->get_popup()->set_item_checked(settings_menu->get_popup()->get_item_index(EDITOR_OPEN_SCREENSHOT), !is_checked); - EditorSettings::get_singleton()->set_project_metadata("screenshot_options", "open_screenshot", !is_checked); - } break; case SETTINGS_PICK_MAIN_SCENE: { file->set_mode(EditorFileDialog::MODE_OPEN_FILE); @@ -2553,7 +2550,7 @@ void EditorNode::_screenshot(bool p_use_utc) { String name = "editor_screenshot_" + OS::get_singleton()->get_iso_date_time(p_use_utc).replace(":", "") + ".png"; NodePath path = String("user://") + name; _save_screenshot(path); - if (EditorSettings::get_singleton()->get_project_metadata("screenshot_options", "open_screenshot", true)) { + if (EditorSettings::get_singleton()->get("interface/editor/automatically_open_screenshots")) { OS::get_singleton()->shell_open(String("file://") + ProjectSettings::get_singleton()->globalize_path(path)); } } @@ -2621,7 +2618,7 @@ void EditorNode::_exit_editor() { // Dim the editor window while it's quitting to make it clearer that it's busy. // No transition is applied, as the effect needs to be visible immediately - float c = 1.0f - float(EDITOR_GET("interface/editor/dim_amount")); + float c = 0.4f; Color dim_color = Color(c, c, c); gui_base->set_modulate(dim_color); @@ -2640,6 +2637,12 @@ void EditorNode::_discard_changes(const String &p_str) { case FILE_CLOSE_ALL: case SCENE_TAB_CLOSE: { + Node *scene = editor_data.get_edited_scene_root(tab_closing); + if (scene != NULL) { + String scene_filename = scene->get_filename(); + previous_scenes.push_back(scene_filename); + } + _remove_scene(tab_closing); _update_scene_tabs(); @@ -2705,6 +2708,21 @@ void EditorNode::_update_debug_options() { if (check_reload_scripts) _menu_option_confirm(RUN_RELOAD_SCRIPTS, true); } +void EditorNode::_update_file_menu_opened() { + + Ref<ShortCut> close_scene_sc = ED_GET_SHORTCUT("editor/close_scene"); + close_scene_sc->set_name(TTR("Close Scene")); + Ref<ShortCut> reopen_closed_scene_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene"); + reopen_closed_scene_sc->set_name(TTR("Reopen Closed Scene")); + PopupMenu *pop = file_menu->get_popup(); + pop->set_item_disabled(pop->get_item_index(FILE_OPEN_PREV), previous_scenes.empty()); +} + +void EditorNode::_update_file_menu_closed() { + PopupMenu *pop = file_menu->get_popup(); + pop->set_item_disabled(pop->get_item_index(FILE_OPEN_PREV), false); +} + Control *EditorNode::get_viewport() { return viewport; @@ -3277,6 +3295,13 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b void EditorNode::open_request(const String &p_path) { + if (!opening_prev) { + List<String>::Element *prev_scene = previous_scenes.find(p_path); + if (prev_scene != NULL) { + prev_scene->erase(); + } + } + load_scene(p_path); // as it will be opened in separate tab } @@ -4477,8 +4502,17 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { scene_tabs_context_menu->add_separator(); scene_tabs_context_menu->add_item(TTR("Show in FileSystem"), FILE_SHOW_IN_FILESYSTEM); scene_tabs_context_menu->add_item(TTR("Play This Scene"), RUN_PLAY_SCENE); + scene_tabs_context_menu->add_separator(); - scene_tabs_context_menu->add_item(TTR("Close Tab"), FILE_CLOSE); + Ref<ShortCut> close_tab_sc = ED_GET_SHORTCUT("editor/close_scene"); + close_tab_sc->set_name(TTR("Close Tab")); + scene_tabs_context_menu->add_shortcut(close_tab_sc, FILE_CLOSE); + Ref<ShortCut> undo_close_tab_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene"); + undo_close_tab_sc->set_name(TTR("Undo Close Tab")); + scene_tabs_context_menu->add_shortcut(undo_close_tab_sc, FILE_OPEN_PREV); + if (previous_scenes.empty()) { + scene_tabs_context_menu->set_item_disabled(scene_tabs_context_menu->get_item_index(FILE_OPEN_PREV), true); + } scene_tabs_context_menu->add_item(TTR("Close Other Tabs"), FILE_CLOSE_OTHERS); scene_tabs_context_menu->add_item(TTR("Close Tabs to the Right"), FILE_CLOSE_RIGHT); scene_tabs_context_menu->add_item(TTR("Close All Tabs"), FILE_CLOSE_ALL); @@ -5057,9 +5091,8 @@ void EditorNode::_start_dimming(bool p_dimming) { void EditorNode::_dim_timeout() { _dim_time += _dim_timer->get_wait_time(); - float wait_time = EditorSettings::get_singleton()->get("interface/editor/dim_transition_time"); - - float c = 1.0f - (float)EditorSettings::get_singleton()->get("interface/editor/dim_amount"); + float wait_time = 0.08f; + float c = 0.4f; Color base = _dimming ? Color(1, 1, 1) : Color(c, c, c); Color final = _dimming ? Color(c, c, c) : Color(1, 1, 1); @@ -5100,18 +5133,12 @@ Vector<Ref<EditorResourceConversionPlugin> > EditorNode::find_resource_conversio void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { - if (p_pressed) { - top_split->hide(); - bottom_panel_raise->set_icon(gui_base->get_icon("ShrinkBottomDock", "EditorIcons")); - } else { - top_split->show(); - bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); - } + top_split->set_visible(!p_pressed); } void EditorNode::_update_video_driver_color() { - //todo probably should de-harcode this and add to editor settings + // TODO: Probably should de-hardcode this and add to editor settings. if (video_driver->get_text() == "GLES2") { video_driver->add_color_override("font_color", Color::hex(0x5586a4ff)); } else if (video_driver->get_text() == "GLES3") { @@ -5196,6 +5223,8 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed); ClassDB::bind_method("edit_node", &EditorNode::edit_node); ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input); + ClassDB::bind_method("_update_file_menu_opened", &EditorNode::_update_file_menu_opened); + ClassDB::bind_method("_update_file_menu_closed", &EditorNode::_update_file_menu_closed); ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false)); @@ -5563,6 +5592,8 @@ EditorNode::EditorNode() { EDITOR_DEF_RST("interface/scene_tabs/restore_scenes_on_load", false); EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true); EDITOR_DEF_RST("interface/inspector/capitalize_properties", true); + EDITOR_DEF_RST("interface/inspector/default_float_step", 0.001); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "interface/inspector/default_float_step", PROPERTY_HINT_EXP_RANGE, "0,1,0")); 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); @@ -5870,6 +5901,7 @@ EditorNode::EditorNode() { PopupMenu *p; file_menu->set_tooltip(TTR("Operations with scene files.")); + p = file_menu->get_popup(); p->set_hide_on_window_lose_focus(true); p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE); @@ -5883,6 +5915,7 @@ EditorNode::EditorNode() { p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE); p->add_separator(); p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT); + p->add_shortcut(ED_SHORTCUT("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV); p->add_separator(); p->add_shortcut(ED_SHORTCUT("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN); p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCENE); @@ -6000,16 +6033,13 @@ EditorNode::EditorNode() { p->add_child(editor_layouts); editor_layouts->connect("id_pressed", this, "_layout_menu_option"); p->add_submenu_item(TTR("Editor Layout"), "Layouts"); + p->add_separator(); #ifdef OSX_ENABLED p->add_shortcut(ED_SHORTCUT("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CMD | KEY_F12), EDITOR_SCREENSHOT); #else p->add_shortcut(ED_SHORTCUT("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CTRL | KEY_F12), EDITOR_SCREENSHOT); #endif p->set_item_tooltip(p->get_item_count() - 1, TTR("Screenshots are stored in the Editor Data/Settings Folder.")); - p->add_check_shortcut(ED_SHORTCUT("editor/open_screenshot", TTR("Automatically Open Screenshots")), EDITOR_OPEN_SCREENSHOT); - bool is_open_screenshot = EditorSettings::get_singleton()->get_project_metadata("screenshot_options", "open_screenshot", true); - p->set_item_checked(p->get_item_count() - 1, is_open_screenshot); - p->set_item_tooltip(p->get_item_count() - 1, TTR("Open in an external image editor.")); #ifdef OSX_ENABLED p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F), SETTINGS_TOGGLE_FULLSCREEN); #else @@ -6262,6 +6292,13 @@ EditorNode::EditorNode() { bottom_panel_hb_editors = memnew(HBoxContainer); bottom_panel_hb_editors->set_h_size_flags(Control::SIZE_EXPAND_FILL); bottom_panel_hb->add_child(bottom_panel_hb_editors); + + version_label = memnew(Label); + version_label->set_text(VERSION_FULL_CONFIG); + // Fade out the version label to be less prominent, but still readable + version_label->set_self_modulate(Color(1, 1, 1, 0.6)); + bottom_panel_hb->add_child(version_label); + bottom_panel_raise = memnew(ToolButton); bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); @@ -6358,6 +6395,8 @@ EditorNode::EditorNode() { file_script->connect("file_selected", this, "_dialog_action"); file_menu->get_popup()->connect("id_pressed", this, "_menu_option"); + file_menu->connect("about_to_show", this, "_update_file_menu_opened"); + file_menu->get_popup()->connect("popup_hide", this, "_update_file_menu_closed"); settings_menu->get_popup()->connect("id_pressed", this, "_menu_option"); diff --git a/editor/editor_node.h b/editor/editor_node.h index 9aee19e6c1..75827cc65f 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -431,6 +431,7 @@ private: HBoxContainer *bottom_panel_hb; HBoxContainer *bottom_panel_hb_editors; VBoxContainer *bottom_panel_vb; + Label *version_label; ToolButton *bottom_panel_raise; void _bottom_panel_raise_toggled(bool); @@ -460,6 +461,8 @@ private: void _tool_menu_option(int p_idx); void _update_debug_options(); + void _update_file_menu_opened(); + void _update_file_menu_closed(); void _on_plugin_ready(Object *p_script, const String &p_activate_name); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index d54f72382c..3300228921 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -2904,6 +2904,8 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) { bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { + float default_float_step = EDITOR_GET("interface/inspector/default_float_step"); + switch (p_type) { // atomic types @@ -3010,7 +3012,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } else { EditorPropertyFloat *editor = memnew(EditorPropertyFloat); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; bool exp_range = false; bool greater = true, lesser = true; @@ -3107,7 +3109,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ case Variant::VECTOR2: { EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3125,7 +3127,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; // 5 case Variant::RECT2: { EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3142,7 +3144,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::VECTOR3: { EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3160,7 +3162,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3178,7 +3180,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::PLANE: { EditorPropertyPlane *editor = memnew(EditorPropertyPlane); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3195,7 +3197,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::QUAT: { EditorPropertyQuat *editor = memnew(EditorPropertyQuat); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3212,7 +3214,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; // 10 case Variant::AABB: { EditorPropertyAABB *editor = memnew(EditorPropertyAABB); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3229,7 +3231,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::BASIS: { EditorPropertyBasis *editor = memnew(EditorPropertyBasis); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3246,7 +3248,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::TRANSFORM: { EditorPropertyTransform *editor = memnew(EditorPropertyTransform); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 223ca7a108..45000517cb 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -321,30 +321,24 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/editor/custom_display_scale"] = PropertyInfo(Variant::REAL, "interface/editor/custom_display_scale", PROPERTY_HINT_RANGE, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); _initial_set("interface/editor/main_font_size", 14); hints["interface/editor/main_font_size"] = PropertyInfo(Variant::INT, "interface/editor/main_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); - _initial_set("interface/editor/main_font_antialiased", true); - _initial_set("interface/editor/main_font_hinting", 2); - hints["interface/editor/main_font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/main_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); + _initial_set("interface/editor/code_font_size", 14); + hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT); + _initial_set("interface/editor/font_antialiased", true); + _initial_set("interface/editor/font_hinting", 2); + hints["interface/editor/font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/main_font", ""); hints["interface/editor/main_font"] = PropertyInfo(Variant::STRING, "interface/editor/main_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/main_font_bold", ""); hints["interface/editor/main_font_bold"] = PropertyInfo(Variant::STRING, "interface/editor/main_font_bold", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/code_font_size", 14); - hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/code_font_antialiased", true); - _initial_set("interface/editor/code_font_hinting", 2); - hints["interface/editor/code_font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/code_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/code_font", ""); hints["interface/editor/code_font"] = PropertyInfo(Variant::STRING, "interface/editor/code_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/dim_editor_on_dialog_popup", true); - _initial_set("interface/editor/dim_amount", 0.6f); - hints["interface/editor/dim_amount"] = PropertyInfo(Variant::REAL, "interface/editor/dim_amount", PROPERTY_HINT_RANGE, "0,1,0.01", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/dim_transition_time", 0.08f); - hints["interface/editor/dim_transition_time"] = PropertyInfo(Variant::REAL, "interface/editor/dim_transition_time", PROPERTY_HINT_RANGE, "0,1,0.001", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/low_processor_mode_sleep_usec", 6900); // ~144 FPS hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/unfocused_low_processor_mode_sleep_usec", 50000); // 20 FPS hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/separate_distraction_mode", false); + _initial_set("interface/editor/automatically_open_screenshots", true); _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression _initial_set("interface/editor/quit_confirmation", true); @@ -617,7 +611,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { /* Extra config */ _initial_set("project_manager/sorting_order", 0); - hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Last Modified"); + hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Path,Last Modified"); if (p_extra_config.is_valid()) { diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index dcb106899e..9966394025 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -38,9 +38,9 @@ String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const { } String EditorSpinSlider::get_text_value() const { - int zeros = Math::step_decimals(get_step()); - return String::num(get_value(), zeros); + return String::num(get_value(), Math::range_step_decimals(get_step())); } + void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { if (read_only) diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index bd61e6182c..ecfad4d146 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -52,18 +52,16 @@ void ExportTemplateManager::_update_template_list() { DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); Error err = d->change_dir(EditorSettings::get_singleton()->get_templates_dir()); - d->list_dir_begin(); Set<String> templates; - + d->list_dir_begin(); if (err == OK) { - bool isdir; - String c = d->get_next(&isdir); + String c = d->get_next(); while (c != String()) { - if (isdir && !c.begins_with(".")) { + if (d->current_is_dir() && !c.begins_with(".")) { templates.insert(c); } - c = d->get_next(&isdir); + c = d->get_next(); } } d->list_dir_end(); @@ -154,18 +152,14 @@ void ExportTemplateManager::_uninstall_template_confirm() { ERR_FAIL_COND(err != OK); Vector<String> files; - d->list_dir_begin(); - - bool isdir; - String c = d->get_next(&isdir); + String c = d->get_next(); while (c != String()) { - if (!isdir) { + if (!d->current_is_dir()) { files.push_back(c); } - c = d->get_next(&isdir); + c = d->get_next(); } - d->list_dir_end(); for (int i = 0; i < files.size(); i++) { diff --git a/editor/icons/icon_point_mesh.svg b/editor/icons/icon_point_mesh.svg new file mode 100644 index 0000000000..8da7759daf --- /dev/null +++ b/editor/icons/icon_point_mesh.svg @@ -0,0 +1,7 @@ +<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"> +<g fill="#ffd684" stroke="#000" stroke-dasharray="null" stroke-linecap="null" stroke-linejoin="null" stroke-opacity="0" stroke-width="0"> +<ellipse cx="3.7237" cy="3.0268" rx="2.0114" ry="1.9956"/> +<ellipse cx="11.717" cy="6.1734" rx="2.0114" ry="1.9956"/> +<ellipse cx="6.5219" cy="12.477" rx="2.0114" ry="1.9956"/> +</g> +</svg> diff --git a/editor/icons/icon_shrink_bottom_dock.svg b/editor/icons/icon_shrink_bottom_dock.svg deleted file mode 100644 index c1e8c1bfdb..0000000000 --- a/editor/icons/icon_shrink_bottom_dock.svg +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - version="1.1" - viewBox="0 0 16 16" - id="svg6" - sodipodi:docname="icon_shrink_bottom_dock.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"> - <metadata - id="metadata12"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs10" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1853" - inkscape:window-height="1016" - id="namedview8" - showgrid="false" - inkscape:zoom="20.85965" - inkscape:cx="9.4509357" - inkscape:cy="6.016355" - inkscape:window-x="67" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg6" /> - <path - style="fill:#e0e0e0" - d="M 11.907447,9.9752038 15.442981,6.4396699 H 12.907296 V 1.4659528 h -1.999839 l 0,4.9737171 -2.5356852,0 3.5355342,3.5355339 z" - id="path829" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccc" /> - <path - inkscape:connector-curvature="0" - id="path831" - d="M 4.2131662,9.8793249 7.7487004,6.343791 H 5.2130152 V 1.3700738 H 3.2131762 V 6.343791 h -2.535685 l 3.535534,3.5355339 z" - style="fill:#e0e0e0" - sodipodi:nodetypes="ccccccccc" /> - <rect - style="fill:#e0e0e0;fill-opacity:1" - id="rect855" - width="14" - height="1.8305085" - x="-14.832336" - y="-13.121187" - transform="scale(-1)" /> -</svg> diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index e152827c63..1c4a8c43a9 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -1175,35 +1175,33 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres morph = &collada.state.morph_controller_data_map[ngsource]; meshid = morph->mesh; - Vector<String> targets; - - morph->targets.has("MORPH_TARGET"); - String target = morph->targets["MORPH_TARGET"]; - bool valid = false; - if (morph->sources.has(target)) { - valid = true; - Vector<String> names = morph->sources[target].sarray; - for (int i = 0; i < names.size(); i++) { - - String meshid2 = names[i]; - if (collada.state.mesh_data_map.has(meshid2)) { - Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); - const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid2]; - mesh->set_name(meshdata.name); - Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false); - ERR_FAIL_COND_V(err, err); - - morphs.push_back(mesh); - } else { - valid = false; + if (morph->targets.has("MORPH_TARGET")) { + String target = morph->targets["MORPH_TARGET"]; + bool valid = false; + if (morph->sources.has(target)) { + valid = true; + Vector<String> names = morph->sources[target].sarray; + for (int i = 0; i < names.size(); i++) { + + String meshid2 = names[i]; + if (collada.state.mesh_data_map.has(meshid2)) { + Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); + const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid2]; + mesh->set_name(meshdata.name); + Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false); + ERR_FAIL_COND_V(err, err); + + morphs.push_back(mesh); + } else { + valid = false; + } } } - } - - if (!valid) - morphs.clear(); - ngsource = ""; + if (!valid) + morphs.clear(); + ngsource = ""; + } } if (ngsource != "") { diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp index 8246e74814..c9c5b3818f 100644 --- a/editor/import/editor_scene_importer_gltf.cpp +++ b/editor/import/editor_scene_importer_gltf.cpp @@ -986,7 +986,7 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) { Ref<SurfaceTool> st; st.instance(); st->create_from_triangle_arrays(array); - if (p.has("targets")) { + if (!p.has("targets")) { //morph targets should not be reindexed, as array size might differ //removing indices is the best bet here st->deindex(); diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 53b67c46b0..8e6a56a929 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -435,6 +435,7 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> Object::cast_to<Spatial>(sb)->set_transform(Object::cast_to<Spatial>(p_node)->get_transform()); p_node->replace_by(sb); memdelete(p_node); + p_node = NULL; CollisionShape *colshape = memnew(CollisionShape); if (empty_draw_type == "CUBE") { BoxShape *boxShape = memnew(BoxShape); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 19199f37ef..ff134ff2d1 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1058,9 +1058,9 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve return false; } -bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { +bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) { Ref<InputEventMouseButton> b = p_event; - if (b.is_valid()) { + if (b.is_valid() && !p_already_accepted) { bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control(); if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) { @@ -1162,14 +1162,14 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { } Ref<InputEventMagnifyGesture> magnify_gesture = p_event; - if (magnify_gesture.is_valid()) { + if (magnify_gesture.is_valid() && !p_already_accepted) { // Zoom gesture _zoom_on_position(zoom * magnify_gesture->get_factor(), magnify_gesture->get_position()); return true; } Ref<InputEventPanGesture> pan_gesture = p_event; - if (pan_gesture.is_valid()) { + if (pan_gesture.is_valid() && !p_already_accepted) { // Pan gesture const Vector2 delta = (int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom) * pan_gesture->get_delta(); view_offset.x += delta.x; @@ -2268,7 +2268,7 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { } } - accepted = (_gui_input_zoom_or_pan(p_event) || accepted); + accepted = (_gui_input_zoom_or_pan(p_event, accepted) || accepted); if (accepted) accept_event(); @@ -3842,7 +3842,7 @@ void CanvasItemEditor::_zoom_on_position(float p_zoom, Point2 p_position) { } void CanvasItemEditor::_button_zoom_minus() { - _zoom_on_position(zoom / 1.5, viewport_scrollable->get_size() / 2.0); + _zoom_on_position(zoom / Math_SQRT2, viewport_scrollable->get_size() / 2.0); } void CanvasItemEditor::_button_zoom_reset() { @@ -3850,7 +3850,7 @@ void CanvasItemEditor::_button_zoom_reset() { } void CanvasItemEditor::_button_zoom_plus() { - _zoom_on_position(zoom * 1.5, viewport_scrollable->get_size() / 2.0); + _zoom_on_position(zoom * Math_SQRT2, viewport_scrollable->get_size() / 2.0); } void CanvasItemEditor::_button_toggle_snap(bool p_status) { diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 2a85b20424..553ded6b14 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -466,7 +466,7 @@ private: bool _gui_input_resize(const Ref<InputEvent> &p_event); bool _gui_input_rotate(const Ref<InputEvent> &p_event); bool _gui_input_select(const Ref<InputEvent> &p_event); - bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event); + bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted); bool _gui_input_rulers_and_guides(const Ref<InputEvent> &p_event); bool _gui_input_hover(const Ref<InputEvent> &p_event); diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index e582f6ded2..1fc6dae978 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -201,6 +201,8 @@ void MeshLibraryEditor::_import_scene_cbk(const String &p_str) { ERR_FAIL_COND(ps.is_null()); Node *scene = ps->instance(); + ERR_FAIL_COND(!scene); + _import_scene(scene, mesh_library, option == MENU_OPTION_UPDATE_FROM_SCENE); memdelete(scene); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index d999f3189e..9cf889c5b0 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -2088,16 +2088,18 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra } ERR_FAIL_COND_V(!se, false); - bool highlighter_set = false; - for (int i = 0; i < syntax_highlighters_func_count; i++) { - SyntaxHighlighter *highlighter = syntax_highlighters_funcs[i](); - se->add_syntax_highlighter(highlighter); - - if (script != NULL && !highlighter_set) { - List<String> languages = highlighter->get_supported_languages(); - if (languages.find(script->get_language()->get_name())) { - se->set_syntax_highlighter(highlighter); - highlighter_set = true; + if (p_resource->get_class_name() != StringName("VisualScript")) { + bool highlighter_set = false; + for (int i = 0; i < syntax_highlighters_func_count; i++) { + SyntaxHighlighter *highlighter = syntax_highlighters_funcs[i](); + se->add_syntax_highlighter(highlighter); + + if (script != NULL && !highlighter_set) { + List<String> languages = highlighter->get_supported_languages(); + if (languages.find(script->get_language()->get_name())) { + se->set_syntax_highlighter(highlighter); + highlighter_set = true; + } } } } diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 438621115b..07303da2ff 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1819,6 +1819,15 @@ ScriptTextEditor::ScriptTextEditor() { code_editor->get_text_edit()->set_drag_forwarding(this); } +ScriptTextEditor::~ScriptTextEditor() { + for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) { + if (E->get() != NULL) { + memdelete(E->get()); + } + } + highlighters.clear(); +} + static ScriptEditorBase *create_editor(const RES &p_resource) { if (Object::cast_to<Script>(*p_resource)) { diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 9a2a514a6e..4dbade472c 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -231,6 +231,7 @@ public: virtual void validate(); ScriptTextEditor(); + ~ScriptTextEditor(); }; #endif // SCRIPT_TEXT_EDITOR_H diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index b475eee920..630f3ba9e1 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -69,7 +69,7 @@ #define FREELOOK_SPEED_MULTIPLIER 1.08 #define MIN_Z 0.01 -#define MAX_Z 10000 +#define MAX_Z 1000000.0 #define MIN_FOV 0.01 #define MAX_FOV 179 @@ -645,7 +645,7 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_hig Vector3 r; - if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * 10000.0, grabber_pos, grabber_radius, &r)) { + if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) { float d = r.distance_to(ray_pos); if (d < col_d) { col_d = d; @@ -753,7 +753,7 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_hig Vector3 r; - if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * 10000.0, grabber_pos, grabber_radius, &r)) { + if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) { float d = r.distance_to(ray_pos); if (d < col_d) { col_d = d; @@ -1291,6 +1291,8 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { Vector3 ray_pos = _get_ray_pos(m->get_position()); Vector3 ray = _get_ray(m->get_position()); + float snap = EDITOR_GET("interface/inspector/default_float_step"); + int snap_step_decimals = Math::range_step_decimals(snap); switch (_edit.mode) { @@ -1372,18 +1374,14 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Disable local transformation for TRANSFORM_VIEW bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - float snap = 0; if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_scale_snap() / 100; - - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Scaling: ") + motion_snapped); - - } else { - set_message(TTR("Scaling: ") + motion); } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + // This might not be necessary anymore after issue #288 is solved (in 4.0?). + set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { @@ -1502,17 +1500,13 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Disable local transformation for TRANSFORM_VIEW bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - float snap = 0; if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_translate_snap(); - - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Translating: ") + motion_snapped); - } else { - set_message(TTR("Translating: ") + motion); } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { @@ -1601,20 +1595,12 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { float angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center)); if (_edit.snap || spatial_editor->is_snap_enabled()) { - - float snap = spatial_editor->get_rotate_snap(); - - if (snap) { - angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 - angle -= Math::fmod(angle, snap); - set_message(vformat(TTR("Rotating %s degrees."), rtos(angle))); - angle = Math::deg2rad(angle); - } else - set_message(vformat(TTR("Rotating %s degrees."), rtos(Math::rad2deg(angle)))); - - } else { - set_message(vformat(TTR("Rotating %s degrees."), rtos(Math::rad2deg(angle)))); + snap = spatial_editor->get_rotate_snap(); } + angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 + angle -= Math::fmod(angle, snap); + set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); + angle = Math::deg2rad(angle); List<Node *> &selection = editor_selection->get_selected_node_list(); @@ -1835,8 +1821,11 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { _menu_option(orthogonal ? VIEW_PERSPECTIVE : VIEW_ORTHOGONAL); _update_name(); } - if (ED_IS_SHORTCUT("spatial_editor/align_selection_with_view", p_event)) { - _menu_option(VIEW_ALIGN_SELECTION_WITH_VIEW); + if (ED_IS_SHORTCUT("spatial_editor/align_transform_with_view", p_event)) { + _menu_option(VIEW_ALIGN_TRANSFORM_WITH_VIEW); + } + if (ED_IS_SHORTCUT("spatial_editor/align_rotation_with_view", p_event)) { + _menu_option(VIEW_ALIGN_ROTATION_WITH_VIEW); } if (ED_IS_SHORTCUT("spatial_editor/insert_anim_key", p_event)) { if (!get_selected_count() || _edit.mode != TRANSFORM_NONE) @@ -2562,7 +2551,7 @@ void SpatialEditorViewport::_menu_option(int p_option) { focus_selection(); } break; - case VIEW_ALIGN_SELECTION_WITH_VIEW: { + case VIEW_ALIGN_TRANSFORM_WITH_VIEW: { if (!get_selected_count()) break; @@ -2571,7 +2560,8 @@ void SpatialEditorViewport::_menu_option(int p_option) { List<Node *> &selection = editor_selection->get_selected_node_list(); - undo_redo->create_action(TTR("Align with View")); + undo_redo->create_action(TTR("Align Transform with View")); + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { Spatial *sp = Object::cast_to<Spatial>(E->get()); @@ -2595,6 +2585,34 @@ void SpatialEditorViewport::_menu_option(int p_option) { undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); } undo_redo->commit_action(); + focus_selection(); + + } break; + case VIEW_ALIGN_ROTATION_WITH_VIEW: { + + if (!get_selected_count()) + break; + + Transform camera_transform = camera->get_global_transform(); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Align Rotation with View")); + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + + Spatial *sp = Object::cast_to<Spatial>(E->get()); + if (!sp) + continue; + + SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); + if (!se) + continue; + + undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_rotation()); + undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation()); + } + undo_redo->commit_action(); + } break; case VIEW_ENVIRONMENT: { @@ -3544,7 +3562,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed view_menu->get_popup()->add_separator(); view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_origin"), VIEW_CENTER_TO_ORIGIN); view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION); - view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_selection_with_view"), VIEW_ALIGN_SELECTION_WITH_VIEW); + view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_transform_with_view"), VIEW_ALIGN_TRANSFORM_WITH_VIEW); + view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_rotation_with_view"), VIEW_ALIGN_ROTATION_WITH_VIEW); view_menu->get_popup()->connect("id_pressed", this, "_menu_option"); view_menu->set_disable_shortcuts(true); @@ -5601,7 +5620,8 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K); ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O); ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F); - ED_SHORTCUT("spatial_editor/align_selection_with_view", TTR("Align Selection With View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); + ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M); + ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); ED_SHORTCUT("spatial_editor/tool_select", TTR("Tool Select"), KEY_Q); ED_SHORTCUT("spatial_editor/tool_move", TTR("Tool Move"), KEY_W); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 1a32d6e047..dde402c0ff 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -153,7 +153,8 @@ class SpatialEditorViewport : public Control { VIEW_REAR, VIEW_CENTER_TO_ORIGIN, VIEW_CENTER_TO_SELECTION, - VIEW_ALIGN_SELECTION_WITH_VIEW, + VIEW_ALIGN_TRANSFORM_WITH_VIEW, + VIEW_ALIGN_ROTATION_WITH_VIEW, VIEW_PERSPECTIVE, VIEW_ENVIRONMENT, VIEW_ORTHOGONAL, diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index fae88f4eb7..34d8e6aff5 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -695,5 +695,14 @@ TextEditor::TextEditor() { code_editor->get_text_edit()->set_drag_forwarding(this); } +TextEditor::~TextEditor() { + for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) { + if (E->get() != NULL) { + memdelete(E->get()); + } + } + highlighters.clear(); +} + void TextEditor::validate() { } diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index ae0c0bcf93..3a330576ae 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -154,6 +154,7 @@ public: static void register_editor(); TextEditor(); + ~TextEditor(); }; #endif // TEXT_EDITOR_H diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 28719d9e3e..f15354b643 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -2247,7 +2247,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeScalarOp::OP_POW, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeScalarFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 / scalar"), VisualShaderNodeScalarFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, -1, true)); + add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_SCALAR, -1, -1, -1, true)); add_options.push_back(AddOption("Saturate", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeScalarFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -2340,7 +2340,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_VECTOR, -1, -1, -1, true)); + add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_VECTOR, -1, -1, -1, true)); add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_VECTOR)); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index e013aae164..feb2cdd071 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -52,6 +52,10 @@ #include "scene/gui/texture_rect.h" #include "scene/gui/tool_button.h" +static inline String get_project_key_from_path(const String &dir) { + return dir.replace("/", "::"); +} + class ProjectDialog : public ConfirmationDialog { GDCLASS(ProjectDialog, ConfirmationDialog); @@ -606,7 +610,7 @@ private: dir = dir.replace("\\", "/"); if (dir.ends_with("/")) dir = dir.substr(0, dir.length() - 1); - String proj = dir.replace("/", "::"); + String proj = get_project_key_from_path(dir); EditorSettings::get_singleton()->set("projects/" + proj, dir); EditorSettings::get_singleton()->save(); @@ -918,596 +922,960 @@ public: } }; -struct ProjectItem { - String project; - String project_name; - String path; - String conf; - String icon; - String main_scene; - uint64_t last_modified; - bool favorite; - bool grayed; - ProjectListFilter::FilterOption filter_order_option; - ProjectItem() {} - ProjectItem(const String &p_project, const String &p_name, const String &p_path, const String &p_conf, const String &p_icon, const String &p_main_scene, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false, const ProjectListFilter::FilterOption p_filter_order_option = ProjectListFilter::FILTER_NAME) { - project = p_project; - project_name = p_name; - path = p_path; - conf = p_conf; - icon = p_icon; - main_scene = p_main_scene; - last_modified = p_last_modified; - favorite = p_favorite; - grayed = p_grayed; - filter_order_option = p_filter_order_option; - } - _FORCE_INLINE_ bool operator<(const ProjectItem &l) const { - switch (filter_order_option) { +class ProjectListItemControl : public HBoxContainer { + GDCLASS(ProjectListItemControl, HBoxContainer) +public: + TextureButton *favorite_button; + TextureRect *icon; + bool icon_needs_reload; + + ProjectListItemControl() { + favorite_button = NULL; + icon = NULL; + icon_needs_reload = true; + } + + void set_is_favorite(bool fav) { + favorite_button->set_modulate(fav ? Color(1, 1, 1, 1) : Color(1, 1, 1, 0.2)); + } +}; + +class ProjectList : public ScrollContainer { + GDCLASS(ProjectList, ScrollContainer) +public: + static const char *SIGNAL_SELECTION_CHANGED; + static const char *SIGNAL_PROJECT_ASK_OPEN; + + // Can often be passed by copy + struct Item { + String project_key; + String project_name; + String path; + String icon; + String main_scene; + uint64_t last_modified; + bool favorite; + bool grayed; + bool missing; + int version; + + ProjectListItemControl *control; + + Item() {} + + Item(const String &p_project, + const String &p_name, + const String &p_path, + const String &p_icon, + const String &p_main_scene, + uint64_t p_last_modified, + bool p_favorite, + bool p_grayed, + bool p_missing, + int p_version) { + + project_key = p_project; + project_name = p_name; + path = p_path; + icon = p_icon; + main_scene = p_main_scene; + last_modified = p_last_modified; + favorite = p_favorite; + grayed = p_grayed; + missing = p_missing; + version = p_version; + control = NULL; + } + + _FORCE_INLINE_ bool operator==(const Item &l) const { + return project_key == l.project_key; + } + }; + + ProjectList(); + ~ProjectList(); + + void load_projects(); + void set_search_term(String p_search_term); + void set_filter_option(ProjectListFilter::FilterOption p_option); + void set_order_option(ProjectListFilter::FilterOption p_option); + void sort_projects(); + int get_project_count() const; + void select_project(int p_index); + void erase_selected_projects(); + Vector<Item> get_selected_projects() const; + const Set<String> &get_selected_project_keys() const; + void ensure_project_visible(int p_index); + int get_single_selected_index() const; + bool is_any_project_missing() const; + void erase_missing_projects(); + int refresh_project(const String &dir_path); + +private: + static void _bind_methods(); + void _notification(int p_what); + + void _panel_draw(Node *p_hb); + void _panel_input(const Ref<InputEvent> &p_ev, Node *p_hb); + void _favorite_pressed(Node *p_hb); + void _show_project(const String &p_path); + + void select_range(int p_begin, int p_end); + void toggle_select(int p_index); + void create_project_item_control(int p_index); + void remove_project(int p_index, bool p_update_settings); + void update_icons_async(); + void load_project_icon(int p_index); + + static void load_project_data(const String &p_property_key, Item &p_item, bool p_favorite); + + String _search_term; + ProjectListFilter::FilterOption _filter_option; + ProjectListFilter::FilterOption _order_option; + Set<String> _selected_project_keys; + String _last_clicked; // Project key + VBoxContainer *_scroll_children; + int _icon_load_index; + + Vector<Item> _projects; +}; + +struct ProjectListComparator { + ProjectListFilter::FilterOption order_option; + + // operator< + _FORCE_INLINE_ bool operator()(const ProjectList::Item &a, const ProjectList::Item &b) const { + if (a.favorite && !b.favorite) { + return true; + } + if (b.favorite && !a.favorite) { + return false; + } + switch (order_option) { case ProjectListFilter::FILTER_PATH: - return project < l.project; + return a.project_key < b.project_key; case ProjectListFilter::FILTER_MODIFIED: - return last_modified > l.last_modified; + return a.last_modified > b.last_modified; default: - return project_name < l.project_name; + return a.project_name < b.project_name; } } - _FORCE_INLINE_ bool operator==(const ProjectItem &l) const { return project == l.project; } }; -void ProjectManager::_notification(int p_what) { +ProjectList::ProjectList() { + _filter_option = ProjectListFilter::FILTER_NAME; + _order_option = ProjectListFilter::FILTER_MODIFIED; - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { + _scroll_children = memnew(VBoxContainer); + _scroll_children->set_h_size_flags(SIZE_EXPAND_FILL); + add_child(_scroll_children); - Engine::get_singleton()->set_editor_hint(false); - } break; - case NOTIFICATION_READY: { + _icon_load_index = 0; +} - if (scroll_children->get_child_count() == 0 && StreamPeerSSL::is_available()) - open_templates->popup_centered_minsize(); - } break; - case NOTIFICATION_VISIBILITY_CHANGED: { +ProjectList::~ProjectList() { +} - set_process_unhandled_input(is_visible_in_tree()); - } break; - case NOTIFICATION_WM_QUIT_REQUEST: { +void ProjectList::update_icons_async() { + _icon_load_index = 0; + set_process(true); +} - _dim_window(); - } break; +void ProjectList::_notification(int p_what) { + if (p_what == NOTIFICATION_PROCESS) { + + // Load icons as a coroutine to speed up launch when you have hundreds of projects + if (_icon_load_index < _projects.size()) { + Item &item = _projects.write[_icon_load_index]; + if (item.control->icon_needs_reload) { + load_project_icon(_icon_load_index); + } + _icon_load_index++; + + } else { + set_process(false); + } } } -void ProjectManager::_dim_window() { - - // This method must be called before calling `get_tree()->quit()`. - // Otherwise, its effect won't be visible +void ProjectList::load_project_icon(int p_index) { + Item &item = _projects.write[p_index]; + + Ref<Texture> default_icon = get_icon("DefaultProjectIcon", "EditorIcons"); + Ref<Texture> icon; + if (item.icon != "") { + Ref<Image> img; + img.instance(); + Error err = img->load(item.icon.replace_first("res://", item.path + "/")); + if (err == OK) { + + img->resize(default_icon->get_width(), default_icon->get_height()); + Ref<ImageTexture> it = memnew(ImageTexture); + it->create_from_image(img); + icon = it; + } + } + if (icon.is_null()) { + icon = default_icon; + } - // Dim the project manager window while it's quitting to make it clearer that it's busy. - // No transition is applied, as the effect needs to be visible immediately - float c = 1.0f - float(EDITOR_GET("interface/editor/dim_amount")); - Color dim_color = Color(c, c, c); - gui_base->set_modulate(dim_color); + item.control->icon->set_texture(icon); + item.control->icon_needs_reload = false; } -void ProjectManager::_panel_draw(Node *p_hb) { +void ProjectList::load_project_data(const String &p_property_key, Item &p_item, bool p_favorite) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(p_hb); + String path = EditorSettings::get_singleton()->get(p_property_key); + String conf = path.plus_file("project.godot"); + bool grayed = false; + bool missing = false; - hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_color("guide_color", "Tree")); + Ref<ConfigFile> cf = memnew(ConfigFile); + Error cf_err = cf->load(conf); + + int config_version = 0; + String project_name = TTR("Unnamed Project"); + if (cf_err == OK) { + String cf_project_name = static_cast<String>(cf->get_value("application", "config/name", "")); + if (cf_project_name != "") + project_name = cf_project_name.xml_unescape(); + config_version = (int)cf->get_value("", "config_version", 0); + } - if (selected_list.has(hb->get_meta("name"))) { - hb->draw_style_box(gui_base->get_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE)); + if (config_version > ProjectSettings::CONFIG_VERSION) { + // Comes from an incompatible (more recent) Godot version, grey it out + grayed = true; } + + String icon = cf->get_value("application", "config/icon", ""); + String main_scene = cf->get_value("application", "run/main_scene", ""); + + uint64_t last_modified = 0; + if (FileAccess::exists(conf)) { + last_modified = FileAccess::get_modified_time(conf); + + String fscache = path.plus_file(".fscache"); + if (FileAccess::exists(fscache)) { + uint64_t cache_modified = FileAccess::get_modified_time(fscache); + if (cache_modified > last_modified) + last_modified = cache_modified; + } + } else { + grayed = true; + missing = true; + print_line("Project is missing: " + conf); + } + + String project_key = p_property_key.get_slice("/", 1); + + p_item = Item(project_key, project_name, path, icon, main_scene, last_modified, p_favorite, grayed, missing, config_version); } -void ProjectManager::_update_project_buttons() { - for (int i = 0; i < scroll_children->get_child_count(); i++) { +void ProjectList::load_projects() { + // This is a full, hard reload of the list. Don't call this unless really required, it's expensive. + // If you have 150 projects, it may read through 150 files on your disk at once + load 150 icons. - CanvasItem *item = Object::cast_to<CanvasItem>(scroll_children->get_child(i)); - item->update(); + // Clear whole list + for (int i = 0; i < _projects.size(); ++i) { + Item &project = _projects.write[i]; + CRASH_COND(project.control == NULL); + memdelete(project.control); // Why not queue_free()? } + _projects.clear(); + _last_clicked = ""; + _selected_project_keys.clear(); - bool empty_selection = selected_list.empty(); - erase_btn->set_disabled(empty_selection); - open_btn->set_disabled(empty_selection); - rename_btn->set_disabled(empty_selection); - run_btn->set_disabled(empty_selection); + // Load data + // TODO Would be nice to change how projects and favourites are stored... it complicates things a bit. + // Use a dictionary associating project path to metadata (like is_favorite). + + List<PropertyInfo> properties; + EditorSettings::get_singleton()->get_property_list(&properties); - bool missing_projects = false; - Map<String, String> list_all_projects; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene")); + Set<String> favorites; + // Find favourites... + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + String property_key = E->get().name; + if (property_key.begins_with("favorite_projects/")) { + favorites.insert(property_key); } } - for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) { - String project_name = E->key().replace(":::", ":/").replace("::", "/") + "/project.godot"; - if (!FileAccess::exists(project_name)) { - missing_projects = true; - break; - } + + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + // This is actually something like "projects/C:::Documents::Godot::Projects::MyGame" + String property_key = E->get().name; + if (!property_key.begins_with("projects/")) + continue; + + String project_key = property_key.get_slice("/", 1); + bool favorite = favorites.has("favorite_projects/" + project_key); + + Item item; + load_project_data(property_key, item, favorite); + + _projects.push_back(item); } - erase_missing_btn->set_visible(missing_projects); + // Create controls + for (int i = 0; i < _projects.size(); ++i) { + create_project_item_control(i); + } + + sort_projects(); + + set_v_scroll(0); + + update_icons_async(); } -void ProjectManager::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { +void ProjectList::create_project_item_control(int p_index) { - Ref<InputEventMouseButton> mb = p_ev; + // Will be added last in the list, so make sure indexes match + ERR_FAIL_COND(p_index != _scroll_children->get_child_count()); - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + Item &item = _projects.write[p_index]; + ERR_FAIL_COND(item.control != NULL); // Already created - String clicked = p_hb->get_meta("name"); - String clicked_main_scene = p_hb->get_meta("main_scene"); + Ref<Texture> favorite_icon = get_icon("Favorites", "EditorIcons"); + Color font_color = get_color("font_color", "Tree"); + + ProjectListItemControl *hb = memnew(ProjectListItemControl); + hb->connect("draw", this, "_panel_draw", varray(hb)); + hb->connect("gui_input", this, "_panel_input", varray(hb)); + hb->add_constant_override("separation", 10 * EDSCALE); + + VBoxContainer *favorite_box = memnew(VBoxContainer); + favorite_box->set_name("FavoriteBox"); + TextureButton *favorite = memnew(TextureButton); + favorite->set_name("FavoriteButton"); + favorite->set_normal_texture(favorite_icon); + favorite->connect("pressed", this, "_favorite_pressed", varray(hb)); + favorite_box->add_child(favorite); + favorite_box->set_alignment(BoxContainer::ALIGN_CENTER); + hb->add_child(favorite_box); + hb->favorite_button = favorite; + hb->set_is_favorite(item.favorite); + + TextureRect *tf = memnew(TextureRect); + tf->set_texture(get_icon("DefaultProjectIcon", "EditorIcons")); + hb->add_child(tf); + hb->icon = tf; - if (mb->get_shift() && selected_list.size() > 0 && last_clicked != "" && clicked != last_clicked) { + VBoxContainer *vb = memnew(VBoxContainer); + if (item.grayed) + vb->set_modulate(Color(0.5, 0.5, 0.5)); + vb->set_h_size_flags(SIZE_EXPAND_FILL); + hb->add_child(vb); + Control *ec = memnew(Control); + ec->set_custom_minimum_size(Size2(0, 1)); + ec->set_mouse_filter(MOUSE_FILTER_PASS); + vb->add_child(ec); + Label *title = memnew(Label(item.project_name)); + title->add_font_override("font", get_font("title", "EditorFonts")); + title->add_color_override("font_color", font_color); + title->set_clip_text(true); + vb->add_child(title); + + HBoxContainer *path_hb = memnew(HBoxContainer); + path_hb->set_h_size_flags(SIZE_EXPAND_FILL); + vb->add_child(path_hb); + + Button *show = memnew(Button); + show->set_icon(get_icon("Load", "EditorIcons")); // Folder icon + show->set_flat(true); + show->set_modulate(Color(1, 1, 1, 0.5)); + path_hb->add_child(show); + show->connect("pressed", this, "_show_project", varray(item.path)); + show->set_tooltip(TTR("Show in File Manager")); + + Label *fpath = memnew(Label(item.path)); + path_hb->add_child(fpath); + fpath->set_h_size_flags(SIZE_EXPAND_FILL); + fpath->set_modulate(Color(1, 1, 1, 0.5)); + fpath->add_color_override("font_color", font_color); + fpath->set_clip_text(true); + + _scroll_children->add_child(hb); + item.control = hb; +} - int clicked_id = -1; - int last_clicked_id = -1; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; - if (hb->get_meta("name") == clicked) clicked_id = i; - if (hb->get_meta("name") == last_clicked) last_clicked_id = i; - } +void ProjectList::set_search_term(String p_search_term) { + _search_term = p_search_term; +} - if (last_clicked_id != -1 && clicked_id != -1) { - int min = clicked_id < last_clicked_id ? clicked_id : last_clicked_id; - int max = clicked_id > last_clicked_id ? clicked_id : last_clicked_id; - for (int i = 0; i < scroll_children->get_child_count(); ++i) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; - if (i != clicked_id && (i < min || i > max) && !mb->get_control()) { - selected_list.erase(hb->get_meta("name")); - } else if (i >= min && i <= max) { - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - } - } - } +void ProjectList::set_filter_option(ProjectListFilter::FilterOption p_option) { + if (_filter_option != p_option) { + _filter_option = p_option; + } +} - } else if (selected_list.has(clicked) && mb->get_control()) { +void ProjectList::set_order_option(ProjectListFilter::FilterOption p_option) { + if (_order_option != p_option) { + _order_option = p_option; + EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)_filter_option); + EditorSettings::get_singleton()->save(); + } +} - selected_list.erase(clicked); +void ProjectList::sort_projects() { - } else { + SortArray<Item, ProjectListComparator> sorter; + sorter.compare.order_option = _order_option; + sorter.sort(_projects.ptrw(), _projects.size()); - last_clicked = clicked; - if (mb->get_control() || selected_list.size() == 0) { - selected_list.insert(clicked, clicked_main_scene); - } else { - selected_list.clear(); - selected_list.insert(clicked, clicked_main_scene); + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + + bool visible = true; + if (_search_term != "") { + if (_filter_option == ProjectListFilter::FILTER_PATH) { + visible = item.path.findn(_search_term) != -1; + } else if (_filter_option == ProjectListFilter::FILTER_NAME) { + visible = item.project_name.findn(_search_term) != -1; } } - _update_project_buttons(); + item.control->set_visible(visible); + } - if (mb->is_doubleclick()) - _open_selected_projects_ask(); //open if doubleclicked + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + if (item.control->is_visible()) { + item.control->get_parent()->move_child(item.control, i); + } } + + // Rewind the coroutine because order of projects changed + update_icons_async(); } -void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { +const Set<String> &ProjectList::get_selected_project_keys() const { + // Faster if that's all you need + return _selected_project_keys; +} - Ref<InputEventKey> k = p_ev; +Vector<ProjectList::Item> ProjectList::get_selected_projects() const { + Vector<Item> items; + if (_selected_project_keys.size() == 0) { + return items; + } + items.resize(_selected_project_keys.size()); + int j = 0; + for (int i = 0; i < _projects.size(); ++i) { + const Item &item = _projects[i]; + if (_selected_project_keys.has(item.project_key)) { + items.write[j++] = item; + } + } + ERR_FAIL_COND_V(j != items.size(), items); + return items; +} - if (k.is_valid()) { +void ProjectList::ensure_project_visible(int p_index) { + const Item &item = _projects[p_index]; - if (!k->is_pressed()) - return; + int item_top = item.control->get_position().y; + int item_bottom = item.control->get_position().y + item.control->get_size().y; - if (tabs->get_current_tab() != 0) - return; + if (item_top < get_v_scroll()) { + set_v_scroll(item_top); - bool scancode_handled = true; + } else if (item_bottom > get_v_scroll() + get_size().y) { + set_v_scroll(item_bottom - get_size().y); + } +} - switch (k->get_scancode()) { +int ProjectList::get_single_selected_index() const { + if (_selected_project_keys.size() == 0) { + // Default selection + return 0; + } + String key; + if (_selected_project_keys.size() == 1) { + // Only one selected + key = _selected_project_keys.front()->get(); + } else { + // Multiple selected, consider the last clicked one as "main" + key = _last_clicked; + } + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == key) { + return i; + } + } + return 0; +} - case KEY_ENTER: { +void ProjectList::remove_project(int p_index, bool p_update_settings) { + const Item item = _projects[p_index]; // Take a copy - _open_selected_projects_ask(); - } break; - case KEY_DELETE: { + _selected_project_keys.erase(item.project_key); - _erase_project(); - } break; - case KEY_HOME: { + if (_last_clicked == item.project_key) { + _last_clicked = ""; + } - for (int i = 0; i < scroll_children->get_child_count(); i++) { + memdelete(item.control); + _projects.remove(p_index); - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - scroll->set_v_scroll(0); - _update_project_buttons(); - break; - } - } + if (p_update_settings) { + EditorSettings::get_singleton()->erase("projects/" + item.project_key); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); + // Not actually saving the file, in case you are doing more changes to settings + } +} - } break; - case KEY_END: { +bool ProjectList::is_any_project_missing() const { + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].missing) { + return true; + } + } + return false; +} - for (int i = scroll_children->get_child_count() - 1; i >= 0; i--) { +void ProjectList::erase_missing_projects() { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - scroll->set_v_scroll(scroll_children->get_size().y); - _update_project_buttons(); - break; - } - } + if (_projects.empty()) { + return; + } - } break; - case KEY_UP: { + int deleted_count = 0; + int remaining_count = 0; - if (k->get_shift()) - break; + for (int i = 0; i < _projects.size(); ++i) { + const Item &item = _projects[i]; - if (selected_list.size()) { + if (item.missing) { + remove_project(i, true); + --i; + ++deleted_count; - bool found = false; + } else { + ++remaining_count; + } + } - for (int i = scroll_children->get_child_count() - 1; i >= 0; i--) { + print_line("Removed " + itos(deleted_count) + " projects from the list, remaining " + itos(remaining_count) + " projects"); - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; + EditorSettings::get_singleton()->save(); +} - String current = hb->get_meta("name"); +int ProjectList::refresh_project(const String &dir_path) { + // Reads editor settings and reloads information about a specific project. + // If it wasn't loaded and should be in the list, it is added (i.e new project). + // If it isn't in the list anymore, it is removed. + // If it is in the list but doesn't exist anymore, it is marked as missing. - if (found) { - selected_list.clear(); - selected_list.insert(current, hb->get_meta("main_scene")); + String project_key = get_project_key_from_path(dir_path); - int offset_diff = scroll->get_v_scroll() - hb->get_position().y; + // Read project manager settings + bool is_favourite = false; + bool should_be_in_list = false; + String property_key = "projects/" + project_key; + { + List<PropertyInfo> properties; + EditorSettings::get_singleton()->get_property_list(&properties); + String favorite_property_key = "favorite_projects/" + project_key; + + bool found = false; + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + String prop = E->get().name; + if (!found && prop == property_key) { + found = true; + } else if (!is_favourite && prop == favorite_property_key) { + is_favourite = true; + } + } - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() - offset_diff); + should_be_in_list = found; + } - _update_project_buttons(); + bool was_selected = _selected_project_keys.has(project_key); - break; + // Remove item in any case + for (int i = 0; i < _projects.size(); ++i) { + const Item &existing_item = _projects[i]; + if (existing_item.path == dir_path) { + remove_project(i, false); + break; + } + } - } else if (current == selected_list.back()->key()) { + int index = -1; + if (should_be_in_list) { + // Recreate it with updated info - found = true; - } - } + Item item; + load_project_data(property_key, item, is_favourite); - break; + _projects.push_back(item); + create_project_item_control(_projects.size() - 1); + + sort_projects(); + + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == project_key) { + if (was_selected) { + select_project(i); + ensure_project_visible(i); } - FALLTHROUGH; + load_project_icon(i); + index = i; + break; } - case KEY_DOWN: { + } + } - if (k->get_shift()) - break; + return index; +} + +int ProjectList::get_project_count() const { + return _projects.size(); +} + +void ProjectList::select_project(int p_index) { + + Vector<Item> previous_selected_items = get_selected_projects(); + _selected_project_keys.clear(); - bool found = selected_list.empty(); + for (int i = 0; i < previous_selected_items.size(); ++i) { + previous_selected_items[i].control->update(); + } + + toggle_select(p_index); +} + +inline void sort(int &a, int &b) { + if (a > b) { + int temp = a; + a = b; + b = temp; + } +} + +void ProjectList::select_range(int p_begin, int p_end) { + sort(p_begin, p_end); + select_project(p_begin); + for (int i = p_begin + 1; i <= p_end; ++i) { + toggle_select(i); + } +} + +void ProjectList::toggle_select(int p_index) { + Item &item = _projects.write[p_index]; + if (_selected_project_keys.has(item.project_key)) { + _selected_project_keys.erase(item.project_key); + } else { + _selected_project_keys.insert(item.project_key); + } + item.control->update(); +} - for (int i = 0; i < scroll_children->get_child_count(); i++) { +void ProjectList::erase_selected_projects() { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; + if (_selected_project_keys.size() == 0) { + return; + } - String current = hb->get_meta("name"); + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + if (_selected_project_keys.has(item.project_key) && item.control->is_visible()) { - if (found) { - selected_list.clear(); - selected_list.insert(current, hb->get_meta("main_scene")); + EditorSettings::get_singleton()->erase("projects/" + item.project_key); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); - int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; - int offset_diff = (hb->get_position().y + hb->get_size().y) - last_y_visible; + memdelete(item.control); + _projects.remove(i); + --i; + } + } - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); + EditorSettings::get_singleton()->save(); - _update_project_buttons(); + _selected_project_keys.clear(); + _last_clicked = ""; +} - break; +// Draws selected project highlight +void ProjectList::_panel_draw(Node *p_hb) { + Control *hb = Object::cast_to<Control>(p_hb); - } else if (current == selected_list.back()->key()) { + hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_color("guide_color", "Tree")); - found = true; - } + String key = _projects[p_hb->get_index()].project_key; + + if (_selected_project_keys.has(key)) { + hb->draw_style_box(get_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE)); + } +} + +// Input for each item in the list +void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { + + Ref<InputEventMouseButton> mb = p_ev; + int clicked_index = p_hb->get_index(); + const Item &clicked_project = _projects[clicked_index]; + + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + + if (mb->get_shift() && _selected_project_keys.size() > 0 && _last_clicked != "" && clicked_project.project_key != _last_clicked) { + + int anchor_index = -1; + for (int i = 0; i < _projects.size(); ++i) { + const Item &p = _projects[i]; + if (p.project_key == _last_clicked) { + anchor_index = p.control->get_index(); + break; } + } + CRASH_COND(anchor_index == -1); + select_range(anchor_index, clicked_index); - } break; - case KEY_F: { - if (k->get_command()) - this->project_filter->search_box->grab_focus(); - else - scancode_handled = false; - } break; - default: { - scancode_handled = false; - } break; + } else if (mb->get_control()) { + toggle_select(clicked_index); + + } else { + _last_clicked = clicked_project.project_key; + select_project(clicked_index); } - if (scancode_handled) { - accept_event(); + emit_signal(SIGNAL_SELECTION_CHANGED); + + if (mb->is_doubleclick()) { + emit_signal(SIGNAL_PROJECT_ASK_OPEN); } } } -void ProjectManager::_favorite_pressed(Node *p_hb) { +void ProjectList::_favorite_pressed(Node *p_hb) { + + ProjectListItemControl *control = Object::cast_to<ProjectListItemControl>(p_hb); + + int index = control->get_index(); + Item item = _projects.write[index]; // Take copy - String clicked = p_hb->get_meta("name"); - bool favorite = !p_hb->get_meta("favorite"); - String proj = clicked.replace(":::", ":/"); - proj = proj.replace("::", "/"); + item.favorite = !item.favorite; - if (favorite) { - EditorSettings::get_singleton()->set("favorite_projects/" + clicked, proj); + if (item.favorite) { + EditorSettings::get_singleton()->set("favorite_projects/" + item.project_key, item.path); } else { - EditorSettings::get_singleton()->erase("favorite_projects/" + clicked); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); } EditorSettings::get_singleton()->save(); - call_deferred("_load_recent_projects"); -} -void ProjectManager::_load_recent_projects() { + _projects.write[index] = item; + + control->set_is_favorite(item.favorite); - ProjectListFilter::FilterOption filter_option = project_filter->get_filter_option(); - String search_term = project_filter->get_search_term(); + sort_projects(); - while (scroll_children->get_child_count() > 0) { - memdelete(scroll_children->get_child(0)); + if (item.favorite) { + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == item.project_key) { + ensure_project_visible(i); + break; + } + } } +} - Map<String, String> selected_list_copy = selected_list; +void ProjectList::_show_project(const String &p_path) { - List<PropertyInfo> properties; - EditorSettings::get_singleton()->get_property_list(&properties); + OS::get_singleton()->shell_open(String("file://") + p_path); +} - Color font_color = gui_base->get_color("font_color", "Tree"); +const char *ProjectList::SIGNAL_SELECTION_CHANGED = "selection_changed"; +const char *ProjectList::SIGNAL_PROJECT_ASK_OPEN = "project_ask_open"; - ProjectListFilter::FilterOption filter_order_option = project_order_filter->get_filter_option(); - EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)filter_order_option); +void ProjectList::_bind_methods() { - List<ProjectItem> projects; - List<ProjectItem> favorite_projects; + ClassDB::bind_method("_panel_draw", &ProjectList::_panel_draw); + ClassDB::bind_method("_panel_input", &ProjectList::_panel_input); + ClassDB::bind_method("_favorite_pressed", &ProjectList::_favorite_pressed); + ClassDB::bind_method("_show_project", &ProjectList::_show_project); + //ClassDB::bind_method("_unhandled_input", &ProjectList::_unhandled_input); - for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + ADD_SIGNAL(MethodInfo(SIGNAL_SELECTION_CHANGED)); + ADD_SIGNAL(MethodInfo(SIGNAL_PROJECT_ASK_OPEN)); +} - String _name = E->get().name; - if (!_name.begins_with("projects/") && !_name.begins_with("favorite_projects/")) - continue; +void ProjectManager::_notification(int p_what) { - String path = EditorSettings::get_singleton()->get(_name); - if (filter_option == ProjectListFilter::FILTER_PATH && search_term != "" && path.findn(search_term) == -1) - continue; + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { - String project = _name.get_slice("/", 1); - String conf = path.plus_file("project.godot"); - bool favorite = (_name.begins_with("favorite_projects/")) ? true : false; - bool grayed = false; + Engine::get_singleton()->set_editor_hint(false); + } break; + case NOTIFICATION_READY: { - Ref<ConfigFile> cf = memnew(ConfigFile); - Error cf_err = cf->load(conf); + if (_project_list->get_project_count() == 0 && StreamPeerSSL::is_available()) + open_templates->popup_centered_minsize(); + } break; + case NOTIFICATION_VISIBILITY_CHANGED: { - int config_version = 0; - String project_name = TTR("Unnamed Project"); - if (cf_err == OK) { + set_process_unhandled_input(is_visible_in_tree()); + } break; + case NOTIFICATION_WM_QUIT_REQUEST: { - String cf_project_name = static_cast<String>(cf->get_value("application", "config/name", "")); - if (cf_project_name != "") - project_name = cf_project_name.xml_unescape(); - config_version = (int)cf->get_value("", "config_version", 0); - } + _dim_window(); + } break; + } +} - if (config_version > ProjectSettings::CONFIG_VERSION) { - // Comes from an incompatible (more recent) Godot version, grey it out - grayed = true; - } +void ProjectManager::_dim_window() { - String icon = cf->get_value("application", "config/icon", ""); - String main_scene = cf->get_value("application", "run/main_scene", ""); + // This method must be called before calling `get_tree()->quit()`. + // Otherwise, its effect won't be visible - uint64_t last_modified = 0; - if (FileAccess::exists(conf)) { - last_modified = FileAccess::get_modified_time(conf); + // Dim the project manager window while it's quitting to make it clearer that it's busy. + // No transition is applied, as the effect needs to be visible immediately + float c = 0.4f; + Color dim_color = Color(c, c, c); + gui_base->set_modulate(dim_color); +} - String fscache = path.plus_file(".fscache"); - if (FileAccess::exists(fscache)) { - uint64_t cache_modified = FileAccess::get_modified_time(fscache); - if (cache_modified > last_modified) - last_modified = cache_modified; - } - } else { - grayed = true; - } +void ProjectManager::_update_project_buttons() { - ProjectItem item(project, project_name, path, conf, icon, main_scene, last_modified, favorite, grayed, filter_order_option); - if (favorite) - favorite_projects.push_back(item); - else - projects.push_back(item); - } - projects.sort(); - favorite_projects.sort(); + Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects(); + bool empty_selection = selected_projects.empty(); - for (List<ProjectItem>::Element *E = projects.front(); E;) { - List<ProjectItem>::Element *next = E->next(); - if (favorite_projects.find(E->get()) != NULL) - projects.erase(E->get()); - E = next; - } - for (List<ProjectItem>::Element *E = favorite_projects.back(); E; E = E->prev()) { - projects.push_front(E->get()); - } + erase_btn->set_disabled(empty_selection); + open_btn->set_disabled(empty_selection); + rename_btn->set_disabled(empty_selection); + run_btn->set_disabled(empty_selection); - Ref<Texture> favorite_icon = get_icon("Favorites", "EditorIcons"); + erase_missing_btn->set_visible(_project_list->is_any_project_missing()); +} + +void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { - for (List<ProjectItem>::Element *E = projects.front(); E; E = E->next()) { + Ref<InputEventKey> k = p_ev; - ProjectItem &item = E->get(); - String project = item.project; - String path = item.path; - String conf = item.conf; + if (k.is_valid()) { - if (filter_option == ProjectListFilter::FILTER_NAME && search_term != "" && item.project_name.findn(search_term) == -1) - continue; + if (!k->is_pressed()) + return; + + if (tabs->get_current_tab() != 0) + return; + + bool scancode_handled = true; + + switch (k->get_scancode()) { + + case KEY_ENTER: { + + _open_selected_projects_ask(); + } break; + case KEY_DELETE: { + + _erase_project(); + } break; + case KEY_HOME: { + + if (_project_list->get_project_count() > 0) { + _project_list->select_project(0); + _update_project_buttons(); + } + + } break; + case KEY_END: { + + if (_project_list->get_project_count() > 0) { + _project_list->select_project(_project_list->get_project_count() - 1); + _update_project_buttons(); + } + + } break; + case KEY_UP: { - Ref<Texture> icon; + if (k->get_shift()) + break; - if (item.icon != "") { - Ref<Image> img; - img.instance(); - Error err = img->load(item.icon.replace_first("res://", path + "/")); - if (err == OK) { + int index = _project_list->get_single_selected_index(); + if (index - 1 > 0) { + _project_list->select_project(index - 1); + _project_list->ensure_project_visible(index - 1); + _update_project_buttons(); + } - Ref<Texture> default_icon = get_icon("DefaultProjectIcon", "EditorIcons"); - img->resize(default_icon->get_width(), default_icon->get_height()); - Ref<ImageTexture> it = memnew(ImageTexture); - it->create_from_image(img); - icon = it; + break; } + case KEY_DOWN: { + + if (k->get_shift()) + break; + + int index = _project_list->get_single_selected_index(); + if (index + 1 < _project_list->get_project_count()) { + _project_list->select_project(index + 1); + _project_list->ensure_project_visible(index + 1); + _update_project_buttons(); + } + + } break; + case KEY_F: { + if (k->get_command()) + this->project_filter->search_box->grab_focus(); + else + scancode_handled = false; + } break; + default: { + scancode_handled = false; + } break; } - if (icon.is_null()) { - icon = get_icon("DefaultProjectIcon", "EditorIcons"); + if (scancode_handled) { + accept_event(); } + } +} - selected_list_copy.erase(project); - - bool is_favorite = item.favorite; - bool is_grayed = item.grayed; - - HBoxContainer *hb = memnew(HBoxContainer); - hb->set_meta("name", project); - hb->set_meta("main_scene", item.main_scene); - hb->set_meta("favorite", is_favorite); - hb->connect("draw", this, "_panel_draw", varray(hb)); - hb->connect("gui_input", this, "_panel_input", varray(hb)); - hb->add_constant_override("separation", 10 * EDSCALE); - - VBoxContainer *favorite_box = memnew(VBoxContainer); - TextureButton *favorite = memnew(TextureButton); - favorite->set_normal_texture(favorite_icon); - if (!is_favorite) - favorite->set_modulate(Color(1, 1, 1, 0.2)); - favorite->connect("pressed", this, "_favorite_pressed", varray(hb)); - favorite_box->add_child(favorite); - favorite_box->set_alignment(BoxContainer::ALIGN_CENTER); - hb->add_child(favorite_box); - - TextureRect *tf = memnew(TextureRect); - tf->set_texture(icon); - hb->add_child(tf); +void ProjectManager::_load_recent_projects() { - VBoxContainer *vb = memnew(VBoxContainer); - if (is_grayed) - vb->set_modulate(Color(0.5, 0.5, 0.5)); - vb->set_name("project"); - vb->set_h_size_flags(SIZE_EXPAND_FILL); - hb->add_child(vb); - Control *ec = memnew(Control); - ec->set_custom_minimum_size(Size2(0, 1)); - ec->set_mouse_filter(MOUSE_FILTER_PASS); - vb->add_child(ec); - Label *title = memnew(Label(item.project_name)); - title->add_font_override("font", gui_base->get_font("title", "EditorFonts")); - title->add_color_override("font_color", font_color); - title->set_clip_text(true); - vb->add_child(title); - - HBoxContainer *path_hb = memnew(HBoxContainer); - path_hb->set_name("path_box"); - path_hb->set_h_size_flags(SIZE_EXPAND_FILL); - vb->add_child(path_hb); - - Button *show = memnew(Button); - show->set_name("show"); - show->set_icon(get_icon("Filesystem", "EditorIcons")); - show->set_flat(true); - show->set_modulate(Color(1, 1, 1, 0.5)); - path_hb->add_child(show); - show->connect("pressed", this, "_show_project", varray(path)); - show->set_tooltip(TTR("Show in File Manager")); - - Label *fpath = memnew(Label(path)); - fpath->set_name("path"); - path_hb->add_child(fpath); - fpath->set_h_size_flags(SIZE_EXPAND_FILL); - fpath->set_modulate(Color(1, 1, 1, 0.5)); - fpath->add_color_override("font_color", font_color); - fpath->set_clip_text(true); - - scroll_children->add_child(hb); - } - - for (Map<String, String>::Element *E = selected_list_copy.front(); E; E = E->next()) { - String key = E->key(); - selected_list.erase(key); - } - - scroll->set_v_scroll(0); + _project_list->set_filter_option(project_filter->get_filter_option()); + _project_list->set_order_option(project_order_filter->get_filter_option()); + _project_list->set_search_term(project_filter->get_search_term()); + _project_list->load_projects(); _update_project_buttons(); - EditorSettings::get_singleton()->save(); - tabs->set_current_tab(0); } void ProjectManager::_on_projects_updated() { - _load_recent_projects(); + Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects(); + int index = 0; + for (int i = 0; i < selected_projects.size(); ++i) { + index = _project_list->refresh_project(selected_projects[i].path); + } + if (index != -1) { + _project_list->ensure_project_visible(index); + } } void ProjectManager::_on_project_created(const String &dir) { project_filter->clear(); - bool has_already = false; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - Label *fpath = Object::cast_to<Label>(hb->get_node(NodePath("project/path_box/path"))); - if (fpath->get_text() == dir) { - has_already = true; - break; - } - } - if (has_already) { - _update_scroll_position(dir); - } else { - _load_recent_projects(); - _update_scroll_position(dir); - } + int i = _project_list->refresh_project(dir); + _project_list->select_project(i); + _project_list->ensure_project_visible(i); _open_selected_projects_ask(); } -void ProjectManager::_update_scroll_position(const String &dir) { - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - Label *fpath = Object::cast_to<Label>(hb->get_node(NodePath("project/path_box/path"))); - if (fpath->get_text() == dir) { - last_clicked = hb->get_meta("name"); - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - _update_project_buttons(); - int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; - int offset_diff = (hb->get_position().y + hb->get_size().y) - last_y_visible; - - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); - break; - } - } -} - void ProjectManager::_confirm_update_settings() { _open_selected_projects(); } void ProjectManager::_open_selected_projects() { - for (const Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - const String &selected = E->key(); + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + + for (const Set<String>::Element *E = selected_list.front(); E; E = E->next()) { + const String &selected = E->get(); String path = EditorSettings::get_singleton()->get("projects/" + selected); String conf = path.plus_file("project.godot"); + if (!FileAccess::exists(conf)) { dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path)); dialog_error->popup_centered_minsize(); @@ -1540,6 +1908,8 @@ void ProjectManager::_open_selected_projects() { void ProjectManager::_open_selected_projects_ask() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() < 1) { return; } @@ -1550,22 +1920,11 @@ void ProjectManager::_open_selected_projects_ask() { return; } - // Update the project settings or don't open - String path = EditorSettings::get_singleton()->get("projects/" + selected_list.front()->key()); - String conf = path.plus_file("project.godot"); + ProjectList::Item project = _project_list->get_selected_projects()[0]; - // FIXME: We already parse those in _load_recent_projects, we could instead make - // its `projects` list global and reuse its parsed metadata here. - Ref<ConfigFile> cf = memnew(ConfigFile); - Error cf_err = cf->load(conf); - - if (cf_err != OK) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path)); - dialog_error->popup_centered_minsize(); - return; - } - - int config_version = (int)cf->get_value("", "config_version", 0); + // Update the project settings or don't open + String conf = project.path.plus_file("project.godot"); + int config_version = project.version; // Check if the config_version property was empty or 0 if (config_version == 0) { @@ -1581,7 +1940,7 @@ void ProjectManager::_open_selected_projects_ask() { } // Check if the file was generated by a newer, incompatible engine version if (config_version > ProjectSettings::CONFIG_VERSION) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), path)); + dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), project.path)); dialog_error->popup_centered_minsize(); return; } @@ -1592,16 +1951,18 @@ void ProjectManager::_open_selected_projects_ask() { void ProjectManager::_run_project_confirm() { - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { + Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); + + for (int i = 0; i < selected_list.size(); ++i) { - const String &selected_main = E->get(); + const String &selected_main = selected_list[i].main_scene; if (selected_main == "") { run_error_diag->set_text(TTR("Can't run project: no main scene defined.\nPlease edit the project and set the main scene in the Project Settings under the \"Application\" category.")); run_error_diag->popup_centered(); return; } - const String &selected = E->key(); + const String &selected = selected_list[i].project_key; String path = EditorSettings::get_singleton()->get("projects/" + selected); if (!DirAccess::exists(path + "/.import")) { @@ -1629,8 +1990,11 @@ void ProjectManager::_run_project_confirm() { } } +// When you press the "Run" button void ProjectManager::_run_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() < 1) { return; } @@ -1643,11 +2007,6 @@ void ProjectManager::_run_project() { } } -void ProjectManager::_show_project(const String &p_path) { - - OS::get_singleton()->shell_open(String("file://") + p_path); -} - void ProjectManager::_scan_dir(const String &path, List<String> *r_projects) { DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); da->change_dir(path); @@ -1673,7 +2032,7 @@ void ProjectManager::_scan_begin(const String &p_base) { print_line("Found " + itos(projects.size()) + " projects."); for (List<String>::Element *E = projects.front(); E; E = E->next()) { - String proj = E->get().replace("/", "::"); + String proj = get_project_key_from_path(E->get()); EditorSettings::get_singleton()->set("projects/" + proj, E->get()); } EditorSettings::get_singleton()->save(); @@ -1699,12 +2058,14 @@ void ProjectManager::_import_project() { void ProjectManager::_rename_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() == 0) { return; } - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - const String &selected = E->key(); + for (Set<String>::Element *E = selected_list.front(); E; E = E->next()) { + const String &selected = E->get(); String path = EditorSettings::get_singleton()->get("projects/" + selected); npdialog->set_project_path(path); npdialog->set_mode(ProjectDialog::MODE_RENAME); @@ -1713,55 +2074,17 @@ void ProjectManager::_rename_project() { } void ProjectManager::_erase_project_confirm() { - - if (selected_list.size() == 0) { - return; - } - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - EditorSettings::get_singleton()->erase("projects/" + E->key()); - EditorSettings::get_singleton()->erase("favorite_projects/" + E->key()); - } - EditorSettings::get_singleton()->save(); - selected_list.clear(); - last_clicked = ""; - _load_recent_projects(); + _project_list->erase_selected_projects(); } void ProjectManager::_erase_missing_projects_confirm() { - - Map<String, String> list_all_projects; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - } - } - - if (list_all_projects.size() == 0) { - return; - } - - int deleted_projects = 0; - int remaining_projects = 0; - for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) { - String project_name = E->key().replace(":::", ":/").replace("::", "/") + "/project.godot"; - if (!FileAccess::exists(project_name)) { - deleted_projects++; - EditorSettings::get_singleton()->erase("projects/" + E->key()); - EditorSettings::get_singleton()->erase("favorite_projects/" + E->key()); - } else { - remaining_projects++; - } - } - print_line("Deleted " + itos(deleted_projects) + " projects, remaining " + itos(remaining_projects) + " projects"); - EditorSettings::get_singleton()->save(); - selected_list.clear(); - last_clicked = ""; - _load_recent_projects(); + _project_list->erase_missing_projects(); } void ProjectManager::_erase_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() == 0) return; @@ -1867,13 +2190,23 @@ void ProjectManager::_scan_multiple_folders(PoolStringArray p_files) { } } +void ProjectManager::_on_order_option_changed() { + _project_list->set_order_option(project_order_filter->get_filter_option()); + _project_list->sort_projects(); +} + +void ProjectManager::_on_filter_option_changed() { + _project_list->set_filter_option(project_filter->get_filter_option()); + _project_list->set_search_term(project_filter->get_search_term()); + _project_list->sort_projects(); +} + void ProjectManager::_bind_methods() { ClassDB::bind_method("_open_selected_projects_ask", &ProjectManager::_open_selected_projects_ask); ClassDB::bind_method("_open_selected_projects", &ProjectManager::_open_selected_projects); ClassDB::bind_method("_run_project", &ProjectManager::_run_project); ClassDB::bind_method("_run_project_confirm", &ProjectManager::_run_project_confirm); - ClassDB::bind_method("_show_project", &ProjectManager::_show_project); ClassDB::bind_method("_scan_projects", &ProjectManager::_scan_projects); ClassDB::bind_method("_scan_begin", &ProjectManager::_scan_begin); ClassDB::bind_method("_import_project", &ProjectManager::_import_project); @@ -1886,18 +2219,16 @@ void ProjectManager::_bind_methods() { ClassDB::bind_method("_language_selected", &ProjectManager::_language_selected); ClassDB::bind_method("_restart_confirm", &ProjectManager::_restart_confirm); ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog); - ClassDB::bind_method("_load_recent_projects", &ProjectManager::_load_recent_projects); + ClassDB::bind_method("_on_order_option_changed", &ProjectManager::_on_order_option_changed); + ClassDB::bind_method("_on_filter_option_changed", &ProjectManager::_on_filter_option_changed); ClassDB::bind_method("_on_projects_updated", &ProjectManager::_on_projects_updated); ClassDB::bind_method("_on_project_created", &ProjectManager::_on_project_created); - ClassDB::bind_method("_update_scroll_position", &ProjectManager::_update_scroll_position); - ClassDB::bind_method("_panel_draw", &ProjectManager::_panel_draw); - ClassDB::bind_method("_panel_input", &ProjectManager::_panel_input); ClassDB::bind_method("_unhandled_input", &ProjectManager::_unhandled_input); - ClassDB::bind_method("_favorite_pressed", &ProjectManager::_favorite_pressed); ClassDB::bind_method("_install_project", &ProjectManager::_install_project); ClassDB::bind_method("_files_dropped", &ProjectManager::_files_dropped); ClassDB::bind_method("_open_asset_library", &ProjectManager::_open_asset_library); ClassDB::bind_method("_confirm_update_settings", &ProjectManager::_confirm_update_settings); + ClassDB::bind_method("_update_project_buttons", &ProjectManager::_update_project_buttons); ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"), &ProjectManager::_scan_multiple_folders); } @@ -1925,29 +2256,12 @@ ProjectManager::ProjectManager() { editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0); } break; - case 1: { - editor_set_scale(0.75); - } break; - - case 2: { - editor_set_scale(1.0); - } break; - - case 3: { - editor_set_scale(1.25); - } break; - - case 4: { - editor_set_scale(1.5); - } break; - - case 5: { - editor_set_scale(1.75); - } break; - - case 6: { - editor_set_scale(2.0); - } break; + case 1: editor_set_scale(0.75); break; + case 2: editor_set_scale(1.0); break; + case 3: editor_set_scale(1.25); break; + case 4: editor_set_scale(1.5); break; + case 5: editor_set_scale(1.75); break; + case 6: editor_set_scale(2.0); break; default: { editor_set_scale(custom_display_scale); @@ -2030,7 +2344,7 @@ ProjectManager::ProjectManager() { project_order_filter->_setup_filters(sort_filter_titles); project_order_filter->set_filter_size(150); sort_filters->add_child(project_order_filter); - project_order_filter->connect("filter_changed", this, "_load_recent_projects"); + project_order_filter->connect("filter_changed", this, "_on_order_option_changed"); project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE); int projects_sorting_order = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order"); @@ -2049,7 +2363,7 @@ ProjectManager::ProjectManager() { project_filter->_setup_filters(vec2); project_filter->add_search_box(); search_filters->add_child(project_filter); - project_filter->connect("filter_changed", this, "_load_recent_projects"); + project_filter->connect("filter_changed", this, "_on_filter_option_changed"); project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE); sort_filters->add_child(search_filters); @@ -2060,15 +2374,14 @@ ProjectManager::ProjectManager() { search_tree_vb->add_child(pc); pc->set_v_size_flags(SIZE_EXPAND_FILL); - scroll = memnew(ScrollContainer); - pc->add_child(scroll); - scroll->set_enable_h_scroll(false); + _project_list = memnew(ProjectList); + _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, this, "_update_project_buttons"); + _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, this, "_open_selected_projects_ask"); + pc->add_child(_project_list); + _project_list->set_enable_h_scroll(false); VBoxContainer *tree_vb = memnew(VBoxContainer); tree_hb->add_child(tree_vb); - scroll_children = memnew(VBoxContainer); - scroll_children->set_h_size_flags(SIZE_EXPAND_FILL); - scroll->add_child(scroll_children); Button *open = memnew(Button); open->set_text(TTR("Edit")); @@ -2238,14 +2551,13 @@ ProjectManager::ProjectManager() { npdialog->connect("projects_updated", this, "_on_projects_updated"); npdialog->connect("project_created", this, "_on_project_created"); + _load_recent_projects(); if (EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path")) { _scan_begin(EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path")); } - last_clicked = ""; - SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped"); run_error_diag = memnew(AcceptDialog); diff --git a/editor/project_manager.h b/editor/project_manager.h index d75d7164cc..4ccb99d6bd 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -39,6 +39,7 @@ #include "scene/gui/tree.h" class ProjectDialog; +class ProjectList; class ProjectListFilter; class ProjectManager : public Control { @@ -68,16 +69,13 @@ class ProjectManager : public Control { AcceptDialog *dialog_error; ProjectDialog *npdialog; - ScrollContainer *scroll; - VBoxContainer *scroll_children; HBoxContainer *projects_hb; TabContainer *tabs; + ProjectList *_project_list; OptionButton *language_btn; Control *gui_base; - Map<String, String> selected_list; // name -> main_scene - String last_clicked; bool importing; void _open_asset_library(); @@ -86,7 +84,6 @@ class ProjectManager : public Control { void _run_project_confirm(); void _open_selected_projects(); void _open_selected_projects_ask(); - void _show_project(const String &p_path); void _import_project(); void _new_project(); void _rename_project(); @@ -111,13 +108,13 @@ class ProjectManager : public Control { void _install_project(const String &p_zip_path, const String &p_title); void _dim_window(); - void _panel_draw(Node *p_hb); - void _panel_input(const Ref<InputEvent> &p_ev, Node *p_hb); void _unhandled_input(const Ref<InputEvent> &p_ev); - void _favorite_pressed(Node *p_hb); void _files_dropped(PoolStringArray p_files, int p_screen); void _scan_multiple_folders(PoolStringArray p_files); + void _on_order_option_changed(); + void _on_filter_option_changed(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 009ac603e2..aeee829de2 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -301,6 +301,8 @@ bool SceneTreeDock::_track_inherit(const String &p_target_scene_path, Node *p_de Ref<PackedScene> data = ResourceLoader::load(path); if (data.is_valid()) { p = data->instance(PackedScene::GEN_EDIT_STATE_INSTANCE); + if (!p) + continue; instances.push_back(p); } else break; diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 0c280b16b2..f7ff754a0b 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -418,6 +418,13 @@ int ScriptEditorDebugger::_update_scene_tree(TreeItem *parent, const Array &node } item->set_metadata(0, id); + // Set current item as collapsed if necessary + if (parent) { + if (!unfold_cache.has(id)) { + item->set_collapsed(true); + } + } + int children_count = nodes[current_index]; // Tracks the total number of items parsed in nodes, this is used to skips nodes that // are not direct children of the current node since we can't know in advance the total @@ -1009,7 +1016,10 @@ void ScriptEditorDebugger::_performance_draw() { Ref<Font> graph_font = get_font("font", "TextEdit"); if (which.empty()) { - perf_draw->draw_string(graph_font, Point2(0, graph_font->get_ascent()), TTR("Pick one or more items from the list to display the graph."), get_color("font_color", "Label"), perf_draw->get_size().x); + String text = TTR("Pick one or more items from the list to display the graph."); + + perf_draw->draw_string(graph_font, Point2i(MAX(0, perf_draw->get_size().x - graph_font->get_string_size(text).x), perf_draw->get_size().y + graph_font->get_ascent()) / 2, text, get_color("font_color", "Label"), perf_draw->get_size().x); + return; } diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index 505eab266f..947b0cca52 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -173,7 +173,7 @@ class ScriptEditorDebugger : public Control { void _set_reason_text(const String &p_reason, MessageType p_type); void _scene_tree_property_select_object(ObjectID p_object); void _scene_tree_property_value_edited(const String &p_prop, const Variant &p_value); - int _update_scene_tree(TreeItem *parent, const Array &items, int current_index); + int _update_scene_tree(TreeItem *parent, const Array &nodes, int current_index); void _video_mem_request(); diff --git a/editor/translations/af.po b/editor/translations/af.po index cc76d941e9..e220906bcb 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -137,6 +137,31 @@ msgstr "Anim Verander Roep" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Verander Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Verander Oorgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Verander Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Verander Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Verander Roep" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Verander Anim Lente" @@ -1740,7 +1765,7 @@ msgstr "Open 'n Lêer" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Verfris" @@ -1791,7 +1816,7 @@ msgstr "Gaan Vorentoe" msgid "Go Up" msgstr "Gaan Op" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Wissel Versteekte Lêers" @@ -1817,27 +1842,32 @@ msgstr "Skuif Gunsteling Af" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Voorskou:" +msgid "Go to previous folder." +msgstr "Gaan na ouer vouer" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Skep Vouer" +msgid "Go to next folder." +msgstr "Gaan na ouer vouer" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Gaan na ouer vouer" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Deursoek Klasse" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kon nie vouer skep nie." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Wissel Versteekte Lêers" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2740,14 +2770,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3062,6 +3084,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Lede" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4793,7 +4820,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6829,7 +6855,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7014,10 +7044,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9865,6 +9891,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Skep Nuwe" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11638,6 +11669,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Voorskou:" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Skep Vouer" + +#, fuzzy #~ msgid "Failed to create solution." #~ msgstr "Kon nie vouer skep nie." diff --git a/editor/translations/ar.po b/editor/translations/ar.po index c04d54564f..21d1f3e745 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -28,12 +28,13 @@ # DiscoverSquishy <noaimi@discoversquishy.me>, 2019. # ButterflyOfFire <ButterflyOfFire@protonmail.com>, 2019. # PhoenixHO <oussamahaddouche0@gmail.com>, 2019. +# orcstudio <orcstudio@orcstudio.org>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-09 10:47+0000\n" -"Last-Translator: PhoenixHO <oussamahaddouche0@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: orcstudio <orcstudio@orcstudio.org>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -154,6 +155,31 @@ msgid "Anim Change Call" msgstr "نداء تغيير التحريك" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "تغيير وقت الإطار الرئيسي للحركة" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "تغيير المقطع الإنتقالي" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "تحويل تغيير التحريك" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "تغيير قيمة الإطار الأساسي للحركة" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "نداء تغيير التحريك" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "تعديل طول عرض الحركة" @@ -469,7 +495,7 @@ msgstr "" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "تحديد الكل" #: editor/animation_track_editor.cpp #, fuzzy @@ -733,9 +759,8 @@ msgid "Connect to Node:" msgstr "صلها بالعقدة:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "لا يمكن الإتصال بالمُضيف:" +msgstr "الإتصال بالمخطوطة:" #: editor/connections_dialog.cpp #, fuzzy @@ -773,9 +798,8 @@ msgid "Extra Call Arguments:" msgstr "وسائط إستدعاء إضافية :" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "إعدادات الكبس" +msgstr "إعدادات متقدمة" #: editor/connections_dialog.cpp msgid "Deferred" @@ -1742,7 +1766,7 @@ msgstr "أظهر في مدير الملفات" msgid "New Folder..." msgstr "مجلد جديد..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "تحديث" @@ -1793,7 +1817,7 @@ msgstr "إذهب للأمام" msgid "Go Up" msgstr "إذهب للأعلي" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "أظهر الملفات المخفية" @@ -1818,27 +1842,33 @@ msgid "Move Favorite Down" msgstr "حرك المُفضلة للأسفل" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "المجلد السابق" +#, fuzzy +msgid "Go to previous folder." +msgstr "إذهب إلي المجلد السابق" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "المجلد اللاحق" +msgid "Go to next folder." +msgstr "إذهب إلي المجلد السابق" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "إذهب إلي المجلد السابق" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "إبحث في الأصناف" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "لا يمكن إنشاء المجلد." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "أظهر الملفات المخفية" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2792,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "إعدادات المُعدل" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "فتح في المُعدل التالي" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "إلغاء/تفعيل وضع الشاشة الكاملة" @@ -3127,6 +3148,11 @@ msgstr "الوقت" msgid "Calls" msgstr "ندائات" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "الأعضاء" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4891,7 +4917,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "الكل" @@ -6981,7 +7006,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7168,10 +7197,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -10082,6 +10107,11 @@ msgstr "فتح الكود" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "إنشاء %s جديد" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "حفظ المشهد" @@ -11889,6 +11919,17 @@ msgstr "يمكن تعيين المتغيرات فقط في الذروة ." msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "المجلد السابق" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "المجلد اللاحق" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "فتح في المُعدل التالي" + #~ msgid "Reverse" #~ msgstr "عكس" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index f99bccb1be..848408b8f3 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -139,6 +139,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "Промени Името на Анимацията:" @@ -1713,7 +1733,7 @@ msgstr "Покажи във Файлов Мениджър" msgid "New Folder..." msgstr "Нова папка..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1764,7 +1784,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Покажи Скрити Файлове" @@ -1790,27 +1810,32 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Предишен подпрозорец" +msgid "Go to previous folder." +msgstr "Към горната папка" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Създаване на папка" +msgid "Go to next folder." +msgstr "Към горната папка" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Към горната папка" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Търсене" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Неуспешно създаване на папка." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Покажи Скрити Файлове" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2715,14 +2740,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Настройки на редактора" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3042,6 +3059,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Файл:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4807,7 +4829,6 @@ msgid "Last" msgstr "Последна" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Всички" @@ -6857,7 +6878,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Изглед Отдясно." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Изглед Отдясно." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7044,10 +7070,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9951,6 +9973,11 @@ msgstr "Нова сцена" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Създай нови възли." + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Запазване на сцената" @@ -11794,6 +11821,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Предишен подпрозорец" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Създаване на папка" + #~ msgid "Reverse" #~ msgstr "В обратен ред" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 754d03598b..97f6925f1d 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -144,6 +144,31 @@ msgstr "অ্যানিমেশন (Anim) কল পরিবর্তন #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "অ্যানিমেশন (Anim) ভ্যালু পরিবর্তন করুন" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "অ্যানিমেশন (Anim) ট্র্যানজিশন পরিবর্তন করুন" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "অ্যানিমেশন (Anim) ট্রান্সফর্ম পরিবর্তন করুন" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "অ্যানিমেশন (Anim) ভ্যালু পরিবর্তন করুন" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "অ্যানিমেশন (Anim) কল পরিবর্তন করুন" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "অ্যানিমেশনের লুপ পরিবর্তন করুন" @@ -1783,7 +1808,7 @@ msgstr "ফাইল-ম্যানেজারে দেখুন" msgid "New Folder..." msgstr "ফোল্ডার তৈরি করুন" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "রিফ্রেস করুন" @@ -1834,7 +1859,7 @@ msgstr "সামনের দিকে যান" msgid "Go Up" msgstr "উপরের দিকে যান" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "অদৃশ্য ফাইলসমূহ অদলবদল/টগল করুন" @@ -1860,27 +1885,32 @@ msgstr "ফেবরিট/প্রিয়কে নিচের দিকে #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "পূর্বের ট্যাব" +msgid "Go to previous folder." +msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ফোল্ডার তৈরি করুন" +msgid "Go to next folder." +msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ক্লাসের অনুসন্ধান করুন" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "অদৃশ্য ফাইলসমূহ অদলবদল/টগল করুন" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2881,15 +2911,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "এডিটরের সেটিংস" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "এডিটরে খুলুন" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "পূর্ণ-পর্দা অদলবদল/টগল করুন" @@ -3229,6 +3250,11 @@ msgstr "সময়:" msgid "Calls" msgstr "ডাকুন (Call)" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "থিম এডিট করুন..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "চালু" @@ -5079,7 +5105,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "সকল" @@ -7232,9 +7257,14 @@ msgstr "পশ্চাৎ" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "দর্শনের সাথে সারিবদ্ধ করুন" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "নির্বাচনকে দর্শনের সাথে সারিবদ্ধ করুন" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ইনস্ট্যান্স করার জন্য প্রয়োজনীয় ধারক উপস্থিত নেই।" @@ -7435,10 +7465,6 @@ msgid "Focus Selection" msgstr "নির্বাচনে ফোকাস করুন" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "নির্বাচনকে দর্শনের সাথে সারিবদ্ধ করুন" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "নির্বাচন করুন" @@ -10466,6 +10492,11 @@ msgstr "পরবর্তী স্ক্রিপ্ট" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "নোডের নতুন অভিভাবক দান করুন" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "অর্থপূর্ন!" @@ -12422,6 +12453,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "পূর্বের ট্যাব" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ফোল্ডার তৈরি করুন" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "এডিটরে খুলুন" + #~ msgid "Reverse" #~ msgstr "উল্টান/বিপরীত দিকে ফিরান" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index a94af069e9..2ef6d44e3e 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "Canviar crida d'animació" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Modifica el temps de la clau" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Modifica la Transició d'Animació" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Modifica la Transformació de l'Animació" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Modifica el valor de la clau" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Canviar crida d'animació" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Canviar la durada de l'Animació" @@ -1685,7 +1710,7 @@ msgstr "Mostrar en el Gestor de Fitxers" msgid "New Folder..." msgstr "Nou Directori..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Refresca" @@ -1736,7 +1761,7 @@ msgstr "Endavant" msgid "Go Up" msgstr "Puja" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Commuta Fitxers Ocults" @@ -1761,23 +1786,31 @@ msgid "Move Favorite Down" msgstr "Mou Favorit Avall" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Directori Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Anar al directori pare." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Directori Següent" +#, fuzzy +msgid "Go to next folder." +msgstr "Anar al directori pare." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Anar al directori pare." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cerca Fitxers" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Eliminar carpeta actual de preferits." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Commutar visibilitat dels fitxers ocults." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2728,14 +2761,6 @@ msgstr "" "l'editor." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Obrir automàticament captures de pantalla" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Obrir en un editor d'imatges extern." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Mode Pantalla Completa" @@ -3056,6 +3081,11 @@ msgstr "Temps" msgid "Calls" msgstr "Crides" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activat" @@ -4749,7 +4779,6 @@ msgid "Last" msgstr "Últim" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tot" @@ -6808,9 +6837,15 @@ msgid "Rear" msgstr "Darrere" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear amb la Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinea la Selecció amb la Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hi ha cap node Pare per instanciar-li un fill." @@ -6999,10 +7034,6 @@ msgid "Focus Selection" msgstr "Focalitza't en la Selecció" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinea la Selecció amb la Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Selecciona una Eina" @@ -9998,6 +10029,11 @@ msgstr "Estendre el script" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Torna a Parentar el Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Entesos!" @@ -11953,6 +11989,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Les constants no es poden modificar." +#~ msgid "Previous Folder" +#~ msgstr "Directori Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Directori Següent" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Obrir automàticament captures de pantalla" + +#~ msgid "Open in an external image editor." +#~ msgstr "Obrir en un editor d'imatges extern." + #~ msgid "Reverse" #~ msgstr "Inverteix" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 5d372f4722..f3eaafab33 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -136,6 +136,31 @@ msgid "Anim Change Call" msgstr "Animace: změna volání" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animace: Změnit čas klíčového snímku" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animace: změna přechodu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animace: změna transformace" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animace: Změnit hodnotu klíčového snímku" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animace: změna volání" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Změnit délku animace" @@ -1728,7 +1753,7 @@ msgstr "Zobrazit ve správci souborů" msgid "New Folder..." msgstr "Nová složka..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Obnovit" @@ -1779,7 +1804,7 @@ msgstr "Jit dopředu" msgid "Go Up" msgstr "Jít o úroveň výš" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Zobrazit skryté soubory" @@ -1804,26 +1829,33 @@ msgid "Move Favorite Down" msgstr "Přesunout oblíbenou položku dolů" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Předchozí složka" +#, fuzzy +msgid "Go to previous folder." +msgstr "Jít na nadřazenou složku" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Další složka" +#, fuzzy +msgid "Go to next folder." +msgstr "Jít na nadřazenou složku" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Jít na nadřazenou složku" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Hledat soubory" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Nelze vytvořit složku." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Zobrazit skryté soubory" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2764,15 +2796,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Otevřít složku s daty a nastavením editoru" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Otevřít další editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Celá obrazovka" @@ -3091,6 +3114,11 @@ msgstr "Čas" msgid "Calls" msgstr "Volání" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editovat téma..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4790,7 +4818,6 @@ msgid "Last" msgstr "Poslední" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Všechny" @@ -6832,9 +6859,14 @@ msgstr "Zadní" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Zarovnat s výhledem" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Zarovnat výběr s pohledem" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -7025,10 +7057,6 @@ msgid "Focus Selection" msgstr "Zaměřit výběr" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Zarovnat výběr s pohledem" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Nástroj Výběr" @@ -9942,6 +9970,11 @@ msgstr "Otevřít skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Přidat/Vytvořit nový uzel" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Dává smysl!" @@ -11833,6 +11866,16 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanty není možné upravovat." +#~ msgid "Previous Folder" +#~ msgstr "Předchozí složka" + +#~ msgid "Next Folder" +#~ msgstr "Další složka" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Otevřít další editor" + #~ msgid "Reverse" #~ msgstr "Naopak" diff --git a/editor/translations/da.po b/editor/translations/da.po index 677ae45383..33b763b7ee 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -139,6 +139,31 @@ msgstr "Anim Skift Call" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Skift Keyframetid" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Skift Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Skift Transformering" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Skift Keyframeværdi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Skift Call" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Ændre Animation Navn:" @@ -1734,7 +1759,7 @@ msgstr "Vis i Filhåndtering" msgid "New Folder..." msgstr "Opret mappe..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Opdater" @@ -1785,7 +1810,7 @@ msgstr "Gå Fremad" msgid "Go Up" msgstr "Gå Op" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Skifter Skjulte Filer" @@ -1811,27 +1836,32 @@ msgstr "Flyt Favorit Ned" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Forrige fane" +msgid "Go to previous folder." +msgstr "Gå til overliggende mappe" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Opret Mappe" +msgid "Go to next folder." +msgstr "Gå til overliggende mappe" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Gå til overliggende mappe" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Søg Classes" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kunne ikke oprette mappe." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Skifter Skjulte Filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2779,15 +2809,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Åbn redaktør Data/Indstillinger-mappe" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Åbn næste Editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Skifter fuldskærm" @@ -3107,6 +3128,11 @@ msgstr "Tid" msgid "Calls" msgstr "Kald" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Medlemmer" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4874,7 +4900,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -6943,7 +6968,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7131,10 +7160,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Vælg værktøj" @@ -10039,6 +10064,11 @@ msgstr "Åben script" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Opret Ny %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Gem Scene" @@ -11911,6 +11941,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Forrige fane" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Opret Mappe" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Åbn næste Editor" + #~ msgid "Reverse" #~ msgstr "Omvendt" diff --git a/editor/translations/de.po b/editor/translations/de.po index eaf83fc0e6..0816cf1a85 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -43,12 +43,13 @@ # Marcus Naschke <marcus.naschke@gmail.com>, 2019. # datenbauer <d-vaupel@web.de>, 2019. # Alexander Hausmann <alexander-hausmann+weblate@posteo.de>, 2019. +# Nicolas Mohr <81moni1bif@hft-stuttgart.de>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" +"Last-Translator: Nicolas Mohr <81moni1bif@hft-stuttgart.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -169,6 +170,31 @@ msgid "Anim Change Call" msgstr "Aufruf ändern" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Schlüsselbildzeit ändern" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Übergang bearbeiten" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Transformation bearbeiten" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Schlüsselbildwert ändern" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Aufruf ändern" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Animationslänge ändern" @@ -1726,7 +1752,7 @@ msgstr "Im Dateimanager anzeigen" msgid "New Folder..." msgstr "Neuer Ordner..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Aktualisieren" @@ -1777,7 +1803,7 @@ msgstr "Vor" msgid "Go Up" msgstr "Hoch" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Versteckte Dateien ein- und ausblenden" @@ -1802,23 +1828,31 @@ msgid "Move Favorite Down" msgstr "Favorit nach unten schieben" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Vorheriger Ordner" +#, fuzzy +msgid "Go to previous folder." +msgstr "Gehe zu übergeordnetem Ordner." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Nächster Ordner" +#, fuzzy +msgid "Go to next folder." +msgstr "Gehe zu übergeordnetem Ordner." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Gehe zu übergeordnetem Ordner." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Dateien suchen" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Gegenwärtigen Ordner (de)favorisieren." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Versteckte Dateien ein- oder ausblenden." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2559,9 +2593,8 @@ msgid "Go to previously opened scene." msgstr "Gehe zu vorher geöffneter Szene." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Pfad kopieren" +msgstr "Text kopieren" #: editor/editor_node.cpp msgid "Next tab" @@ -2776,14 +2809,6 @@ msgstr "" "Bildschirmfotos werden im „Editor Data/Settings“-Verzeichnis gespeichert." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Bildschirmfotos automatisch öffnen" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "In externem Bildbearbeitungsprogramm öffnen." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Vollbildmodus umschalten" @@ -3104,6 +3129,11 @@ msgstr "Zeit" msgid "Calls" msgstr "Aufrufe" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Thema bearbeiten" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "An" @@ -4807,7 +4837,6 @@ msgid "Last" msgstr "Letzte" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -6831,9 +6860,15 @@ msgid "Rear" msgstr "Hinten" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Mit Sicht ausrichten" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Auswahl auf Ansicht ausrichten" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -7022,10 +7057,6 @@ msgid "Focus Selection" msgstr "Auswahl fokussieren" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Auswahl auf Ansicht ausrichten" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Werkzeugauswahl" @@ -9991,6 +10022,11 @@ msgid "Extend Script" msgstr "Skript erweitern" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Node umhängen" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Szenen-Wurzel erstellen" @@ -11939,6 +11975,18 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "Previous Folder" +#~ msgstr "Vorheriger Ordner" + +#~ msgid "Next Folder" +#~ msgstr "Nächster Ordner" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Bildschirmfotos automatisch öffnen" + +#~ msgid "Open in an external image editor." +#~ msgstr "In externem Bildbearbeitungsprogramm öffnen." + #~ msgid "Reverse" #~ msgstr "Umkehren" diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 3c832d2f8e..9b3fdf7b02 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -134,6 +134,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "Typ ändern" @@ -1708,7 +1728,7 @@ msgstr "Datei öffnen" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1759,7 +1779,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1785,12 +1805,12 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Node(s) löschen" +msgid "Go to previous folder." +msgstr "Node erstellen" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "Node erstellen" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp @@ -1798,12 +1818,16 @@ msgstr "Node erstellen" msgid "Go to parent folder." msgstr "Node erstellen" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2704,14 +2728,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3032,6 +3048,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Node Filter editieren" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4777,7 +4798,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6828,7 +6848,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7017,10 +7041,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9908,6 +9928,11 @@ msgid "Extend Script" msgstr "Script hinzufügen" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Node erstellen" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11736,6 +11761,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Node(s) löschen" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Node erstellen" + +#, fuzzy #~ msgid "Build Project" #~ msgstr "Projektname:" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 71df020be7..d239d252ac 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -121,6 +121,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1630,7 +1650,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1681,7 +1701,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1706,23 +1726,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2592,14 +2616,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2912,6 +2928,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4566,7 +4586,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6535,7 +6554,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6720,10 +6743,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9489,6 +9508,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 607802e222..e0be979450 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -131,6 +131,31 @@ msgid "Anim Change Call" msgstr "Anim Αλλαγή κλήσης" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Αλλαγή χρόνου στιγμιοτύπου" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Αλλαγή μετάβασης" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Αλλαγή μετασχηματισμού" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Αλλαγή τιμής στιγμιοτύπου" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Αλλαγή κλήσης" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Αλλαγή Μήκους Κίνησης" @@ -1686,7 +1711,7 @@ msgstr "Εμφάνιση στη διαχείριση αρχείων" msgid "New Folder..." msgstr "Νέος φάκελος..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Αναναίωση" @@ -1737,7 +1762,7 @@ msgstr "Πήγαινε μπροστά" msgid "Go Up" msgstr "Πήγαινε πάνω" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Εναλλαγή κρυμμένων αρχείων" @@ -1762,23 +1787,31 @@ msgid "Move Favorite Down" msgstr "Μετακίνηση αγαπημένου κάτω" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Προηγούμενος φάκελος" +#, fuzzy +msgid "Go to previous folder." +msgstr "Πήγαινε στον γονικό φάκελο." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Επόμενος φάκελος" +#, fuzzy +msgid "Go to next folder." +msgstr "Πήγαινε στον γονικό φάκελο." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Πήγαινε στον γονικό φάκελο." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Αναζήτηση αρχείων" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Εναλλαγή αγαπημένου τρέχοντος φακέλου." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Εναλλαγή ορατότητας κρυμένων αρχείων." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2739,14 +2772,6 @@ msgstr "" "επεξεργαστή." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Αυτόματο Άνοιγμα Στιγμιοτύπων Οθόνης" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Άνοιγμα σε εξωτερικό επεξεργαστή εικόνων." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Εναλλαγή πλήρους οθόνης" @@ -3067,6 +3092,11 @@ msgstr "Χρόνος" msgid "Calls" msgstr "Κλήσεις" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Επεξεργασία Θέματος" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Ναι" @@ -4770,7 +4800,6 @@ msgid "Last" msgstr "Τελευταίο" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Όλα" @@ -6792,9 +6821,15 @@ msgid "Rear" msgstr "Πίσω" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Στοίχιση με Προβολή" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Στοίχηση επιλογής με την προβολή" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -6984,10 +7019,6 @@ msgid "Focus Selection" msgstr "Εστίαση στην επιλογή" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Στοίχηση επιλογής με την προβολή" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Εργαλείο επιλογής" @@ -9973,6 +10004,11 @@ msgstr "Άνοιγμα δεσμής ενεργειών" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Επαναπροσδιορισμός γονέα κόμβου" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Βγάζει νόημα!" @@ -11931,6 +11967,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Προηγούμενος φάκελος" + +#~ msgid "Next Folder" +#~ msgstr "Επόμενος φάκελος" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Αυτόματο Άνοιγμα Στιγμιοτύπων Οθόνης" + +#~ msgid "Open in an external image editor." +#~ msgstr "Άνοιγμα σε εξωτερικό επεξεργαστή εικόνων." + #~ msgid "Reverse" #~ msgstr "Αντιστροφή" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index d286786a79..c3b755c31e 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -126,6 +126,31 @@ msgid "Anim Change Call" msgstr "Animado Aliigi Alvokon" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animado Aliigi Kernakadron Fojon" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animado Aliigi Transiron" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animado Aliigi Transformon" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animado Aliigi Kernakadron Valoron" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animado Aliigi Alvokon" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Aliigi Animadon Longecon" @@ -1650,7 +1675,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1701,7 +1726,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1726,23 +1751,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "Iri al Antaŭa Paŝo" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "Iri al Neksta Paŝo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2613,14 +2644,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2934,6 +2957,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4588,7 +4615,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6559,7 +6585,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6744,10 +6774,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9513,6 +9539,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 72515da510..2450229f9a 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -44,7 +44,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -165,6 +165,31 @@ msgid "Anim Change Call" msgstr "Cambiar Llamada de Animación" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Cambiar Tiempo del Fotograma Clave de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambiar Transición de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambiar Transformación de la Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambiar Valor de la Clave de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambiar Llamada de Animación" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambiar Duración de la Animación" @@ -1727,7 +1752,7 @@ msgstr "Mostrar en Explorador de Archivos" msgid "New Folder..." msgstr "Nueva Carpeta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Recargar" @@ -1778,7 +1803,7 @@ msgstr "Avanzar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Act./Desact. Archivos Ocultos" @@ -1803,23 +1828,31 @@ msgid "Move Favorite Down" msgstr "Bajar Favorito" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Carpeta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Carpeta Siguiente" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir a la carpeta padre." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Buscar archivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Eliminar carpeta actual de favoritos." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Ver/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2561,9 +2594,8 @@ msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Copiar Ruta" +msgstr "Copiar Texto" #: editor/editor_node.cpp msgid "Next tab" @@ -2778,14 +2810,6 @@ msgstr "" "Configuración." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Abrir Capturas de Pantalla Automáticamente" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Abrir en un editor de imágenes externo." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Cambiar a Pantalla Completa" @@ -3106,6 +3130,11 @@ msgstr "Tiempo" msgid "Calls" msgstr "Llamadas" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activado" @@ -4780,9 +4809,8 @@ msgid "Idle" msgstr "Inactivo" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Instalar" +msgstr "Instalar..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4813,7 +4841,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4827,9 +4854,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Solicitando..." +msgstr "Orden inverso." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4910,39 +4936,32 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Mover guía vertical" +msgstr "Mover Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Crear nueva guía vertical" +msgstr "Crear Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Eliminar guía vertical" +msgstr "Eliminar Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Mover guía horizontal" +msgstr "Mover Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Crear nueva guía horizontal" +msgstr "Crear Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Eliminar guía horizontal" +msgstr "Eliminar Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Crear nuevas guías horizontales y verticales" +msgstr "Crear Guías Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6831,9 +6850,15 @@ msgid "Rear" msgstr "Detrás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear con Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinear Selección Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hay padre al que instanciarle un hijo." @@ -7021,10 +7046,6 @@ msgid "Focus Selection" msgstr "Foco en Selección" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinear Selección Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleccionar Herramienta" @@ -7982,7 +8003,7 @@ msgstr "Cambiar Tipo de Entrada del Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Sólo GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8069,21 +8090,21 @@ msgid "Color uniform." msgstr "Color uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Devuelve el inverso de la raíz cuadrada del parámetro." +msgstr "" +"Devuelve el resultado booleano de la comparación de %s entre dos parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Igual (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Mayor Que (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Mayor o Igual Que (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8098,24 +8119,28 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre INF y un parámetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre NaN y un parámetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Menor Que (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Menor o Igual Que (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Diferente (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8125,15 +8150,16 @@ msgstr "" "o falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Devuelve la tangente del parámetro." +msgstr "Devuelve el resultado booleano de la comparación entre dos parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre INF (o NaN) y un " +"parámetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8224,18 +8250,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Devuelve el arcocoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico inverso del parámetro." +msgstr "Devuelve el coseno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Devuelve el arcoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico inverso del parámetro." +msgstr "Devuelve el seno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8246,9 +8270,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Devuelve el arcotangente de los parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica inversa del parámetro." +msgstr "Devuelve la tangente hiperbólica inversa del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8264,9 +8287,8 @@ msgid "Returns the cosine of the parameter." msgstr "Devuelve el coseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico del parámetro." +msgstr "Devuelve el coseno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8335,14 +8357,12 @@ msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8357,9 +8377,8 @@ msgid "Returns the sine of the parameter." msgstr "Devuelve el seno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico del parámetro." +msgstr "Devuelve el seno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8394,14 +8413,12 @@ msgid "Returns the tangent of the parameter." msgstr "Devuelve la tangente del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica del parámetro." +msgstr "Devuelve la tangente hiperbólica del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Sólo GLES3) Encuentra el valor truncado del parámetro." +msgstr "Encuentra el valor truncado del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8440,26 +8457,22 @@ msgid "Perform the texture lookup." msgstr "Realiza una búsqueda de texturas." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Textura cúbica uniforme." +msgstr "Búsqueda de textura cúbica uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Textura 2D uniforme." +msgstr "Búsqueda de textura uniforme 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Textura 2D uniforme." +msgstr "Búsqueda de textura uniforme 2D con triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Función Transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8469,7 +8482,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(GLES3 solamente) Calcula el producto exterior de un par de vectores.\n" +"Calcular el producto exterior de un par de vectores.\n" "\n" "OuterProduct trata el primer parámetro 'c' como un vector de columna (matriz " "con una columna) y el segundo parámetro 'r' como un vector de fila (matriz " @@ -8486,19 +8499,16 @@ msgid "Decomposes transform to four vectors." msgstr "Se descompone y transforma en cuatro vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Sólo GLES3) Calcula el determinante de una transformación." +msgstr "Calcula el determinante de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Sólo GLES3) Calcula el inverso de una transformación." +msgstr "Calcula el inverso de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Sólo GLES3) Calcula la transposición de una transformación." +msgstr "Calcula la transposición de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8545,18 +8555,17 @@ msgid "Calculates the dot product of two vectors." msgstr "Calcula el producto punto de dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"Devuelve un vector que apunta en la misma dirección que un vector de " +"Devuelve el vector que apunta en la misma dirección que un vector de " "referencia. La función tiene tres parámetros vectoriales: N, el vector a " "orientar, I, el vector incidente, y Nref, el vector de referencia. Si el " -"producto punto de I y Nref es menor que cero, el valor de retorno es N. De " -"lo contrario, se devuelve -N." +"producto de punto de I y Nref es menor que cero, el valor de retorno es N. " +"De lo contrario, se devuelve -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8579,18 +8588,16 @@ msgid "1.0 / vector" msgstr "1.0 / vector" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" -"Devuelve un vector que apunta en dirección a su reflexión ( a : vector " +"Devuelve el vector que apunta en la dirección de reflexión ( a : vector " "incidente, b : vector normal)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." -msgstr "Devuelve un vector que apunta en dirección a su refracción." +msgstr "Devuelve el vector que apunta en la dirección de refracción." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8689,69 +8696,58 @@ msgstr "" "esta)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(Sólo GLES3) (Sólo modo Fragmento/Luz) Función de derivación escalar." +msgstr "(Sólo modo Fragmento/Luz) Función de derivación escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) Función de derivación vectorial." +msgstr "(Sólo modo Fragmento/Luz) Función de derivación vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivado en 'x' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivado en 'x' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivado en 'x' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivado en 'x' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivado en 'y' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivado en 'y' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivado en 'y' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivado en 'y' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta " -"en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Suma del derivado absoluto " -"en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Escalar) Suma del derivado absoluto en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9979,6 +9975,11 @@ msgid "Extend Script" msgstr "Extender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reemparentar nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Convertir en Raíz de Escena" @@ -10196,9 +10197,8 @@ msgid "Script is valid." msgstr "El script es válido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Permitido: a-z, A-Z, 0-9 y _" +msgstr "Permitido: a-z, A-Z, 0-9, _ y ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11905,9 +11905,8 @@ msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Fuente inválida para el shader." +msgstr "Función de comparación inválida para este tipo." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11925,6 +11924,18 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Previous Folder" +#~ msgstr "Carpeta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Carpeta Siguiente" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Pantalla Automáticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir en un editor de imágenes externo." + #~ msgid "Reverse" #~ msgstr "Invertir" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 5089e16892..0b03b5517a 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-19 13:42+0000\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" "Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" @@ -137,6 +137,31 @@ msgid "Anim Change Call" msgstr "Cambiar Call de Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Cambiar Tiempo de Keyframe de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambio de transición Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambiar Transform de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambiar Valor de Keyframe de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambiar Call de Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambiar Duración de la Animación" @@ -1695,7 +1720,7 @@ msgstr "Mostrar en Explorador de Archivos" msgid "New Folder..." msgstr "Nueva Carpeta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Refrescar" @@ -1746,7 +1771,7 @@ msgstr "Avanzar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Act/Desact. Archivos Ocultos" @@ -1771,23 +1796,31 @@ msgid "Move Favorite Down" msgstr "Bajar Favorito" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Carpeta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Carpeta Siguiente" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir a la carpeta padre." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Buscar archivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Quitar carpeta actual de favoritos." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Ver/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2526,9 +2559,8 @@ msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Copiar Ruta" +msgstr "Copiar Texto" #: editor/editor_node.cpp msgid "Next tab" @@ -2742,14 +2774,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Las capturas se almacenan en la carpeta Editor Datta/Settings." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Abrir Capturas de Pantalla Automaticamente" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Abrir en editor de imagenes externo." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Act./Desact. Pantalla Completa" @@ -3071,6 +3095,11 @@ msgstr "Tiempo" msgid "Calls" msgstr "Llamadas" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -4744,9 +4773,8 @@ msgid "Idle" msgstr "Desocupado" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Instalar" +msgstr "Instalar..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4777,7 +4805,6 @@ msgid "Last" msgstr "Ultimo" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4791,9 +4818,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Solicitando..." +msgstr "Orden inverso." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4874,39 +4900,32 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Mover guía vertical" +msgstr "Mover Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Crear nueva guía vertical" +msgstr "Crear Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Quitar guía vertical" +msgstr "Eliminar Guía Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Mover guía horizontal" +msgstr "Mover Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Crear nueva guía horizontal" +msgstr "Crear Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Quitar guía horizontal" +msgstr "Eliminar Guía Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Crear nuevas guías horizontales y verticales" +msgstr "Crear Guías Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6794,9 +6813,15 @@ msgid "Rear" msgstr "Detrás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear con Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinear Selección Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hay padre al que instanciarle un hijo." @@ -6984,10 +7009,6 @@ msgid "Focus Selection" msgstr "Foco en Selección" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinear Selección Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleccionar Herramienta" @@ -7944,7 +7965,7 @@ msgstr "Se cambió el Tipo de Entrada de Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Sólo GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8031,21 +8052,21 @@ msgid "Color uniform." msgstr "Color uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Devuelve el inverso de la raíz cuadrada del parámetro." +msgstr "" +"Devuelve el resultado booleano de la comparación de %s entre dos parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Igual (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Mayor Que (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Mayor o Igual Que (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8060,24 +8081,28 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre INF y un parámetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre NaN y un parámetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Menor Que (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Menor o Igual Que (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "No igual (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8087,15 +8112,16 @@ msgstr "" "o falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Devuelve la tangente del parámetro." +msgstr "Devuelve el resultado booleano de la comparación entre dos parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Devuelve el resultado booleano de la comparación entre INF (o NaN) y un " +"parámetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8186,18 +8212,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Devuelve el arcocoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico inverso del parámetro." +msgstr "Devuelve el coseno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Devuelve el arcoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico inverso del parámetro." +msgstr "Devuelve el seno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8208,9 +8232,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Devuelve el arcotangente de los parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica inversa del parámetro." +msgstr "Devuelve la tangente hiperbólica inversa del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8226,9 +8249,8 @@ msgid "Returns the cosine of the parameter." msgstr "Devuelve el coseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico del parámetro." +msgstr "Devuelve el coseno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8297,14 +8319,12 @@ msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8319,9 +8339,8 @@ msgid "Returns the sine of the parameter." msgstr "Devuelve el seno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico del parámetro." +msgstr "Devuelve el seno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8356,14 +8375,12 @@ msgid "Returns the tangent of the parameter." msgstr "Devuelve la tangente del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica del parámetro." +msgstr "Devuelve la tangente hiperbólica del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Sólo GLES3) Encuentra el valor truncado del parámetro." +msgstr "Encuentra el valor truncado del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8402,26 +8419,22 @@ msgid "Perform the texture lookup." msgstr "Realiza una búsqueda de texturas." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Uniform de textura cúbica." +msgstr "Búsqueda en uniform de textura cúbica." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Uniform de Textura 2D." +msgstr "Búsqueda en uniform de textura 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Uniform de Textura 2D." +msgstr "Búsqueda en uniform de textura 2D con triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Función Transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8431,7 +8444,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(GLES3 solamente) Calcula el producto exterior de un par de vectores.\n" +"Calcula el producto exterior de un par de vectores.\n" "\n" "OuterProduct trata el primer parámetro 'c' como un vector de columna (matriz " "con una columna) y el segundo parámetro 'r' como un vector de fila (matriz " @@ -8448,19 +8461,16 @@ msgid "Decomposes transform to four vectors." msgstr "Descompone un transform en cuatro vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Sólo GLES3) Calcula el determinante de un transform." +msgstr "Calcula la determinante de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Sólo GLES3) Calcula el inverso de un transform." +msgstr "Calcula el inverso de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Sólo GLES3) Calcula la transposición de un transform." +msgstr "Calcula la transposición de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8507,18 +8517,17 @@ msgid "Calculates the dot product of two vectors." msgstr "Calcula el producto punto de dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"Devuelve un vector que apunta en la misma dirección que un vector de " +"Devuelve el vector que apunta en la misma dirección que un vector de " "referencia. La función tiene tres parámetros vectoriales: N, el vector a " "orientar, I, el vector incidente, y Nref, el vector de referencia. Si el " -"producto punto de I y Nref es menor que cero, el valor de retorno es N. De " -"lo contrario, se devuelve -N." +"producto de punto de I y Nref es menor que cero, el valor de retorno es N. " +"De lo contrario, se devuelve -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8541,18 +8550,16 @@ msgid "1.0 / vector" msgstr "1.0 / vector" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" -"Devuelve un vector que apunta en dirección a su reflexión ( a : vector " +"Devuelve el vector que apunta en la dirección de reflexión ( a : vector " "incidente, b : vector normal)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." -msgstr "Devuelve un vector que apunta en dirección a su refracción." +msgstr "Devuelve el vector que apunta en la dirección de refracción." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8650,68 +8657,59 @@ msgstr "" "dirección de vista de la camara ( pasale los puntos asociados)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(Sólo GLES3) (Sólo modo Fragmento/Luz) Función derivada escalar." +msgstr "(Sólo modo Fragmento/Luz) Función derivada escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(Sólo GLES3) (Sólo modo Fragmento/Luz) Función derivada vectorial." +msgstr "(Sólo modo Fragmento/Luz) Función derivada vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivada en 'x' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivada en 'x' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivada en 'x' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivada en 'x' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivada en 'y' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivada en 'y' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivada en 'y' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivada en 'y' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta " -"en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Suma de la derivada " -"absoluta en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Escalar) Suma de la derivada absoluta en 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9161,13 +9159,13 @@ msgstr "" "de proyectos." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"Estás a punto de examinar %s carpetas en busca de proyectos de Godot. " -"¿Confirmar?" +"¿Estás seguro de querer examinar %s carpetas en busca de proyectos de Godot " +"existentes?\n" +"Podría demorar un rato." #: editor/project_manager.cpp msgid "Project Manager" @@ -9190,9 +9188,8 @@ msgid "New Project" msgstr "Proyecto Nuevo" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Quitar punto" +msgstr "Eliminar Faltantes" #: editor/project_manager.cpp msgid "Templates" @@ -9211,13 +9208,12 @@ msgid "Can't run project" msgstr "No se puede ejecutar el proyecto" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"Actualmente no tenés ningun proyecto.\n" -"Te gustaría explorar los ejemplos oficiales en la Biblioteca de Assets?" +"Actualmente no tenés ningún proyecto.\n" +"¿Te gustaría explorar los ejemplos oficiales en la Biblioteca de Assets?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9244,9 +9240,8 @@ msgstr "" "'\\' o '\"'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "La acción '%s' ya existe!" +msgstr "Ya existe una acción con el nombre '%s'." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9465,9 +9460,8 @@ msgid "Override For..." msgstr "Sobreescribir Para..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "The editor must be restarted for changes to take effect." -msgstr "Se debe reiniciar el editor para que los cambios surtan efecto" +msgstr "Debe reiniciarse el editor para que los cambios surtan efecto." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9526,14 +9520,12 @@ msgid "Locales Filter" msgstr "Filtro de Locales" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Mostrar todos los locales" +msgstr "Mostrar Todas las Localizaciones" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Mostrar solo los locales seleccionados" +msgstr "Mostrar Sólo las Localizaciones Seleccionadas" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9621,9 +9613,8 @@ msgid "Suffix" msgstr "Sufijo" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" -msgstr "Opciones avanzadas" +msgstr "Opciones Avanzadas" #: editor/rename_dialog.cpp msgid "Substitute" @@ -9884,9 +9875,8 @@ msgid "User Interface" msgstr "Interfaz de Usuario" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Eliminar Nodo" +msgstr "Otro Nodo" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -9930,18 +9920,16 @@ msgid "Clear Inheritance" msgstr "Limpiar Herencia" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" -msgstr "Abrir documentación" +msgstr "Abrir Documentación" #: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Agregar Nodo Hijo" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Colapsar Todos" +msgstr "Expandir/Colapsar Todo" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9952,6 +9940,11 @@ msgid "Extend Script" msgstr "Extender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reemparentar Nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Convertir en Raíz de Escena" @@ -9972,9 +9965,8 @@ msgid "Delete (No Confirm)" msgstr "Eliminar (Sin Confirmación)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Agregar/Crear un Nuevo Nodo" +msgstr "Añadir/Crear un Nuevo Nodo." #: editor/scene_tree_dock.cpp msgid "" @@ -10009,19 +10001,16 @@ msgid "Toggle Visible" msgstr "Act/Desact. Visible" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Seleccionar Nodo" +msgstr "Desbloquear Nodo" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Botón 7" +msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Error de Conexión" +msgstr "(Conectando Desde)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -10052,9 +10041,8 @@ msgstr "" "Click para mostrar el panel de grupos." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Abrir Script" +msgstr "Abrir Script:" #: editor/scene_tree_editor.cpp msgid "" @@ -10106,39 +10094,32 @@ msgid "Select a Node" msgstr "Seleccionar un Nodo" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "La ruta está vacía" +msgstr "La ruta está vacía." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Nombre de archivo vacio" +msgstr "El nombre del archivo está vacío." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "La ruta no es local" +msgstr "La ruta no es local." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Ruta base inválida" +msgstr "Ruta base inválida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Existe un directorio con el mismo nombre" +msgstr "Existe un directorio con el mismo nombre." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Extensión invalida" +msgstr "Extensión inválida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Extensión incorrecta elegida" +msgstr "Extensión incorrecta elegida." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -10157,53 +10138,44 @@ msgid "N/A" msgstr "N/A" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Abrir Script/Elegir Ubicación" +msgstr "Abrir Script / Seleccionar Ubicación" #: editor/script_create_dialog.cpp msgid "Open Script" msgstr "Abrir Script" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "El archivo existe, será reutilizado" +msgstr "El archivo existe, será reutilizado." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Nombre de clase inválido" +msgstr "Nombre de clase inválido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "Ruta o nombre del padre heredado inválido" +msgstr "Ruta o nombre del padre heredado inválido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Script válido" +msgstr "El script es válido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Permitidos: a-z, A-Z, 0-9 y _" +msgstr "Permitido: a-z, A-Z, 0-9, _ y ." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Script Integrado (dentro del archivo de escena)" +msgstr "Script Integrado (dentro del archivo de escena)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Crear script nuevo" +msgstr "Se creará un nuevo archivo de script." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Cargar script existente" +msgstr "Se cargará un archivo de script existente." #: editor/script_create_dialog.cpp msgid "Language" @@ -10470,9 +10442,8 @@ msgid "Enabled GDNative Singleton" msgstr "Activar Singleton GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "Desactivar Update Spinner" +msgstr "GDNative Singleton desactivado" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10562,9 +10533,8 @@ msgid "GridMap Fill Selection" msgstr "Llenar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "Eliminar Seleccionados en GridMap" +msgstr "Pegar lo Seleccionado en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -10944,9 +10914,8 @@ msgid "Available Nodes:" msgstr "Nodos Disponibles:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Seleccioná o creá una función para editar el grafo" +msgstr "Selecciona o crea una función para editar el gráfico." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11277,13 +11246,12 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensiones de la imagen del splash inválidas (debería ser 620x300)." #: scene/2d/animated_sprite.cpp -#, fuzzy msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"Un recurso SpriteFrames debe ser creado o seteado en la propiedad 'Frames' " -"para que AnimatedSprite pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite pueda mostrar frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11346,12 +11314,12 @@ msgstr "" "\"Particles Animation\" activado." #: scene/2d/light_2d.cpp -#, fuzzy msgid "" "A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Se debe proveer una textura con la forma de la luz a la propiedad 'texture'." +"Se debe proporcionar una textura con la forma de la luz a la propiedad " +"\"Texture\"." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11361,9 +11329,10 @@ msgstr "" "efecto." #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "The occluder polygon for this occluder is empty. Please draw a polygon." -msgstr "El polígono de este oclusor está vacío. ¡Dibuja un polígono!" +msgstr "" +"El polígono oclusor para este oclusor está vacío. Por favor, dibujá un " +"polígono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11461,51 +11430,44 @@ msgstr "" "RigidBody2D, KinematicBody2D, etc. para que puedan tener forma." #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "" "VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funciona mejor cuando se usa con la raíz de escena " +"VisibilityEnabler2D funciona mejor cuando se usa con la raíz de la escena " "editada directamente como padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRCamera must have an ARVROrigin node as its parent." -msgstr "ARVRCamera debe tener un nodo ARVROrigin como su padre" +msgstr "ARVRCamera tiene que tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController debe tener un nodo ARVROrigin como su padre" +msgstr "ARVRController debe tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" -"El id de controlador no debe ser 0 o este controlador no será vinculado a un " -"controlador real" +"El ID del controlador no debe ser 0 o este controlador no estará asociado a " +"un controlador real." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor debe tener un nodo ARVROrigin como su padre" +msgstr "ARVRAnchor debe tener un nodo ARVROrigin como su padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" -"El id de anclaje no debe ser 0 o este anclaje no podrá ser vinculado a un " -"anclaje real" +"El ID del ancla no puede ser 0 o este ancla no estará asociada a una ancla " +"real." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin requiere un nodo hijo ARVRCamera" +msgstr "ARVROrigin requiere un nodo hijo ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -11567,13 +11529,12 @@ msgstr "" "RigidBody, KinematicBody, etc. para darles un shape." #: scene/3d/collision_shape.cpp -#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it." msgstr "" -"Se debe proveer un shape para que CollisionShape funcione. Creale un recurso " -"shape!" +"Se debe proporcionar un shape para que CollisionShape funcione. Por favor, " +"crea un recurso de shape para ello." #: scene/3d/collision_shape.cpp msgid "" @@ -11588,13 +11549,12 @@ msgid "Nothing is visible because no mesh has been assigned." msgstr "Nada visible ya que no se asignó ningún mesh." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"Animar CPUParticles requiere el uso de un SpatialMaterial con \"Billboard " -"Particles\" activado." +"La animación de CPUParticles requiere el uso de un SpatialMaterial cuyo Modo " +"Billboard esté ajustado a \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -11644,13 +11604,12 @@ msgid "" msgstr "Nada visible ya que no se asigno pasadas de dibujado a los meshes." #: scene/3d/particles.cpp -#, fuzzy msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"Animar Particles requiere el uso de un SpatialMaterial con \"Billboard " -"Particles\" activado." +"La animación de partículas requiere el uso de un SpatialMaterial cuyo Modo " +"Billboard esté ajustado a \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -11658,13 +11617,12 @@ msgstr "" "PathFollow solo funciona cuando está asignado como hijo de un nodo Path." #: scene/3d/path.cpp -#, fuzzy msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED requiere que \"Up Vector\" esté activo en el " -"recurso Curve de su Path padre." +"PathFollow's ROTATION_ORIENTED requiere que \"Up Vector\" esté activado en " +"el recurso Curve de su Path padre." #: scene/3d/physics_body.cpp msgid "" @@ -11677,17 +11635,16 @@ msgstr "" "Cambiá el tamaño de los collision shapes hijos." #: scene/3d/remote_transform.cpp -#, fuzzy msgid "" "The \"Remote Path\" property must point to a valid Spatial or Spatial-" "derived node to work." msgstr "" -"La propiedad Path debe apuntar a un nodo Spatial valido para funcionar." +"La propiedad \"Remote Path\" debe apuntar a un nodo Spatial o derivado de " +"Spatial válido para que funcione." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "Este cuerpo sera ignorado hasta que le asignes un mesh" +msgstr "Este cuerpo será ignorado hasta que se establezca un mesh." #: scene/3d/soft_body.cpp msgid "" @@ -11700,13 +11657,12 @@ msgstr "" "En su lugar, cambiá el tamaño de los collision shapes hijos." #: scene/3d/sprite_3d.cpp -#, fuzzy msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' " -"para que AnimatedSprite3D pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite3D pueda mostrar frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -11761,9 +11717,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nada conectado a la entrada '%s' del nodo '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "No root AnimationNode for the graph is set." -msgstr "No hay asignado ningún nodo AnimationNode raíz para el gráfico." +msgstr "No se ha establecido ningún nodo AnimationNode raíz para el gráfico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11776,9 +11731,8 @@ msgstr "" "La ruta asignada al AnimationPlayer no apunta a un nodo AnimationPlayer." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "The AnimationPlayer root node is not a valid node." -msgstr "La raíz del AnimationPlayer no es un nodo válido." +msgstr "La raíz del nodo AnimationPlayer no es un nodo válido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11793,9 +11747,8 @@ msgid "HSV" msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Yaw" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11806,16 +11759,15 @@ msgid "Add current color as a preset." msgstr "Agregar color actual como preset." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" "If you don't intend to add a script, use a plain Control node instead." msgstr "" -"El contenedor en sí mismo no sirve ningún propósito a menos que un script " -"configure el comportamiento de posicionamiento de sus hijos.\n" -"Si no tenés pensado usar un script, entonces simplemente usá un nodo " -"'Control' en su lugar." +"Container por sí mismo no sirve para nada a menos que un script defina el " +"comportamiento de colocación de sus hijos.\n" +"Si no tenés intención de añadir un script, utilizá un nodo de Control " +"sencillo." #: scene/gui/control.cpp msgid "" @@ -11835,31 +11787,28 @@ msgid "Please Confirm..." msgstr "Confirmá, por favor..." #: scene/gui/popup.cpp -#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"Los popups se esconderán por defecto a menos que llames a popup() o " -"cualquiera de las funciones popup*(). Sin embargo, no hay problema con " -"hacerlos visibles para editar, aunque se esconderán al ejecutar." +"Los popups se ocultarán por defecto a menos que llames a popup() o a " +"cualquiera de las funciones popup*(). Puedes hacerlos visibles para su " +"edición, pero se esconderán al iniciar." #: scene/gui/range.cpp -#, fuzzy msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." -msgstr "Si exp_edit es verdadero min_value debe ser > 0." +msgstr "Si \"Exp Edit\" está activado, \"Min Value\" debe ser mayor que 0." #: scene/gui/scroll_container.cpp -#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" "Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer está diseñado para trabajar con un único control hijo.\n" -"Usa un container como hijo (VBox, HBox, etc), o un Control y setea el tamaño " -"mínimo personalizado de forma manual." +"ScrollContainer está pensado para funcionar con un solo control hijo.\n" +"Utilizá un container como hijo (VBox, HBox, etc.), o un Control y establecé " +"manualmente el tamaño mínimo personalizado." #: scene/gui/tree.cpp msgid "(Other)" @@ -11906,18 +11855,16 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for preview." -msgstr "Fuente inválida para el shader." +msgstr "Fuente inválida para la vista previa." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Fuente inválida para el shader." +msgstr "Función de comparación inválida para este tipo." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11935,6 +11882,18 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Previous Folder" +#~ msgstr "Carpeta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Carpeta Siguiente" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Pantalla Automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir en editor de imagenes externo." + #~ msgid "Reverse" #~ msgstr "Invertir" diff --git a/editor/translations/et.po b/editor/translations/et.po index 437d4ef636..18b8252b94 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Muuda Animatsiooni Pikkust" @@ -1637,7 +1657,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1688,7 +1708,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1713,23 +1733,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "Mine Eelmisele Sammule" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "Mine Järgmisele Sammule" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2600,14 +2626,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2920,6 +2938,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4574,7 +4596,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6545,7 +6566,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6730,10 +6755,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9499,6 +9520,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index eb7d03301b..60e6216f01 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -146,6 +146,31 @@ msgstr "فراخوانی را در انیمیشن تغییر بده" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "تغییر زمان فریم کلید در انیمیشن" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "انتقال را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "انتقال را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "تغییر مقدار فریم کلید در انیمیشن" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "فراخوانی را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "طول انیمیشن را تغییر بده" @@ -1750,7 +1775,7 @@ msgstr "باز شدن مدیر پروژه؟" msgid "New Folder..." msgstr "ساختن پوشه..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1801,7 +1826,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1827,26 +1852,31 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "زبانه قبلی" +msgid "Go to previous folder." +msgstr "رفتن به پوشه والد" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ساختن پوشه" +msgid "Go to next folder." +msgstr "رفتن به پوشه والد" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "رفتن به پوشه والد" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "جستجوی کلاسها" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ناتوان در ساختن پوشه." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2748,15 +2778,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ویرایشگر ترجیحات" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "گشودن ویرایشگر متن" - -#: editor/editor_node.cpp #, fuzzy msgid "Toggle Fullscreen" msgstr "حالت تمام صفحه" @@ -3082,6 +3103,11 @@ msgstr "زمان:" msgid "Calls" msgstr "فراخوانی" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "عضوها" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4837,7 +4863,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "همه" @@ -6910,7 +6935,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7103,10 +7132,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "همهی انتخاب ها" @@ -10026,6 +10051,11 @@ msgid "Extend Script" msgstr "باز کردن و اجرای یک اسکریپت" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "گره تغییر والد" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11929,6 +11959,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "زبانه قبلی" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ساختن پوشه" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "گشودن ویرایشگر متن" + #~ msgid "Reverse" #~ msgstr "معکوس" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 85e16ceb98..e6a6e101b8 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Animaatio: muuta kutsua" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animaatio: muuta avainruudun aikaa" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animaatio: muuta siirtymää" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animaatio: muuta muunnosta" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animaatio: muuta avainruudun arvoa" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animaatio: muuta kutsua" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Muuta animaation pituutta" @@ -1684,7 +1709,7 @@ msgstr "Näytä tiedostonhallinnassa" msgid "New Folder..." msgstr "Uusi kansio..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Päivitä" @@ -1735,7 +1760,7 @@ msgstr "Mene eteenpäin" msgid "Go Up" msgstr "Mene ylös" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Näytä piilotiedostot" @@ -1760,23 +1785,31 @@ msgid "Move Favorite Down" msgstr "Siirrä suosikkia alas" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Edellinen kansio" +#, fuzzy +msgid "Go to previous folder." +msgstr "Siirry yläkansioon." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Seuraava kansio" +#, fuzzy +msgid "Go to next folder." +msgstr "Siirry yläkansioon." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Siirry yläkansioon." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Etsi tiedostoista" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Kansio suosikkeihin." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Aseta piilotiedostojen näyttäminen." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2498,9 +2531,8 @@ msgid "Go to previously opened scene." msgstr "Mene aiemmin avattuun skeneen." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Kopioi polku" +msgstr "Kopioi teksti" #: editor/editor_node.cpp msgid "Next tab" @@ -2712,14 +2744,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Kuvakaappaukset tallennetaan editorin data/asetuskansioon." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Avaa kuvakaappaukset automaattisesti" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Avaa ulkoisessa kuvankäsittelyohjelmassa." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Siirry koko näytön tilaan" @@ -3038,6 +3062,11 @@ msgstr "Aika" msgid "Calls" msgstr "Kutsuja" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Muokkaa teemaa" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Päällä" @@ -4707,9 +4736,8 @@ msgid "Idle" msgstr "Toimeton" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Asenna" +msgstr "Asenna..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4740,7 +4768,6 @@ msgid "Last" msgstr "Viimeinen" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Kaikki" @@ -4754,9 +4781,8 @@ msgid "Sort:" msgstr "Lajittele:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Pyydetään..." +msgstr "Käännä lajittelu." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4837,39 +4863,32 @@ msgid "Rotation Step:" msgstr "Kierron välistys:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" msgstr "Siirrä pystysuoraa apuviivaa" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Luo uusi pystysuora apuviiva" +msgstr "Luo pystysuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" msgstr "Poista pystysuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" msgstr "Siirrä vaakasuoraa apuviivaa" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Luo uusi vaakasuora apuviiva" +msgstr "Luo vaakasuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" msgstr "Poista vaakasuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Luo uudet vaaka- ja pystysuorat apuviivat" +msgstr "Luo vaaka- ja pystysuorat apuviivat" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6756,9 +6775,15 @@ msgid "Rear" msgstr "Taka" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Kohdista näkymään" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Kohdista valinta näkymään" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Isäntää, jonka alle ilmentymä luodaan, ei ole valittu." @@ -6946,10 +6971,6 @@ msgid "Focus Selection" msgstr "Kohdista valintaan" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Kohdista valinta näkymään" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Valintatyökalu" @@ -7906,7 +7927,7 @@ msgstr "Visual Shaderin syötteen tyyppi vaihdettu" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Vain GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -7993,21 +8014,20 @@ msgid "Color uniform." msgstr "Väri-uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Palauttaa parametrin käänteisen neliöjuuren." +msgstr "Palauttaa kahden parametrin %s vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Yhtä suuri (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Suurempi kuin (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Yhtä suuri tai suurempi kuin (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8021,25 +8041,25 @@ msgstr "" msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "Palauttaa INF ja skalaarin parametrien vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." -msgstr "" +msgstr "Palauttaa NaN- ja skalaariparametrien vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Pienempi kuin (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Yhtä suuri tai pienempi kuin (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Erisuuri (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8048,15 +8068,15 @@ msgstr "" "Palauttaa liitetyn vektorin, jos annettu totuusarvo on tosi tai epätosi." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Palauttaa parametrin tangentin." +msgstr "Palauttaa kahden parametrin vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Palauttaa INF- (tai NaN-) ja skalaariparametrien vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8147,18 +8167,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Palauttaa parametrin arkuskosinin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen kosinin." +msgstr "Palauttaa parametrin käänteisen hyperbolisen kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Palauttaa parametrin arkussinin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen sinin." +msgstr "Palauttaa parametrin käänteisen hyperbolisen sinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8169,9 +8187,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Palauttaa parametrien arkustangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen tangentin." +msgstr "Palauttaa parametrin käänteisen hyperbolisen tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8188,9 +8205,8 @@ msgid "Returns the cosine of the parameter." msgstr "Palauttaa parametrin kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin hyperbolisen kosinin." +msgstr "Palauttaa parametrin hyperbolisen kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8261,14 +8277,12 @@ msgid "1.0 / scalar" msgstr "1.0 / skalaari" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Vain GLES3) Etsii parametria lähinnä olevan kokonaisluvun." +msgstr "Etsii parametria lähinnä olevan kokonaisluvun." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Vain GLES3) Etsii parametria lähinnä olevan parillisen kokonaisluvun." +msgstr "Etsii parametria lähinnä olevan parillisen kokonaisluvun." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8283,9 +8297,8 @@ msgid "Returns the sine of the parameter." msgstr "Palauttaa parametrin sinin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin hyperbolisen sinin." +msgstr "Palauttaa parametrin hyperbolisen sinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8320,14 +8333,12 @@ msgid "Returns the tangent of the parameter." msgstr "Palauttaa parametrin tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin hyperbolisen tangentin." +msgstr "Palauttaa parametrin hyperbolisen tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Vain GLES3) Hakee parametrin katkaistun arvon." +msgstr "Hakee parametrin katkaistun arvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8366,26 +8377,22 @@ msgid "Perform the texture lookup." msgstr "Suorittaa tekstuurin haun." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Kuutiollinen tekstuuriuniformi." +msgstr "Kuutiollisen tekstuuriuniformin haku." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "2D-tekstuuriuniformi." +msgstr "2D-tekstuuriuniformin haku." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "2D-tekstuuriuniformi." +msgstr "2D-tekstuuriuniformin haku kolmitasolla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Muunnosfunktio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8395,7 +8402,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Vain GLES3) Laskee vektoriparin ulkotulon.\n" +"Laskee vektoriparin ulkotulon.\n" "\n" "Ulkotulo ottaa ensimmäisen parametrin 'c' sarakevektorina (matriisi, jolla " "on yksi sarake) ja toisen parametrin 'r' rivivektorina (matriisi, jolla on " @@ -8412,19 +8419,16 @@ msgid "Decomposes transform to four vectors." msgstr "Hajoittaa muunnoksen neljään vektoriin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Vain GLES3) Laskee muunnoksen determinantin." +msgstr "Laskee muunnoksen determinantin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Vain GLES3) Laskee muunnoksen käänteismatriisin." +msgstr "Laskee muunnoksen käänteismatriisin." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Vain GLES3) Laskee muunnoksen transpoosin." +msgstr "Laskee muunnoksen transpoosin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8471,17 +8475,16 @@ msgid "Calculates the dot product of two vectors." msgstr "Laskee kahden vektorin pistetulon." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"Palauttaa vektorin, joka osoittaa samaan suuntaan kuin viitevektori. " -"Funktiolla on kolme parametria: N eli suunnattava vektori, I eli " -"tulovektori, ja Nref eli viitevektori. Jos I ja Nref pistetulo on pienempi " -"kuin nolla, paluuarvo on N. Muutoin palautetaan -N." +"Palauttaa vektorin, joka osoittaa samaan suuntaan kuin viitevektori. Funktio " +"ottaa kolme vektoriparametria: N eli suunnattava vektori, I eli tulovektori, " +"ja Nref eli viitevektori. Jos I ja Nref pistetulo on pienempi kuin nolla, " +"paluuarvo on N. Muutoin palautetaan -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8504,7 +8507,6 @@ msgid "1.0 / vector" msgstr "1.0 / vektori" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." @@ -8513,7 +8515,6 @@ msgstr "" "b : normaalivektori )." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "Palauttaa vektorin, joka osoittaa taittumisen suuntaan." @@ -8612,67 +8613,59 @@ msgstr "" "suuntavektorin pistetuloon (välitä nämä syötteinä)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(Vain GLES3) (Vain Fragment/Light tilat) Skalaariderivaattafunktio." +msgstr "(Vain Fragment/Light tilat) Skalaariderivaattafunktio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(Vain GLES3) (Vain Fragment/Light tilat) Vektoriderivaattafunktio." +msgstr "(Vain Fragment/Light tilat) Vektoriderivaattafunktio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Vektori) 'x' derivaatta käyttäen " +"(Vain Fragment/Light tilat) (Vektori) 'x' derivaatta käyttäen " "paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Skalaari) 'x' derivaatta käyttäen " +"(Vain Fragment/Light tilat) (Skalaari) 'x' derivaatta käyttäen " "paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Vektori) 'y' derivaatta käyttäen " +"(Vain Fragment/Light tilat) (Vektori) 'y' derivaatta käyttäen " "paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Skalaari) 'y' derivaatta käyttäen " +"(Vain Fragment/Light tilat) (Skalaari) 'y' derivaatta käyttäen " "paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Vektori) 'x' ja 'y' derivaattojen " -"itseisarvojen summa." +"(Vain Fragment/Light tilat) (Vektori) 'x' ja 'y' derivaattojen itseisarvojen " +"summa." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Vain GLES3) (Vain Fragment/Light tilat) (Skalaari) 'x' ja 'y' derivaattojen " +"(Vain Fragment/Light tilat) (Skalaari) 'x' ja 'y' derivaattojen " "itseisarvojen summa." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9897,6 +9890,11 @@ msgid "Extend Script" msgstr "Laajenna skriptiä" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Vaihda solmun isäntää" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Tee skenen juuri" @@ -10113,9 +10111,8 @@ msgid "Script is valid." msgstr "Skripti kelpaa." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Sallittu: a-z, A-Z, 0-9 ja _" +msgstr "Sallittu: a-z, A-Z, 0-9, _ ja ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11792,9 +11789,8 @@ msgid "Invalid source for shader." msgstr "Virheellinen lähde sävyttimelle." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Virheellinen lähde sävyttimelle." +msgstr "Virheellinen vertailufunktio tälle tyypille." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11812,6 +11808,18 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "Previous Folder" +#~ msgstr "Edellinen kansio" + +#~ msgid "Next Folder" +#~ msgstr "Seuraava kansio" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Avaa kuvakaappaukset automaattisesti" + +#~ msgid "Open in an external image editor." +#~ msgstr "Avaa ulkoisessa kuvankäsittelyohjelmassa." + #~ msgid "Reverse" #~ msgstr "Käänteinen" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index c3a5b4bb18..c863ce1071 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1636,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1687,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1712,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2598,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2919,6 +2935,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4573,7 +4593,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6546,7 +6565,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6731,10 +6754,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9502,6 +9521,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index dac3cbe9ca..d5798892a5 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -58,12 +58,13 @@ # Patrick Zoch Alves <patrickzochalves@gmail.com>, 2019. # Alexis Comte <comtealexis@gmail.com>, 2019. # Julian Murgia <the.straton@gmail.com>, 2019. +# Ducoté <Raphalielle@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-17 09:20+0000\n" -"Last-Translator: Julian Murgia <the.straton@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Hugo Locurcio <hugo.locurcio@hugo.pro>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -183,6 +184,31 @@ msgid "Anim Change Call" msgstr "Changer l'appel de l'animation" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Modifier le temps de l'image-clé" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Changer la transition de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Changer la transformation de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Changer la valeur de l'image-clé de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Changer l'appel de l'animation" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Modifier la longueur de l'animation" @@ -1158,7 +1184,7 @@ msgstr "Licence" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "Licence tierce partie" +msgstr "Licences tierce partie" #: editor/editor_about.cpp msgid "" @@ -1754,7 +1780,7 @@ msgstr "Montrer dans le gestionnaire de fichiers" msgid "New Folder..." msgstr "Nouveau dossier..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Rafraîchir" @@ -1805,7 +1831,7 @@ msgstr "Avancer" msgid "Go Up" msgstr "Monter" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Basculer les fichiers cachés" @@ -1830,23 +1856,31 @@ msgid "Move Favorite Down" msgstr "Déplacer le favori vers le bas" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Dossier précédent" +#, fuzzy +msgid "Go to previous folder." +msgstr "Aller au dossier parent." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Dossier suivant" +#, fuzzy +msgid "Go to next folder." +msgstr "Aller au dossier parent." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Aller au dossier parent." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Rechercher des fichiers" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Ajouter ou supprimer des favoris le dossier courant." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Activer / désactiver la visibilité des fichiers cachés." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2014,7 +2048,7 @@ msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "Chercher dans l'aide" +msgstr "Rechercher dans l'aide" #: editor/editor_help_search.cpp msgid "Display All" @@ -2542,8 +2576,9 @@ msgid "Close Other Tabs" msgstr "Fermer les autres onglets" #: editor/editor_node.cpp +#, fuzzy msgid "Close Tabs to the Right" -msgstr "" +msgstr "Fermer la fenêtre à droite" #: editor/editor_node.cpp msgid "Close All Tabs" @@ -2686,7 +2721,7 @@ msgstr "Ouvrir le dossier de données du projets" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Installer un modèle de compilation Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2799,9 +2834,8 @@ msgid "Editor Layout" msgstr "Disposition de l'éditeur" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Choisir comme racine de scène" +msgstr "Prendre une capture d'écran" #: editor/editor_node.cpp #, fuzzy @@ -2809,15 +2843,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Ouvrir le dossier de données/paramètres de l'éditeur" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Ouvrir l'éditeur suivant" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Activer/Désactiver le plein écran" @@ -2865,7 +2890,7 @@ msgstr "Documentation en ligne" #: editor/editor_node.cpp msgid "Q&A" -msgstr "Q & R" +msgstr "Questions et réponses" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -2974,6 +2999,8 @@ msgstr "Ne pas enregistrer" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Le modèle de compilation Android est manquant, veuillez installer les " +"modèles appropriés." #: editor/editor_node.cpp msgid "Manage Templates" @@ -2984,6 +3011,9 @@ msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" +"Ceci va installer le projet Android pour des compilations personnalisées.\n" +"Notez que pour l'utiliser, vous devez l'activer pour chaque préréglage " +"d'exportation." #: editor/editor_node.cpp msgid "" @@ -3134,6 +3164,11 @@ msgstr "Temps" msgid "Calls" msgstr "Appels" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifier le thème" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activé" @@ -4847,7 +4882,6 @@ msgid "Last" msgstr "Dernier" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tout" @@ -4884,7 +4918,7 @@ msgstr "Officiel" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "Tester" +msgstr "En période de test" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -6467,7 +6501,7 @@ msgstr "Aider à améliorer la documentation de Godot en donnant vos réactions. #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "Chercher dans la documentation de référence." +msgstr "Rechercher dans la documentation de référence." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." @@ -6878,9 +6912,15 @@ msgid "Rear" msgstr "Arrière" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Aligner avec la vue" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Aligner la sélection avec la vue" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Pas de parent dans lequel instancier l'enfant." @@ -7071,10 +7111,6 @@ msgid "Focus Selection" msgstr "Focaliser la sélection" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Aligner la sélection avec la vue" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Outil sélection" @@ -9191,7 +9227,6 @@ msgstr "" "Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." @@ -9230,9 +9265,8 @@ msgid "New Project" msgstr "Nouveau projet" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Supprimer point" +msgstr "Nettoyer la liste" #: editor/project_manager.cpp msgid "Templates" @@ -9566,14 +9600,12 @@ msgid "Locales Filter" msgstr "Filtre de langues" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Montrer toutes les langues" +msgstr "Afficher toutes les langues" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Montrer uniquement les langues sélectionnées" +msgstr "Afficher uniquement les langues sélectionnées" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9991,6 +10023,11 @@ msgid "Extend Script" msgstr "Hériter d'un script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Re-parenter le nœud" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Choisir comme racine de scène" @@ -11140,6 +11177,8 @@ msgstr "" msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"Le projet Android n'est pas installé et ne peut donc pas être compilé. " +"Installez-le depuis le menu Éditeur." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11972,6 +12011,16 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Dossier précédent" + +#~ msgid "Next Folder" +#~ msgstr "Dossier suivant" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Ouvrir l'éditeur suivant" + #~ msgid "Reverse" #~ msgstr "Inverser" diff --git a/editor/translations/he.po b/editor/translations/he.po index d55b93036b..e5c3c37588 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -142,6 +142,31 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "שינוי זמן פריים-מפתח אנימציה" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "שינוי מיקום אנימציה" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "שינוי מיקום אנימציה" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "שינוי ערך קיפריים אנימציה" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "שינוי מיקום אנימציה" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "שנה אורך אנימציה" @@ -1733,7 +1758,7 @@ msgstr "הצגה במנהל הקבצים" msgid "New Folder..." msgstr "תיקייה חדשה…" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "רענון" @@ -1784,7 +1809,7 @@ msgstr "התקדמות קדימה" msgid "Go Up" msgstr "עלייה למעלה" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "החלפת מצב תצוגה לקבצים מוסתרים" @@ -1810,27 +1835,32 @@ msgstr "העברת מועדף למטה" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "המישור הקודם" +msgid "Go to previous folder." +msgstr "מעבר לתיקייה שמעל" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "יצירת תיקייה" +msgid "Go to next folder." +msgstr "מעבר לתיקייה שמעל" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "מעבר לתיקייה שמעל" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "חיפוש במחלקות" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "לא ניתן ליצור תיקייה." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "החלפת מצב תצוגה לקבצים מוסתרים" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2740,15 +2770,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "הגדרות עורך" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "פתיחת העורך הבא" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "כניסה אל/יציאה ממסך מלא" @@ -3074,6 +3095,11 @@ msgstr "זמן" msgid "Calls" msgstr "קריאות" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "חברים" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4819,7 +4845,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6885,7 +6910,12 @@ msgstr "אחורי" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "יישור עם התצוגה" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "יישור עם התצוגה" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7076,10 +7106,6 @@ msgid "Focus Selection" msgstr "בחירת מיקוד" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9973,6 +9999,11 @@ msgstr "הרצת סקריפט" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "יצירת %s חדש" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "שמירת סצנה" @@ -11761,6 +11792,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "המישור הקודם" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "יצירת תיקייה" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "פתיחת העורך הבא" + #~ msgid "Generating solution..." #~ msgstr "הפתרון נוצר…" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 03dc88206f..8a8a3c28a5 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -136,6 +136,31 @@ msgstr "एनीमेशन परिवर्तन बुलावा" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "एनीमेशन परिवर्तन निधि" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "एनीमेशन परिवर्तन बुलावा" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "एनीमेशन परिवर्तन परिणत" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "एनीमेशन मुख्य-फ़्रेम मूल्य(Value) बदलें" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "एनीमेशन परिवर्तन बुलावा" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "शब्द बदलें मूल्य" @@ -1720,7 +1745,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1771,7 +1796,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1796,23 +1821,28 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "खोज कर:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2695,14 +2725,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3015,6 +3037,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "परिवर्तन वक्र चयन" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4710,7 +4737,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6714,7 +6740,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6899,10 +6929,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9726,6 +9752,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "एक नया बनाएं" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index a5b752cc3a..606f7b021f 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1640,7 +1660,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1691,7 +1711,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1716,23 +1736,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2602,14 +2626,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2923,6 +2939,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4577,7 +4597,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6552,7 +6571,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6737,10 +6760,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9510,6 +9529,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 96e94ba9f3..ac339ff977 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -6,14 +6,15 @@ # Nagy Lajos <neutron9707@gmail.com>, 2017. # Sandor Domokos <sandor.domokos@gmail.com>, 2017-2018. # Varga Dániel <danikah.danikah@gmail.com>, 2016-2018. -# Gabor Csordas <gaborcsordas@yahoo.com>, 2018. +# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019. # Tusa Gamer <tusagamer@mailinator.com>, 2018. +# Máté Lugosi <mate.lugosi@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-29 12:09+0000\n" -"Last-Translator: Tusa Gamer <tusagamer@mailinator.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Gabor Csordas <gaborcsordas@yahoo.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.4-dev\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -45,15 +46,15 @@ msgstr "self nem használható, mert a példány null (nincs átadva)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "" +msgstr "Érvénytelen operandus a %s, %s és %s operátorokhoz." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "" +msgstr "Érvénytelen %s típusú index a %s alap típushoz." #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "Érvénytelen nevezett index '%s' %s alaptípushoz" #: core/math/expression.cpp #, fuzzy @@ -63,7 +64,7 @@ msgstr "" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "'%s' hívásánál:" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -72,21 +73,19 @@ msgstr "Ingyenes" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Kiegyensúlyozott" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" -msgstr "Hiba!" +msgstr "Tükör" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" msgstr "Idő:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Új név:" +msgstr "Érték:" #: editor/animation_bezier_editor.cpp #, fuzzy @@ -94,24 +93,20 @@ msgid "Insert Key Here" msgstr "Kulcs Beszúrása" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Kiválasztás megkettőzés" +msgstr "Kiválasztott elem(ek) megkettőzése" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Delete Selected Key(s)" -msgstr "Törli a kiválasztott fájlokat?" +msgstr "Kiválasztott kulcsok törlése" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Add Bezier Point" -msgstr "Pont hozzáadása" +msgstr "Bezier pont hozzáadása" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "Pont Mozgatása" +msgstr "Bezier pont Mozgatása" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -119,7 +114,7 @@ msgstr "Animáció kulcsok megkettőzése" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "Animáció kulcs törlés" +msgstr "Animáció kulcs törlése" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" @@ -143,17 +138,43 @@ msgstr "Animáció hívás változtatás" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animáció kulcsképkocka idő változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animáció átmenet változtatása" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animáció transzformáció változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animáció kulcsképkocka érték változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animáció hívás változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Animáció Nevének Megváltoztatása:" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Animációs ciklus változtatása" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Property Track" -msgstr "" +msgstr "Tulajdonság Követés" #: editor/animation_track_editor.cpp #, fuzzy @@ -178,14 +199,12 @@ msgid "Animation Playback Track" msgstr "Animáció lejátszásának leállítása. (S)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Animáció hossza (másodpercben)." +msgstr "Animáció hossza (képkockákban)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Animáció hossza (másodpercben)." +msgstr "Animáció hossza (másodpercben)" #: editor/animation_track_editor.cpp #, fuzzy @@ -200,7 +219,7 @@ msgstr "Animáció nagyítás." #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "" +msgstr "Funkciók:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" @@ -225,9 +244,8 @@ msgid "Update Mode (How this property is set)" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "Animáció Node" +msgstr "Interpoláció mód" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -1755,7 +1773,7 @@ msgstr "Mutat Fájlkezelőben" msgid "New Folder..." msgstr "Új Mappa..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Frissítés" @@ -1806,7 +1824,7 @@ msgstr "Ugrás Előre" msgid "Go Up" msgstr "Ugrás Fel" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Rejtett Fájlok Megjelenítése" @@ -1832,27 +1850,32 @@ msgstr "Kedvenc Lefelé Mozgatása" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Előző Sík" +msgid "Go to previous folder." +msgstr "Ugrás a szülőmappába" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Mappa Létrehozása" +msgid "Go to next folder." +msgstr "Ugrás a szülőmappába" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Ugrás a szülőmappába" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Osztályok Keresése" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Nem sikerült létrehozni a mappát." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Rejtett Fájlok Megjelenítése" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2836,15 +2859,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Szerkesztő Beállítások" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Következő Szerkesztő Megnyitása" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Teljes Képernyő" @@ -3171,6 +3185,11 @@ msgstr "Idő" msgid "Calls" msgstr "Hívások" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Tagok" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4943,7 +4962,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Mind" @@ -7053,7 +7071,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7240,10 +7262,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -10157,6 +10175,11 @@ msgstr "Szkript Futtatása" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Új %s Létrehozása" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Scene mentés" @@ -11958,6 +11981,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Előző Sík" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Mappa Létrehozása" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Következő Szerkesztő Megnyitása" + #~ msgid "Reverse" #~ msgstr "Visszafele" diff --git a/editor/translations/id.po b/editor/translations/id.po index 538d44ede5..7048f501b5 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -146,6 +146,31 @@ msgid "Anim Change Call" msgstr "Ubah Panggilan Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Ubah Waktu Keyframe Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Ubah Transisi Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Ubah Transformasi Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Ubah Nilai Keyframe Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Ubah Panggilan Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ubah Panjang Animasi" @@ -1695,7 +1720,7 @@ msgstr "Tampilkan di Manajer Berkas" msgid "New Folder..." msgstr "Buat Direktori..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Segarkan" @@ -1746,7 +1771,7 @@ msgstr "Maju" msgid "Go Up" msgstr "Naik" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Beralih File Tersembunyi" @@ -1771,23 +1796,31 @@ msgid "Move Favorite Down" msgstr "Pindahkan Favorit Kebawah" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Direktori Sebelumnya" +#, fuzzy +msgid "Go to previous folder." +msgstr "Pergi ke direktori atasnya." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Folder Berikutnya" +#, fuzzy +msgid "Go to next folder." +msgstr "Pergi ke direktori atasnya." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Pergi ke direktori atasnya." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cari berkas" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Hapus favorit direktori saat ini." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Beralih visibilitas berkas yang tersembunyi." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2733,14 +2766,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Screenshot disimpan di folder Editor Data/Settings" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Buka Screenshoots secara otomatis" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Buka di pengolah gambar lainnya" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Mode Layar Penuh" @@ -3058,6 +3083,11 @@ msgstr "Waktu" msgid "Calls" msgstr "Panggil" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Sunting tema..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Nyala" @@ -4756,7 +4786,6 @@ msgid "Last" msgstr "Terakhir" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Semua" @@ -6782,7 +6811,12 @@ msgstr "Belakang" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Tampilan Kanan." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Tampilan Kanan." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6976,10 +7010,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Semua pilihan" @@ -9927,6 +9957,11 @@ msgid "Extend Script" msgstr "Buka Cepat Script..." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Buat Baru %s" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Jadikan Skena Dasar" @@ -11877,6 +11912,18 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex." msgid "Constants cannot be modified." msgstr "Konstanta tidak dapat dimodifikasi." +#~ msgid "Previous Folder" +#~ msgstr "Direktori Sebelumnya" + +#~ msgid "Next Folder" +#~ msgstr "Folder Berikutnya" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Buka Screenshoots secara otomatis" + +#~ msgid "Open in an external image editor." +#~ msgstr "Buka di pengolah gambar lainnya" + #~ msgid "Reverse" #~ msgstr "Terbalik" diff --git a/editor/translations/is.po b/editor/translations/is.po index f313bcafca..98d0678673 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Útkall breyting símtal" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim breyta lyklagrind tími" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim breyting umskipti" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Breyta umbreytingu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim breyta lyklagrind gildi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Útkall breyting símtal" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1668,7 +1693,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1719,7 +1744,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1744,23 +1769,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2633,14 +2662,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2954,6 +2975,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Breyta:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4620,7 +4646,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6601,7 +6626,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6786,10 +6815,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9592,6 +9617,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 2b371c5be3..9773fd2a13 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -38,12 +38,13 @@ # Sinapse X <sinapsex13@gmail.com>, 2019. # Micila Micillotto <micillotto@gmail.com>, 2019. # Mirko Soppelsa <miknsop@gmail.com>, 2019. +# No <kingofwizards.kw7@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-19 13:41+0000\n" -"Last-Translator: Mirko Soppelsa <miknsop@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: No <kingofwizards.kw7@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -164,6 +165,31 @@ msgid "Anim Change Call" msgstr "Cambia chiamata animazione" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Cambia Tempo Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambia transizione dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambia trasformazione dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambia valore fotogramma chiave dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambia chiamata animazione" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambia lunghezza dell'animazione" @@ -1718,7 +1744,7 @@ msgstr "Mostra nel gestore file" msgid "New Folder..." msgstr "Nuova cartella..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Aggiorna" @@ -1769,7 +1795,7 @@ msgstr "Va' avanti" msgid "Go Up" msgstr "Va' su" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Attiva/disattiva file nascosti" @@ -1794,23 +1820,31 @@ msgid "Move Favorite Down" msgstr "Sposta preferito in giù" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Cartella precedente" +#, fuzzy +msgid "Go to previous folder." +msgstr "Va' alla cartella superiore." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Cartella successiva" +#, fuzzy +msgid "Go to next folder." +msgstr "Va' alla cartella superiore." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Va' alla cartella superiore." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cerca file" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Aggiungi/rimuovi cartella attuale dai preferiti." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Attiva/disattiva visibilità dei file nascosti." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2551,9 +2585,8 @@ msgid "Go to previously opened scene." msgstr "Vai alla scena precedentemente aperta." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Copia percorso" +msgstr "Copia Testo" #: editor/editor_node.cpp msgid "Next tab" @@ -2767,14 +2800,6 @@ msgstr "" "Gli screenshot vengono memorizzati nella cartella Data/Settings dell'editor." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Apri screenshots automaticamente" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Apri in un editor di immagini esterno." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Abilita/Disabilita modalità a schermo intero" @@ -3095,6 +3120,11 @@ msgstr "Tempo" msgid "Calls" msgstr "Chiamate" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifica Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -4766,9 +4796,8 @@ msgid "Idle" msgstr "Inattivo" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Installa" +msgstr "Installa..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4799,7 +4828,6 @@ msgid "Last" msgstr "Ultimo" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tutti" @@ -4897,39 +4925,32 @@ msgid "Rotation Step:" msgstr "Step Rotazione:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Muovi guida verticale" +msgstr "Muovi Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Crea nuova guida verticale" +msgstr "Crea Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Rimuovi guida verticale" +msgstr "Rimuovi Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Sposta guida orizzontale" +msgstr "Sposta Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Crea nuova guida orizzontale" +msgstr "Crea Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Rimuovi guida orizzontale" +msgstr "Rimuovi Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Crea nuove guide orizzontali e verticali" +msgstr "Crea Guide Orizzontali e Verticali" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6819,9 +6840,15 @@ msgid "Rear" msgstr "Retro" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Allinea alla Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Allinea Selezione Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Nessun genitore del quale istanziare un figlio." @@ -7010,10 +7037,6 @@ msgid "Focus Selection" msgstr "Centra a Selezione" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Allinea Selezione Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Strumento Seleziona" @@ -7975,7 +7998,7 @@ msgstr "Tipo di Input Visual Shader Cambiato" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Solo GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8062,21 +8085,20 @@ msgid "Color uniform." msgstr "Uniforme di colore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Ritorna l'inversa della radice quadrata del parametro." +msgstr "Ritorna il risultato booleano del confronto di %s tra due parametri." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Uguale (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Maggiore Di (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Maggiore o Uguale (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8091,24 +8113,27 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Ritorna il risultato booleano del confronto tra INF e un parametro scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Ritorna il risultato booleano del confronto tra NaN e un parametro scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Minore Di (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Minore o Uguale (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Not Equal (!=)" -msgstr "" +msgstr "Non Uguale (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8117,15 +8142,16 @@ msgstr "" "Ritorna un vettore associato se il valore booleano fornito è vero o falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Ritorna la tangente del parametro." +msgstr "Ritorna il risultato booleano del confronto tra due parametri." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Ritorna il risultato booleano del confronto tra INF (o NaN) e un parametro " +"scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8216,18 +8242,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Ritorna l'arco-coseno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(solo GLES3)Ritorna l'inversa del coseno iperbolico del parametro." +msgstr "Ritorna l'inversa del coseno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Ritorna l'arco-seno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(solo GLES3) Ritorna l'inversa del seno iperbolico del parametro." +msgstr "Ritorna l'inversa del seno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8238,10 +8262,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Ritorna l'arco-tangente dei parametri." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "" -"(solo GLES3) Ritorna l'inversa della tangente iperbolica del parametro." +msgstr "Ritorna l'inversa della tangente iperbolica del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8258,9 +8280,8 @@ msgid "Returns the cosine of the parameter." msgstr "Ritorna il coseno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(solo GLES3) Ritorna il coseno iperbolico del parametro." +msgstr "Ritorna il coseno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8330,14 +8351,12 @@ msgid "1.0 / scalar" msgstr "1.0 / scalare" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(solo GLES3) Trova il numero intero più vicino al parametro." +msgstr "Trova il numero intero più vicino al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(solo GLES3) Trova il numero intero pari più vicino al parametro." +msgstr "Trova il numero intero pari più vicino al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8352,9 +8371,8 @@ msgid "Returns the sine of the parameter." msgstr "Ritorna il seno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(solo GLES3) Ritorna il seno iperbolico del parametro." +msgstr "Ritorna il seno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8389,14 +8407,12 @@ msgid "Returns the tangent of the parameter." msgstr "Ritorna la tangente del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(solo GLES3) Ritorna la tangente iperbolica del parametro." +msgstr "Ritorna la tangente iperbolica del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(solo GLES3) Trova il valore troncato del parametro." +msgstr "Trova il valore troncato del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8437,24 +8453,23 @@ msgstr "Esegue la ricerca di texture." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Uniforme texture cubica." +msgstr "Controllo dinamico dell'uniforme della texture cubica." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "2D texture uniform lookup." -msgstr "Uniforme texture 2D." +msgstr "Controllo dinamico dell'uniforme della texture 2D." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Uniforme texture 2D." +msgstr "Controllo dinamico dell'uniforme della texture cubica con triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Funzione di trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8464,13 +8479,13 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(solo GLES3) Calcola il prodotto esterno di una coppia di vettori.\n" +"Calcola il prodotto esterno di una coppia di vettori.\n" "\n" -"OuterPorduct considera il primo parametro 'c' come un vettore colonna " -"(matrice di una colonna) ed il secondo, 'r', come un vettore riga (matrice " -"di una riga) ed esegue una moltiplicazione algebrica lineare di matrici 'c * " -"r', creando una matrice i cui numeri di rige sono il numero di componenti di " -"'c' e le cui colonne sono il numero di componenti in 'r'." +"OuterProduct considera il primo parametro 'c' come un vettore colonna " +"(matrice con una colonna) ed il secondo, 'r', come un vettore riga (matrice " +"con una riga) ed esegue una moltiplicazione algebrica lineare di matrici 'c " +"* r', creando una matrice i cui numeri di righe sono il numero di componenti " +"di 'c' e le cui colonne sono il numero di componenti in 'r'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." @@ -8481,19 +8496,16 @@ msgid "Decomposes transform to four vectors." msgstr "Scompone la trasformazione in quattro vettori." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(solo GLES3) Calcola il determinante di una trasformazione." +msgstr "Calcola il determinante di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(solo GLES3) Calcola l'inverso di una trasformazione." +msgstr "Calcola l'inverso di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(solo GLES3) Calcola la trasposizione di una trasformazione." +msgstr "Calcola la trasposizione di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -9972,6 +9984,11 @@ msgid "Extend Script" msgstr "Estendi Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reparent Nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Rendi Scena Radice" @@ -11913,6 +11930,18 @@ msgstr "Varyings può essere assegnato soltanto nella funzione del vertice." msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "Previous Folder" +#~ msgstr "Cartella precedente" + +#~ msgid "Next Folder" +#~ msgstr "Cartella successiva" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Apri screenshots automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Apri in un editor di immagini esterno." + #~ msgid "Reverse" #~ msgstr "Inverti" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 3ce27957ac..689a7f3e2b 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -2,7 +2,7 @@ # Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. -# akirakido <achts.y@gmail.com>, 2016-2017, 2018. +# akirakido <achts.y@gmail.com>, 2016-2017, 2018, 2019. # D_first <dntk.daisei@gmail.com>, 2017, 2018. # Daisuke Saito <d.saito@coriginate.com>, 2017, 2018. # h416 <shinichiro.hirama@gmail.com>, 2017. @@ -27,7 +27,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: John Smith <weblater_jp@susa.eek.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -147,6 +147,31 @@ msgid "Anim Change Call" msgstr "アニメーション呼出しの変更" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "アニメーションキーフレームの時間を変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "アニメーションのトランジションを変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "アニメーションのトランスフォームを変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "アニメーションキーフレームの値を変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "アニメーション呼出しの変更" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "アニメーションの長さを変更" @@ -477,9 +502,8 @@ msgid "Select All" msgstr "すべて選択" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "ノードを選択" +msgstr "選択解除" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -491,9 +515,8 @@ msgstr "" "ノードごとにトラックをグループ化するか、プレーンなリストとして表示します。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "スナップ" +msgstr "スナップ:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -660,7 +683,7 @@ msgstr "行番号:" #: editor/code_editor.cpp msgid "Found %d match(es)." -msgstr "" +msgstr "%d件の一致が見つかりました。" #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" @@ -720,23 +743,20 @@ msgid "Line and column numbers." msgstr "行番号と列番号。" #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "対象ノードのメソッドを指定する必要があります!" +msgstr "対象ノードのメソッドを指定してください。" #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"対象メソッドが見つかりません!有効なメソッドを指定するか、対象ノードにスクリ" -"プトを添付してください。" +"対象のメソッドが見つかりません。有効なメソッドを指定するか、ターゲットノード" +"にスクリプトをアタッチしてください。" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "ノードに接続:" +msgstr "ノードへの接続:" #: editor/connections_dialog.cpp msgid "Connect to Script:" @@ -747,9 +767,8 @@ msgid "From Signal:" msgstr "シグナルから:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "ノードはジオメトリーを含んでいません。" +msgstr "シーンにはスクリプトが含まれていません。" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -777,9 +796,8 @@ msgid "Extra Call Arguments:" msgstr "追加の呼出し引数:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "アニメーションのオプション" +msgstr "高度な設定" #: editor/connections_dialog.cpp msgid "Deferred" @@ -799,9 +817,8 @@ msgid "Disconnects the signal after its first emission." msgstr "最初の放出後に信号を切断します。" #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "シグナルの接続: " +msgstr "シグナルに接続できません" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -822,7 +839,6 @@ msgid "Connect" msgstr "接続" #: editor/connections_dialog.cpp -#, fuzzy msgid "Signal:" msgstr "シグナル:" @@ -848,14 +864,12 @@ msgid "Disconnect" msgstr "切断" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "シグナルの接続: " +msgstr "メソッドにシグナルを接続する" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "接続を編集: " +msgstr "接続を編集:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -993,9 +1007,8 @@ msgid "Owners Of:" msgstr "次のオーナー:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Remove selected files from the project? (Can't be restored)" -msgstr "選択したファイルをプロジェクトから除去しますか?(「元に戻す」不可)" +msgstr "選択したファイルをプロジェクトから削除しますか?(元に戻せません)" #: editor/dependency_editor.cpp msgid "" @@ -1039,9 +1052,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "%d 個のアイテムを完全に削除しますか?(「元に戻す」不可!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "依存関係" +msgstr "依存関係を表示" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -1085,7 +1097,7 @@ msgstr "プロジェクト創始者" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "開発主任" +msgstr "開発リーダー" #: editor/editor_about.cpp msgid "Project Manager " @@ -1359,19 +1371,16 @@ msgid "Valid characters:" msgstr "有効な文字:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "無効な名前です。既存のエンジンクラス名と重複してはいけません。" +msgstr "既存のエンジンクラス名と重複してはなりません。" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "無効な名前です。既存の組込み型名と重複してはいけません。" +msgstr "既存の組込み型名と重複してはいけません。" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "無効な名前です。既存のグローバル定数名と重複してはいけません。" +msgstr "既存のグローバル定数名と重複してはいけません。" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." @@ -1406,9 +1415,8 @@ msgid "Rearrange Autoloads" msgstr "自動読込みの並べ替え" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." -msgstr "無効なパスです。" +msgstr "パスが無効です。" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "File does not exist." @@ -1461,9 +1469,8 @@ msgid "[unsaved]" msgstr "[未保存]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "はじめにベースディレクトリを選択してください" +msgstr "はじめにベースディレクトリを選択してください。" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1549,45 +1556,39 @@ msgstr "テンプレートファイルが見つかりません:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "" +"32ビットのエクスポートでは、組み込みPCKは4GiBを超えることはできません。" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "エディタ" +msgstr "3Dエディタ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "スクリプトエディタを開く" +msgstr "スクリプトエディタ" #: editor/editor_feature_profile.cpp msgid "Asset Library" msgstr "アセットライブラリ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "シーンツリー(ノード):" +msgstr "シーンツリーの編集" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "インポート" +msgstr "インポートドック" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "追加したキーを移動" +msgstr "ノードドック" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "ファイルシステム" +msgstr "ファイルシステムとインポートドック" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "すべて置換(「元に戻す」不可)" +msgstr "プロファイル '%s'を消去しますか?(元に戻せません)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1595,61 +1596,52 @@ msgstr "" "プロファイルは有効なファイル名でなければならず、 '.' を含んではいけません" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "同名のファイルまたはフォルダがあります。" +msgstr "この名前のプロファイルは既に存在します。" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" msgstr "(エディタ無効、プロパティ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "プロパティのみ" +msgstr "(プロパティ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "無効" +msgstr "(エディタ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "クラスの説明:" +msgstr "クラスオプション:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "次のエディタを開く" +msgstr "コンテキストエディタを有効にする" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "プロパティ:" +msgstr "プロパティを有効にする:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "テクスチャ" +msgstr "機能を有効にする:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "クラスの検索" +msgstr "クラスを有効にする:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." msgstr "ファイル '%s' のフォーマットが無効です。インポートが中止されました。" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"プロファイル '%s' はすでに存在します。インポート前に最初にリモートで実行する" -"と、インポートは中止されます。" +"プロファイル '%s' はすでに存在します。インポートする前に削除してください。イ" +"ンポートは中止されました。" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1661,14 +1653,12 @@ msgid "Unset" msgstr "未設定" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "現在のバージョン:" +msgstr "現在のプロファイル:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "現在:" +msgstr "最新にする" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1686,9 +1676,8 @@ msgid "Export" msgstr "エクスポート" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "利用可能なノード:" +msgstr "利用可能なプロファイル:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1706,9 +1695,8 @@ msgid "Erase Profile" msgstr "タイルマップを消去" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "インポートされたプロジェクト" +msgstr "プロファイルのインポート" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1749,7 +1737,7 @@ msgstr "ファイルマネージャーで表示" msgid "New Folder..." msgstr "新規フォルダ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "再読込" @@ -1800,7 +1788,7 @@ msgstr "進む" msgid "Go Up" msgstr "上へ" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "隠しファイルの切り替え" @@ -1826,27 +1814,31 @@ msgstr "お気に入りを下へ" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "前の床面" +msgid "Go to previous folder." +msgstr "親フォルダへ移動する。" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "次の床面" +msgid "Go to next folder." +msgstr "親フォルダへ移動する。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "親フォルダへ" +msgstr "親フォルダへ移動する。" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ファイル検索" #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "フォルダを作成できませんでした。" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "隠しファイルの切り替え" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2231,7 +2223,6 @@ msgstr "" "ントをお読みください。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." @@ -2248,7 +2239,6 @@ msgstr "" "を変更し、再度インポートしてください。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" @@ -2256,12 +2246,11 @@ msgid "" "understand this workflow." msgstr "" "このシーンはインポートされたもので、変更は保持されません。\n" -"インスタンス化か継承すると、変更が可能になります。\n" -"このワークフローをよりよく理解するために、シーンの読み込みに関連するドキュメ" -"ントをお読みください。" +"インスタンス化もしくは継承すると、変更が可能になります。\n" +"このワークフローをよりよく理解するために、シーンのインポートに関連するドキュ" +"メントをお読みください。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -2583,9 +2572,8 @@ msgid "Go to previously opened scene." msgstr "以前に開いたシーンに移動する。" #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "パスをコピー" +msgstr "テキストをコピー" #: editor/editor_node.cpp msgid "Next tab" @@ -2789,32 +2777,20 @@ msgid "Editor Layout" msgstr "エディタレイアウト" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "シーンをルートにする" +msgstr "スクリーンショットを撮る" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "エディタのデータ・設定フォルダを開く" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "次のエディタを開く" +msgstr "スクリーンショットはEditor Data / Settingsフォルダに保存されています。" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "フルスクリーン切り替え" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "分割モード切り替え" +msgstr "システムコンソールの切り替え" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2924,19 +2900,16 @@ msgid "Spins when the editor window redraws." msgstr "エディタ ウィンドウの再描画時にスピンします。" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "継続的" +msgstr "継続的に更新" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" msgstr "変更時に更新" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "アップデートスピナーを無効化" +msgstr "アップデートスピナーを非表示" #: editor/editor_node.cpp msgid "FileSystem" @@ -3132,6 +3105,11 @@ msgstr "時間" msgid "Calls" msgstr "呼出し" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "テーマを編集..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "オン" @@ -3481,7 +3459,6 @@ msgid "Remove Template" msgstr "テンプレートを除去" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" msgstr "テンプレートファイルを選択" @@ -3544,9 +3521,8 @@ msgid "No name provided." msgstr "名前が付いていません。" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "名前に使用できない文字が含まれています" +msgstr "名前に使用できない文字が含まれています。" #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." @@ -3578,7 +3554,6 @@ msgid "New Inherited Scene" msgstr "新しい継承したシーン..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" msgstr "シーンを開く" @@ -3587,12 +3562,10 @@ msgid "Instance" msgstr "インスタンス" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" msgstr "お気に入りに追加" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" msgstr "お気に入りから削除" @@ -3883,9 +3856,8 @@ msgid "Reimport" msgstr "再インポート" #: editor/import_dock.cpp -#, fuzzy msgid "Save scenes, re-import and restart" -msgstr "シーンを保存し、再インポートして再起動" +msgstr "シーンを保存して、再インポートして再起動してください" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -4155,9 +4127,8 @@ msgid "Open Animation Node" msgstr "アニメーションノードを開く" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "三角形が既に存在します" +msgstr "三角形が既に存在します。" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4180,9 +4151,8 @@ msgid "Remove BlendSpace2D Point" msgstr "パスのポイントを除去" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Triangle" -msgstr "無効なキーを削除" +msgstr "BlendSpace2D三角形を削除する" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." @@ -4262,7 +4232,6 @@ msgstr "新規アニメーション" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" msgstr "ノードを削除" @@ -4316,7 +4285,6 @@ msgid "Edit Filtered Tracks:" msgstr "フィルタリング済トラックの編集:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" msgstr "フィルタリングを有効化" @@ -4608,11 +4576,10 @@ msgid "Remove selected node or transition." msgstr "選択したノードまたはトランジションを除去。" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" -"このアニメーションの自動再生を、スタート、リスタート、ゼロにシークに切り替え" -"る。" +"このアニメーションの自動再生の開始、再起動、またはゼロへのシークを切り替えま" +"す。" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." @@ -4835,9 +4802,8 @@ msgid "Idle" msgstr "待機" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "インストール" +msgstr "インストール..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4868,7 +4834,6 @@ msgid "Last" msgstr "最後" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "すべて" @@ -4882,9 +4847,8 @@ msgid "Sort:" msgstr "ソート:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "リクエスト中..." +msgstr "逆順ソート。" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4965,37 +4929,30 @@ msgid "Rotation Step:" msgstr "回転のステップ:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" msgstr "垂直ガイドを移動" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" msgstr "垂直ガイドを作成" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" msgstr "垂直ガイドを削除" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" msgstr "水平ガイドを移動" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" msgstr "水平ガイドを作成" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" msgstr "水平ガイドを削除" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" msgstr "水平垂直ガイドを作成" @@ -5016,9 +4973,8 @@ msgid "Resize CanvasItem" msgstr "CanvasItemをリサイズ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem" -msgstr "キャンバスアイテムの編集" +msgstr "キャンバスアイテムの拡大/縮小" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem" @@ -5057,41 +5013,35 @@ msgstr "アンカーを変更" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "選択ツール" +msgstr "選択をロック" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "選択済みを削除" +msgstr "選択を解除" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "選択しているものを削除" +msgstr "選択したグループ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "選択しているものを削除" +msgstr "グループ解除" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "ポーズを貼り付け" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "メッシュから放出点を生成" +msgstr "ノードからカスタムボーンを作成" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "ポーズをクリアする" +msgstr "ボーンをクリアする" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5126,10 +5076,10 @@ msgid "Alt+Drag: Move" msgstr "Alt+ドラッグ: 移動" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" -"vキーを押すとピボットの変更、'Shift+v' でピボットをドラッグ(移動中でも)" +"ピボットを変更するには 'v' 、ピボットをドラッグするには 'Shift+v' を押します" +"(移動中)。" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5137,9 +5087,8 @@ msgid "Alt+RMB: Depth list selection" msgstr "Alt+右クリック: デプス(深さ)リストの選択" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Mode" -msgstr "追加したキーを移動" +msgstr "移動モード" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" @@ -5179,7 +5128,6 @@ msgid "Snapping Options" msgstr "スナッピングオプション" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" msgstr "グリッドにスナップ" @@ -5201,37 +5149,30 @@ msgid "Use Pixel Snap" msgstr "ピクセルスナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" msgstr "スマートスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" msgstr "親にスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" msgstr "ノードアンカーにスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" msgstr "ノード側面にスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" msgstr "ノードの中心にスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" msgstr "他のノードにスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" msgstr "ガイドにスナップ" @@ -5306,14 +5247,12 @@ msgid "Show Group And Lock Icons" msgstr "グループアイコンとロックアイコンを表示" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Selection" -msgstr "選択対象を中央に" +msgstr "センター選択" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Frame Selection" -msgstr "選択対象をフレームの中央に" +msgstr "フレーム選択" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -5398,9 +5337,8 @@ msgstr "ノードを生成" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Error instancing scene from %s" -msgstr "%sシーンのインスタンス化エラー" +msgstr "%sからシーンをインスタンス化処理中にエラーが発生しました" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5428,7 +5366,6 @@ msgid "Edit Poly (Remove Point)" msgstr "ポリゴンを編集(点を除去)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp -#, fuzzy msgid "Set Handle" msgstr "ハンドルを設定する" @@ -5452,9 +5389,8 @@ msgstr "発光(Emission)マスクを読み込む" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "今すぐ再起動" +msgstr "再起動" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5480,9 +5416,8 @@ msgstr "発光(Emission)マスク" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Capture from Pixel" -msgstr "ピクセルから取得" +msgstr "ピクセルからキャプチャ" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5504,12 +5439,10 @@ msgid "Create Emission Points From Node" msgstr "ノードから放出点を生成" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" msgstr "フラット0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" msgstr "フラット1" @@ -5559,9 +5492,8 @@ msgid "Right Linear" msgstr "右側面図" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "初期設定値を読み込む" +msgstr "プリセットを読み込む" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" @@ -5608,9 +5540,8 @@ msgid "Create Static Trimesh Body" msgstr "スタティック(不変)三角形メッシュ ボディを作成" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Static Convex Body" -msgstr "スタティック(不変)凸状ボディを生成" +msgstr "静的凸状ボディを生成" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -5627,9 +5558,8 @@ msgid "Failed creating shapes!" msgstr "図形の作成に失敗しました!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Shape(s)" -msgstr "凸状シェイプを生成" +msgstr "凸状シェイプを作成" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5678,9 +5608,8 @@ msgid "Mesh" msgstr "メッシュ" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Body" -msgstr "スタティック(不変)三角形メッシュ ボディを作成" +msgstr "静的三角形メッシュボディを作成" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -5831,7 +5760,6 @@ msgid "Mesh Up Axis:" msgstr "メッシュのアップ軸:" #: editor/plugins/multimesh_editor_plugin.cpp -#, fuzzy msgid "Random Rotation:" msgstr "ランダムな回転:" @@ -5872,7 +5800,7 @@ msgstr "可視性の矩形を生成" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "ParticlesMaterialプロセスマテリアルにのみ点を設定できます" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5880,7 +5808,6 @@ msgid "Generation Time (sec):" msgstr "生成時間 (秒):" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Faces contain no area!" msgstr "面にエリアが含まれていません!" @@ -5910,9 +5837,8 @@ msgid "Surface Points" msgstr "表面の点" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points+Normal (Directed)" -msgstr "サーフェスポイント+Normal(指向性)" +msgstr "サーフェスポイント+Normal(指向性)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -5956,9 +5882,8 @@ msgstr "In-ハンドルを曲線から除去" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Add Point to Curve" -msgstr "ポイントを曲線に追加" +msgstr "点を曲線に追加" #: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy @@ -5987,9 +5912,8 @@ msgstr "点を選択" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Shift+Drag: Select Control Points" -msgstr "Shift+ドラッグ:コントロールポイントを選択" +msgstr "Shift + ドラッグ:コントロールポイントを選択" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -6302,9 +6226,8 @@ msgid "Delete Resource" msgstr "リソースを削除" #: editor/plugins/resource_preloader_editor_plugin.cpp -#, fuzzy msgid "Resource clipboard is empty!" -msgstr "リソースのクリップボードは空です!" +msgstr "リソースクリップボードが空です!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" @@ -6318,9 +6241,8 @@ msgstr "インスタンス:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Type:" -msgstr "型(Type):" +msgstr "型:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp @@ -6361,9 +6283,8 @@ msgid "Error: could not load file." msgstr "エラー: ファイルを読み込めませんでした。" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error could not load file." -msgstr "フォルダを作成できませんでした。" +msgstr "エラー:ファイルを読み込めませんでした。" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving file!" @@ -6429,18 +6350,16 @@ msgid "Find Next" msgstr "次を検索" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "フィルタプロパティ" +msgstr "フィルタスクリプト" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "メソッドリストのアルファベット順ソートを切り替える。" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "フィルターモード:" +msgstr "フィルタメソッド" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6620,7 +6539,6 @@ msgid "Source" msgstr "ソース:" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" msgstr "シグナル" @@ -6690,9 +6608,8 @@ msgid "Bookmarks" msgstr "ブックマーク" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Breakpoints" -msgstr "点を作成する。" +msgstr "ブレークポイント" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6998,9 +6915,14 @@ msgstr "後面" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "シーンビューにカメラを合わせる(Align With View)" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "選択をビューに整列" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp #, fuzzy msgid "No parent to instance a child at." @@ -7194,10 +7116,6 @@ msgid "Focus Selection" msgstr "選択にフォーカス" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "選択をビューに整列" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "選択ツール" @@ -7799,9 +7717,8 @@ msgid "Erase TileMap" msgstr "タイルマップを消去" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" -msgstr "タイルを探す" +msgstr "タイルを検索する" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -7914,9 +7831,8 @@ msgid "Navigation Mode" msgstr "ナビゲーションメッシュを生成" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "回転モード" +msgstr "ビットマスクモード" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7924,9 +7840,8 @@ msgid "Priority Mode" msgstr "エクスポートのモード:" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "パンモード" +msgstr "アイコンモード" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7957,7 +7872,7 @@ msgstr "新規ポリゴンを生成。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "領域Rect内にポリゴンを保持します。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." @@ -8230,12 +8145,10 @@ msgid "Add Node to Visual Shader" msgstr "シェーダー" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" msgstr "ノードを複製" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" msgstr "ノードを削除" @@ -8245,16 +8158,15 @@ msgstr "ビジュアルシェーダの入力タイプが変更されました" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(GLES3のみ)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "頂点" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Fragment" -msgstr "引数:" +msgstr "フラグメント" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8308,7 +8220,7 @@ msgstr "差分のみ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Dodge演算子。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" @@ -8341,21 +8253,20 @@ msgid "Color uniform." msgstr "トランスフォーム" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "パラメータの平方根の逆数を返します。" +msgstr "2つのパラメータ間の %s 比較のブール結果を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "等しい(==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "より大きい(>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "より大きいか等しい(>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8369,25 +8280,25 @@ msgstr "" msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "INFとスカラパラメータの比較の結果をブール値で返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." -msgstr "" +msgstr "NaNとスカラパラメータの比較の結果をブール値で返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "より小さい(<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "それ以下(<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "等しくない(!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8396,15 +8307,14 @@ msgstr "" "指定されたブール値がtrueまたはfalseの場合、関連付けられたベクトルを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "パラメータのタンジェントを返します。" +msgstr "2つのパラメータ間の比較の結果をブール値で返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." -msgstr "" +msgstr "INF(またはNaN)とスカラパラメータとの比較のブール結果を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8442,7 +8352,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "頂点シェーダモードの '%s' 入力パラメータ。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." @@ -8460,31 +8370,31 @@ msgstr "スカラ演算子を変更" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "ネイピア数(2.718282)。自然対数のベースを表します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Υ(イプシロン)定数(0.00001)。可能な最小のスカラー数。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Φ(ファイ)定数 (1.618034)。黄金比。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Π(パイ)/4定数 (0.785398) または45度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Π(パイ)/2 定数(1.570796)または90度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Π(パイ)定数(3.141593)または180度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Τ(タウ)定数(6.283185)または360度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." @@ -8499,18 +8409,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "パラメータの逆コサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(GLES3のみ)パラメータの双曲線逆コサインを返します。" +msgstr "パラメータの逆双曲線余弦を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "パラメータの逆サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(GLES3のみ)パラメータの双曲線逆サインを返します。" +msgstr "パラメータの双曲線逆サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8521,9 +8429,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "複数パラメータの逆タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(GLES3のみ)パラメータの双曲線逆タンジェントを返します。" +msgstr "パラメータの双曲線逆タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8539,9 +8446,8 @@ msgid "Returns the cosine of the parameter." msgstr "パラメータのコサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(GLES3のみ)パラメータの双曲線コサインを返します。" +msgstr "パラメータの双曲線コサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8609,14 +8515,12 @@ msgid "1.0 / scalar" msgstr "1.0 / スカラー" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(GLES3のみ)パラメータに最も近い整数を検索します。" +msgstr "パラメータに最も近い整数を検索します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(GLES3のみ)パラメータに最も近い偶数の整数を検索します。" +msgstr "パラメータに最も近い偶数の整数を検索します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8631,9 +8535,8 @@ msgid "Returns the sine of the parameter." msgstr "パラメータの符号を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(GLES3のみ)パラメータの双曲サインを返します。" +msgstr "パラメータの双曲サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8668,14 +8571,12 @@ msgid "Returns the tangent of the parameter." msgstr "パラメータのタンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(GLES3のみ)パラメータの双曲タンジェントを返します。" +msgstr "パラメータの双曲タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(GLES3のみ)パラメータのトランケートされた値を検索します。" +msgstr "パラメータのトランケートされた値を検索します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8762,19 +8663,16 @@ msgid "Decomposes transform to four vectors." msgstr "変換を4つのベクトルに分解します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(GLES3のみ)変換の行列式を計算します。" +msgstr "変換の行列式を計算します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(GLES3のみ)変換の逆関数を計算します。" +msgstr "変換の逆行列を計算します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(GLES3のみ)変換の転置を計算します。" +msgstr "変換の転置を計算します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8865,7 +8763,6 @@ msgid "" msgstr "反射の方向(a:入射ベクトル、b:法線ベクトル)を指すベクトルを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "屈折の方向を指すベクトルを返します。" @@ -8966,68 +8863,58 @@ msgstr "" "返します。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(GLES3のみ)(フラグメント/ライトモードのみ)スカラー導関数。" +msgstr "(フラグメント/ライトモードのみ)スカラー導関数。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(GLES3のみ)(フラグメント/ライトモードのみ)ベクトル導関数。" +msgstr "(フラグメント/ライトモードのみ)ベクトル導関数。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(ベクトル)ローカル差分を使用して " -"'x' で微分します。" +"(フラグメント/ライトモードのみ)(ベクトル)ローカル差分を使用して 'x' で微分し" +"ます。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(スカラー)ローカル差分を使用して " -"'x' で微分します。" +"(フラグメント/ライトモードのみ)(スカラー)ローカル差分を使用して 'x' で微分し" +"ます。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(ベクトル)ローカル差分を使用して " -"'y' で微分します。" +"(フラグメント/ライトモードのみ)(ベクトル)ローカル差分を使用して 'y' で微分し" +"ます。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(スカラー)ローカル差分を使用して " -"'y' で微分します。" +"(フラグメント/ライトモードのみ)(スカラー)ローカル差分を使用して 'y' で微分し" +"ます。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(ベクトル) 'x' と 'y' の絶対導関数" -"の合計。" +"(フラグメント/ライトモードのみ)(ベクトル) 'x' と 'y' の絶対導関数の合計。" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(GLES3のみ)(フラグメント/ライトモードのみ)(スカラー) 'x' と 'y' の絶対導関数" -"の合計。" +"(フラグメント/ライトモードのみ)(スカラー) 'x' と 'y' の絶対導関数の合計。" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9401,7 +9288,6 @@ msgstr "" "警告: プロジェクトは旧バージョンのエンジンで開くことができなくなります。" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9535,7 +9421,6 @@ msgid "Can't run project" msgstr "プロジェクトを実行できません" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" @@ -9575,7 +9460,6 @@ msgid "An action with the name '%s' already exists." msgstr "アクション'%s'は既にあります!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Rename Input Action Event" msgstr "入力アクションイベントの名前を変更する" @@ -10032,7 +9916,7 @@ msgstr "各ノードのカウンタの増分量" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "" +msgstr "パディング" #: editor/rename_dialog.cpp msgid "" @@ -10156,9 +10040,8 @@ msgid "This operation can't be done on the tree root." msgstr "この処理はツリーのルートではできません." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Move Node In Parent" -msgstr "親のノードを移動" +msgstr "ノードを親に移動" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10296,7 +10179,6 @@ msgid "Clear Inheritance" msgstr "継承をクリア" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "ドキュメントを開く" @@ -10305,9 +10187,8 @@ msgid "Add Child Node" msgstr "子ノードを追加" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "すべて折りたたむ" +msgstr "すべて展開/折りたたみ" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10319,6 +10200,11 @@ msgid "Extend Script" msgstr "スクリプトを拡張" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "親ノードを変更" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "シーンをルートにする" @@ -10339,9 +10225,8 @@ msgid "Delete (No Confirm)" msgstr "削除 (確認なし)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "新しいノードを追加/生成" +msgstr "新しいノードを追加/作成する。" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10569,14 +10454,12 @@ msgid "Built-in script (into scene file)." msgstr "組み込みスクリプト(シーンファイルの)" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "新規スクリプトファイルを作成" +msgstr "新規スクリプトファイルを作成。" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "既存のスクリプトファイルを読み込む" +msgstr "既存のスクリプトファイルを読み込む。" #: editor/script_create_dialog.cpp msgid "Language" @@ -10637,9 +10520,8 @@ msgid "Inspect Previous Instance" msgstr "前のインスタンスの内容を確認" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Inspect Next Instance" -msgstr "次のインスタンスの内容を確認" +msgstr "次のインスタンスを確認する" #: editor/script_editor_debugger.cpp msgid "Stack Frames" @@ -10782,9 +10664,8 @@ msgid "Change Capsule Shape Radius" msgstr "カプセル形状の半径変更" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Capsule Shape Height" -msgstr "カプセル形状の高さ変更" +msgstr "カプセル形状の高さを変更する" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -11020,15 +10901,15 @@ msgstr "Ctrl: 回転" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" -msgstr "" +msgstr "X軸でカーソルを逆回転させる" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Y" -msgstr "" +msgstr "Y軸でカーソルを逆回転させる" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Z" -msgstr "" +msgstr "Z軸でカーソルを逆回転させる" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Clear Rotation" @@ -11379,9 +11260,8 @@ msgid "Available Nodes:" msgstr "利用可能なノード:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "グラフを編集する関数を選択または生成" +msgstr "グラフを編集する関数を選択または作成します。" #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11899,7 +11779,6 @@ msgstr "" "ください." #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "" "VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." @@ -11908,9 +11787,8 @@ msgstr "" "適です。" #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRCamera must have an ARVROrigin node as its parent." -msgstr "ARVRCameraはARVROriginノードを親に持つ必要があります" +msgstr "ARVRCameraはARVROriginノードを親に持つ必要があります。" #: scene/3d/arvr_nodes.cpp #, fuzzy @@ -12038,9 +11916,8 @@ msgstr "" "定されているSpatialMaterialを使用する必要があります。" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "イメージを配置(Blit)" +msgstr "メッシュのプロット" #: scene/3d/gi_probe.cpp msgid "" @@ -12052,7 +11929,7 @@ msgstr "" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." -msgstr "" +msgstr "90度を超える角度のスポットライトは、シャドウを投影できません。" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -12345,18 +12222,16 @@ msgid "Input" msgstr "入力" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for preview." -msgstr "無効なシェーダーのソースです。" +msgstr "プレビューのソースが無効です。" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "無効なシェーダーのソースです。" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "無効なシェーダーのソースです。" +msgstr "そのタイプの比較関数は無効です。" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -12375,6 +12250,19 @@ msgstr "Varyingは頂点関数にのみ割り当てることができます。" msgid "Constants cannot be modified." msgstr "定数は変更できません。" +#~ msgid "Previous Folder" +#~ msgstr "前のフォルダ" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "次の床面" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "スクリーンショットを自動的に開く" + +#~ msgid "Open in an external image editor." +#~ msgstr "外部のイメージエディタで開きます。" + #~ msgid "Reverse" #~ msgstr "逆" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 83884f1874..f6dc4ca514 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -134,6 +134,31 @@ msgstr "ანიმაციის ძახილის ცვლილებ #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "ანიმაციის გასაღებური კადრის დროის ცვლილება" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "ანიმაციის გარდამამვლობის შეცვლა" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "ანიმაციის გარდაქმნის ცვლილება" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "ანიმაციის გასაღებური კადრის მნიშვნელობის ცვლილება" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "ანიმაციის ძახილის ცვლილება" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "ანიმ სიგრძის შეცვლა" @@ -1721,7 +1746,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1772,7 +1797,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1797,23 +1822,30 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "წინამდებარე ნაბიჯზე გადასვლა" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "მომდევნო ნაბიჯზე გადასვლა" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ძებნა:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2699,14 +2731,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3020,6 +3044,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "მონიშვნის მრუდის ცვლილება" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4713,7 +4742,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6728,7 +6756,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6913,10 +6945,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9747,6 +9775,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "ახალი %s შექმნა" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 4649846e12..374d996926 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: 송태섭 <xotjq237@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -138,6 +138,31 @@ msgid "Anim Change Call" msgstr "애니메이션 호출 변경" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "애니메이션 키프레임 시간 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "애니메이션 전환 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "애니메이션 변형 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "애니메이션 키프레임 값 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "애니메이션 호출 변경" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "애니메이션 길이 변경" @@ -1683,7 +1708,7 @@ msgstr "파일 탐색기에서 보기" msgid "New Folder..." msgstr "새 폴더..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "새로고침" @@ -1734,7 +1759,7 @@ msgstr "앞으로 가기" msgid "Go Up" msgstr "위로 가기" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "숨김 파일 토글" @@ -1759,23 +1784,31 @@ msgid "Move Favorite Down" msgstr "즐겨찾기 아래로 이동" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "이전 폴더" +#, fuzzy +msgid "Go to previous folder." +msgstr "부모 폴더로 이동합니다." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "다음 폴더" +#, fuzzy +msgid "Go to next folder." +msgstr "부모 폴더로 이동합니다." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "부모 폴더로 이동합니다." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "파일 검색" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "현재 폴더를 즐겨찾기 (안) 합니다." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "숨김 파일 가시성 토글하기." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2496,9 +2529,8 @@ msgid "Go to previously opened scene." msgstr "이전에 열었던 씬으로 가기." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "경로 복사" +msgstr "문자 복사" #: editor/editor_node.cpp msgid "Next tab" @@ -2712,14 +2744,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "스크린샷이 Editor Data/Settings 폴더에 저장되었습니다." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "스크린샷 자동 열기" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "외부 이미지 편집기에서 열기." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "전체 화면 토글" @@ -3037,6 +3061,11 @@ msgstr "시간" msgid "Calls" msgstr "호출" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "테마 편집" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "사용" @@ -4693,9 +4722,8 @@ msgid "Idle" msgstr "대기" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "설치" +msgstr "설치하기..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4726,7 +4754,6 @@ msgid "Last" msgstr "끝으로" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "모두" @@ -4740,9 +4767,8 @@ msgid "Sort:" msgstr "정렬:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "요청중..." +msgstr "역순 정렬." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4821,39 +4847,32 @@ msgid "Rotation Step:" msgstr "회전 스텝:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "세로 가이드 이동" +msgstr "수직 가이드 이동" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "새로운 세로 가이드 만들기" +msgstr "수직 가이드 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "세로 가이드 삭제" +msgstr "수직 가이드 삭제" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "가로 가이드 이동" +msgstr "수평 가이드 이동" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "새로운 가로 가이드 만들기" +msgstr "수평 가이드 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "가로 가이드 삭제" +msgstr "수평 가이드 삭제" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "새 가로 세로 가이드 만들기" +msgstr "수평 및 수직 가이드 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6728,9 +6747,15 @@ msgid "Rear" msgstr "뒷면" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "뷰와 정렬" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "선택 항목을 뷰에 정렬" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "선택된 부모 노드가 없어서 자식노드를 인스턴스할 수 없습니다." @@ -6918,10 +6943,6 @@ msgid "Focus Selection" msgstr "선택 포커스" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "선택 항목을 뷰에 정렬" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "선택 툴" @@ -7879,7 +7900,7 @@ msgstr "비주얼 셰이더 입력 타입 변경됨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(GLES3만 가능)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -7966,21 +7987,20 @@ msgid "Color uniform." msgstr "색상 유니폼." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "매개변수의 제곱근 역함수 값을 반환합니다." +msgstr "두 매개변수 사이 %s 비교의 불리언 결과 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "같다 (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "보다 더 크다 (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "보다 크거나 같다 (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -7992,25 +8012,26 @@ msgstr "제공된 스칼라가 같거나, 더 크거나, 더 작으면 관련 msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "무한(INF)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"숫자 아님(NaN)과 스칼라 매개변수 사이 비교의 불리언 결과 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "보다 더 작다 (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "보다 작거나 같다 (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "같지 않다 (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8018,15 +8039,16 @@ msgid "" msgstr "불리언 값이 참이거나 거짓이면 관련 벡터를 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "매개변수의 탄젠트 값을 반환합니다." +msgstr "두 매개변수 사이 비교의 불리언 결과 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"무한(INF) (또는 숫자 아님(NaN))과 스칼라 매개변수 사이 비교의 불리언 결과 값" +"을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8117,18 +8139,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "매개변수의 아크코사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(GLES3만 가능) 매개변수의 역쌍곡코사인 값을 반환합니다." +msgstr "매개변수의 역쌍곡코사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "매개변수의 아크사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(GLES3만 가능) 매개변수의 역쌍곡사인 값을 반환합니다." +msgstr "매개변수의 역쌍곡사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8139,9 +8159,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "매개변수들의 아크탄젠트 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(GLES3만 가능) 매개변수의 역쌍곡탄젠트 값을 반환합니다." +msgstr "매개변수의 역쌍곡탄젠트 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8157,9 +8176,8 @@ msgid "Returns the cosine of the parameter." msgstr "매개변수의 코사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(GLES3만 가능) 매개변수의 쌍곡코사인 값을 반환합니다." +msgstr "매개변수의 쌍곡코사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8227,14 +8245,12 @@ msgid "1.0 / scalar" msgstr "1.0 / 스칼라" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(GLES3만 가능) 매개변수에서 가장 가까운 정수를 찾습니다." +msgstr "매개변수에서 가장 가까운 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(GLES3만 가능) 매개변수에서 가장 가까운 짝수 정수를 찾습니다." +msgstr "매개변수에서 가장 가까운 짝수 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8249,9 +8265,8 @@ msgid "Returns the sine of the parameter." msgstr "매개변수의 사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(GLES3만 가능) 매개변수의 쌍곡사인 값을 반환합니다." +msgstr "매개변수의 쌍곡사인 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8285,14 +8300,12 @@ msgid "Returns the tangent of the parameter." msgstr "매개변수의 탄젠트 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(GLES3만 가능) 매개변수의 쌍곡탄젠트 값을 반환합니다." +msgstr "매개변수의 쌍곡탄젠트 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(GLES3만 가능) 매개변수의 절사 값을 찾습니다." +msgstr "매개변수의 절사된 값을 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8331,26 +8344,22 @@ msgid "Perform the texture lookup." msgstr "텍스쳐 룩업을 수행합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "세제곱 텍스쳐 유니폼." +msgstr "세제곱 텍스쳐 유니폼 룩업." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "2D 텍스쳐 유니폼." +msgstr "2D 텍스쳐 유니폼 룩업." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "2D 텍스쳐 유니폼." +msgstr "Triplanar가 적용된 2D 텍스쳐 유니폼 룩업 ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "변형 함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8360,7 +8369,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(GLES3만 가능) 한 쌍의 벡터의 외적을 계산합니다.\n" +"벡터 한 쌍의 외적을 계산합니다.\n" "\n" "OuterProduct는 첫 매개변수 'c'를 열 벡터로 취급합니다 (1열로 이루어진 행렬) " "그리고 두 번째 매개변수 'r'을 행 벡터로 취급합니다 (1행으로 이루어진 행렬) 그" @@ -8376,19 +8385,16 @@ msgid "Decomposes transform to four vectors." msgstr "변형을 4개의 벡터로 분해합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(GLES3만 가능) 변형의 행렬식을 계산합니다." +msgstr "변형의 행렬식을 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(GLES3만 가능) 변형의 역함수를 계산합니다." +msgstr "변형의 역함수를 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(GLES3만 가능) 변형의 전치를 계산합니다." +msgstr "변형의 전치를 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8435,17 +8441,16 @@ msgid "Calculates the dot product of two vectors." msgstr "두 벡터의 스칼라곱 값을 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"참조 벡터와 같은 방향을 가리키는 벡터를 반환합니다. 함수에는 세 개의 벡터 매" +"같은 방향을 가리키는 벡터를 참조 벡터로 반환합니다. 함수에는 세 개의 벡터 매" "개변수가 있습니다 : 방향을 지정하는 벡터 N, 인시던트 벡터 I, 그리고 참조 벡" -"터 Nref. I와 Nref의 스칼라곱 값이 0보다 작으면 반환값은 N이 됩니다. 그렇지 않" -"으면 -N이 반환됩니다." +"터 Nref. I와 Nref의 내적 값이 0보다 작으면 반환값은 N이 됩니다. 그렇지 않으" +"면 -N이 반환됩니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8468,7 +8473,6 @@ msgid "1.0 / vector" msgstr "1.0 / 벡터" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." @@ -8476,7 +8480,6 @@ msgstr "" "반사 방향을 가리키는 벡터를 반환합니다 (a : 인시던트 벡터, b : 노멀 벡터)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "반사 방향을 가리키는 벡터를 반환합니다." @@ -8575,68 +8578,50 @@ msgstr "" "다 (폴오프와 관련된 입력을 전달함)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(GLES3만 가능) (프래그먼트/조명 모드만 가능) 스칼라 미분 함수." +msgstr "(프래그먼트/조명 모드만 가능) 스칼라 미분 함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(GLES3만 가능) (프래그먼트/조명 모드만 가능) 벡터 미분 함수." +msgstr "(프래그먼트/조명 모드만 가능) 벡터 미분 함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." -msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (벡터) " -"도함수." +msgstr "(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (벡터) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (스칼" -"라) 도함수." +"(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (스칼라) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." -msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (벡터) " -"도함수." +msgstr "(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (벡터) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (스칼" -"라) 도함수." +"(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (스칼라) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." -msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) (벡터) 'x'와 'y'의 절대 미분 값" -"의 합." +msgstr "(프래그먼트/조명 모드만 가능) (벡터) 'x'와 'y'의 절대 미분 값의 합." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." -msgstr "" -"(GLES3만 가능) (프래그먼트/조명 모드만 가능) (스칼라) 'x'와 'y'의 절대 미분 " -"값의 합." +msgstr "(프래그먼트/조명 모드만 가능) (스칼라) 'x'와 'y'의 절대 미분 값의 합." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9848,6 +9833,11 @@ msgid "Extend Script" msgstr "스크립트 펼치기" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "부모 노드 재지정" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "씬 루트 만들기" @@ -10063,9 +10053,8 @@ msgid "Script is valid." msgstr "스크립트가 올바릅니다." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "허용됨: a-z, A-z, 0-9 그리고 _" +msgstr "허용됨: a-z, A-z, 0-9 그리고 ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11719,9 +11708,8 @@ msgid "Invalid source for shader." msgstr "셰이더에 올바르지 않은 소스." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "셰이더에 올바르지 않은 소스." +msgstr "해당 타입에 올바르지 않은 비교 함수." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11739,6 +11727,18 @@ msgstr "Varyings는 오직 버텍스 함수에서만 지정할 수 있습니다. msgid "Constants cannot be modified." msgstr "상수는 수정할 수 없습니다." +#~ msgid "Previous Folder" +#~ msgstr "이전 폴더" + +#~ msgid "Next Folder" +#~ msgstr "다음 폴더" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "스크린샷 자동 열기" + +#~ msgid "Open in an external image editor." +#~ msgstr "외부 이미지 편집기에서 열기." + #~ msgid "Reverse" #~ msgstr "뒤집기" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index d599a0274f..088260b86f 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -133,6 +133,31 @@ msgstr "Animacija: Pakeisti Iškvietimą" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija: Pakeisti Reikšmę" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija: Pakeisti Perėjimą" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija: Pakeisti Transformaciją" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija: Pakeisti Reikšmę" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija: Pakeisti Iškvietimą" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Animacijos Nodas" @@ -1694,7 +1719,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1745,7 +1770,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1771,24 +1796,28 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2671,14 +2700,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2995,6 +3016,11 @@ msgstr "Trukmė:" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Redaguoti Filtrus" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4704,7 +4730,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Visi" @@ -6714,7 +6739,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6900,10 +6929,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9745,6 +9770,11 @@ msgid "Extend Script" msgstr "Atidaryti Skriptų Editorių" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Sukurti Naują" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index ae5cc6ec65..281cbf2c8d 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -131,6 +131,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "Animāciju Cilpa" @@ -1701,7 +1721,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1752,7 +1772,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1778,24 +1798,29 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Izvēlēties šo Mapi" +msgid "Go to previous folder." +msgstr "Doties uz iepriekšējo soli" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Izvēlēties šo Mapi" +msgid "Go to next folder." +msgstr "Doties uz nākamo soli" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Meklēt:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2679,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3000,6 +3017,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Savieno Signālu:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4689,7 +4711,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6701,7 +6722,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6886,10 +6911,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9714,6 +9735,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Izveidot Jaunu %s" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11480,6 +11506,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Izvēlēties šo Mapi" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Izvēlēties šo Mapi" + #~ msgid "Delete selected files?" #~ msgstr "Izdzēst izvēlētos failus?" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 80bdde2137..8c135ea467 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -119,6 +119,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1628,7 +1648,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1679,7 +1699,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1704,23 +1724,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2590,14 +2614,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2910,6 +2926,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4564,7 +4584,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6533,7 +6552,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6718,10 +6741,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9487,6 +9506,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 08dc2fa41b..e5f1538050 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1636,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1687,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1712,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2598,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2918,6 +2934,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4572,7 +4592,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6541,7 +6560,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6726,10 +6749,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9495,6 +9514,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 32656fc4ed..6134a44d66 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "Anim Ubah Panggilan" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Ubah Masa Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Ubah Peralihan" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Ubah Penukaran" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Ubah Nilai Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Ubah Panggilan" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1652,7 +1677,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1703,7 +1728,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1728,23 +1753,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2616,14 +2645,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2936,6 +2957,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4598,7 +4623,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6573,7 +6597,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6758,10 +6786,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9544,6 +9568,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 13b003423f..28e807a399 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -19,8 +19,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" -"Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" +"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -50,24 +50,20 @@ msgid "self can't be used because instance is null (not passed)" msgstr "self kan ikke brukes siden instansen er lik null (ikke bestått)" #: core/math/expression.cpp -#, fuzzy msgid "Invalid operands to operator %s, %s and %s." -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldige argumenter til operator %s, %s og %s." #: core/math/expression.cpp -#, fuzzy msgid "Invalid index of type %s for base type %s" -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldig indeks av type %s for basistype %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid named index '%s' for base type %s" msgstr "Ugyldig navngitt indeks \"%s\" for grunntypen %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid arguments to construct '%s'" -msgstr ": Ugyldig argument av type: " +msgstr "Ugyldige argumenter for å lage \"%s\"" #: core/math/expression.cpp msgid "On call to '%s':" @@ -91,14 +87,12 @@ msgid "Time:" msgstr "Tid:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Nytt navn:" +msgstr "Verdi:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Sett inn Nøkkel" +msgstr "Sett inn nøkkel her" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" @@ -148,6 +142,31 @@ msgstr "Anim Forandre Kall" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Endre Nøkkelbildetid" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Forandre Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Forandre Omforming" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Endre Nøkkelbildeverdi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Forandre Kall" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Endre Animasjonsnavn:" @@ -1791,7 +1810,7 @@ msgstr "Vis I Filutforsker" msgid "New Folder..." msgstr "Ny Mappe..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Oppdater" @@ -1842,7 +1861,7 @@ msgstr "Gå framover" msgid "Go Up" msgstr "Gå oppover" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Veksle visning av skjulte filer" @@ -1868,27 +1887,30 @@ msgstr "Flytt Favoritt Nedover" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Forrige fane" +msgid "Go to previous folder." +msgstr "Gå til ovennevnt mappe." #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Lag mappe" +msgid "Go to next folder." +msgstr "Gå til ovennevnt mappe." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "Gå til overnevnt mappe" +msgstr "Gå til ovennevnt mappe." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "(Un)favorite current folder." -msgstr "Kunne ikke opprette mappe." +msgid "Refresh files." +msgstr "Søk i klasser" #: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "(Av)favoriser gjeldende mappe." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Veksle visning av skjulte filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2871,15 +2893,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Redigeringsverktøy-instillinger" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Åpne den neste Editoren" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Skru av/på Fullskjerm" @@ -3214,6 +3227,11 @@ msgstr "Tid:" msgid "Calls" msgstr "Ring" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Medlemmer" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "På" @@ -5031,7 +5049,6 @@ msgid "Last" msgstr "Siste" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -7143,7 +7160,12 @@ msgstr "Bak" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Høyrevisning" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Høyrevisning" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7334,10 +7356,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Slett Valgte" @@ -10274,6 +10292,11 @@ msgstr "Kjør Skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Lag ny %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Lagre Scene" @@ -12093,7 +12116,19 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstanter kan ikke endres." + +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Forrige fane" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Lag mappe" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Åpne den neste Editoren" #~ msgid "Reverse" #~ msgstr "Reverser" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 10d280e8c5..67b9141d5b 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -161,6 +161,31 @@ msgid "Anim Change Call" msgstr "Anim Wijzig Aanroep" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Wijzig Keyframe Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Wijzig Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Wijzig Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Wijzig Keyframe Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Wijzig Aanroep" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Verander Animatielengte" @@ -1753,7 +1778,7 @@ msgstr "Weergeven in Bestandsbeheer" msgid "New Folder..." msgstr "Nieuwe Map..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Verversen" @@ -1804,7 +1829,7 @@ msgstr "Ga Verder" msgid "Go Up" msgstr "Ga Omhoog" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Toggle Verborgen Bestanden" @@ -1829,25 +1854,32 @@ msgid "Move Favorite Down" msgstr "Verplaats Favoriet Naar Beneden" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Vorige Folder" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ga naar bovenliggende folder" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Volgende Folder" +#, fuzzy +msgid "Go to next folder." +msgstr "Ga naar bovenliggende folder" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Ga naar bovenliggende folder" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Zoek bestanden" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(On)favoriet huidige map." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Toggle Verborgen Bestanden" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2818,15 +2850,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Open Editor Data/Instellingen Map" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Open de volgende Editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Schakel Volledig Scherm" @@ -3146,6 +3169,11 @@ msgstr "Tijd" msgid "Calls" msgstr "Aanroepen" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Bewerk Thema..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Aan" @@ -4895,7 +4923,6 @@ msgid "Last" msgstr "Laatste" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -7033,9 +7060,14 @@ msgstr "Achter" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Uitlijnen met zicht" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Arrangeer Selectie naar Aanzicht" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Geen ouder om kind aan te instantiëren." @@ -7231,10 +7263,6 @@ msgid "Focus Selection" msgstr "Focus Selectie" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Arrangeer Selectie naar Aanzicht" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Gereedschappen" @@ -10280,6 +10308,11 @@ msgstr "Omschrijving:" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Voeg nieuwe knooppunt aan" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Klinkt logisch!" @@ -12201,6 +12234,16 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Vorige Folder" + +#~ msgid "Next Folder" +#~ msgstr "Volgende Folder" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Open de volgende Editor" + #~ msgid "Reverse" #~ msgstr "Omkeren" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index a648c2f005..61af6ef9b8 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -162,6 +162,31 @@ msgid "Anim Change Call" msgstr "Animacja - wywołanie funkcji" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Zmiana czasu klatki kluczowej" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Zmiana przejścia" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Zmiana transformacji" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Zmiana wartości klatki kluczowej" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacja - wywołanie funkcji" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Zmień długość animacji" @@ -1709,7 +1734,7 @@ msgstr "Pokaż w menedżerze plików" msgid "New Folder..." msgstr "Utwórz katalog..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Odśwież" @@ -1760,7 +1785,7 @@ msgstr "Dalej" msgid "Go Up" msgstr "W górę" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Przełącz ukryte pliki" @@ -1785,23 +1810,31 @@ msgid "Move Favorite Down" msgstr "Przesuń Ulubiony w dół" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Poprzedni folder" +#, fuzzy +msgid "Go to previous folder." +msgstr "Przejdź folder wyżej." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Następny folder" +#, fuzzy +msgid "Go to next folder." +msgstr "Przejdź folder wyżej." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Przejdź folder wyżej." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Przeszukaj pliki" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Dodaj/usuń aktualny folder z ulubionych." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Przełącz widoczność ukrytych plików." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2529,9 +2562,8 @@ msgid "Go to previously opened scene." msgstr "Wróć do poprzednio otwartej sceny." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Skopiuj ścieżkę" +msgstr "Skopiuj tekst" #: editor/editor_node.cpp msgid "Next tab" @@ -2741,14 +2773,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Zrzuty ekranu są przechowywane w folderze danych/ustawień edytora." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Automatycznie otwórz zrzuty ekranu" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Otwórz w zewnętrznym edytorze obrazów." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Pełny ekran" @@ -3065,6 +3089,11 @@ msgstr "Czas" msgid "Calls" msgstr "Wywołania" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Edytuj motyw" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Włącz" @@ -4734,9 +4763,8 @@ msgid "Idle" msgstr "Bezczynny" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Zainstaluj" +msgstr "Zainstaluj..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4767,7 +4795,6 @@ msgid "Last" msgstr "Koniec" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Wszystko" @@ -4781,9 +4808,8 @@ msgid "Sort:" msgstr "Sortuj:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Żądanie danych..." +msgstr "Odwróć sortowanie." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4864,39 +4890,32 @@ msgid "Rotation Step:" msgstr "Krok obrotu:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Przesuń Pionową Prowadnicę" +msgstr "Przesuń pionową prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Utwórz nową prowadnicę pionową" +msgstr "Utwórz pionową prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Usuń prowadnicę pionową" +msgstr "Usuń pionową prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Przesuń prowadnicę poziomą" +msgstr "Przesuń poziomą prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Utwórz nową prowadnicę poziomą" +msgstr "Utwórz poziomą prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Usuń prowadnicę poziomą" +msgstr "Usuń poziomą prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Utwórz nowe prowadnice: poziomą oraz pionową" +msgstr "Utwórz poziomą i pionową prowadnicę" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6781,9 +6800,15 @@ msgid "Rear" msgstr "Tył" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Dopasuj do widoku" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Dopasuj zaznaczenie do widoku" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Brak elementu nadrzędnego do stworzenia instancji." @@ -6971,10 +6996,6 @@ msgid "Focus Selection" msgstr "Wycentruj na zaznaczeniu" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Dopasuj zaznaczenie do widoku" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Narzędzie wyboru" @@ -7932,7 +7953,7 @@ msgstr "Typ wejścia shadera wizualnego zmieniony" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Tylko GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8019,21 +8040,20 @@ msgid "Color uniform." msgstr "Uniform koloru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Zwraca odwrotność pierwiastka kwadratowego z parametru." +msgstr "Zwraca wynik boolowski porównania %s pomiędzy dwoma parametrami." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Równe (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Większe niż (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Większe lub równe (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8046,25 +8066,25 @@ msgstr "" msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "Zwraca wynik boolowski porównania pomiędzy INF i parametrem skalarnym." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." -msgstr "" +msgstr "Zwraca wynik boolowski porównania pomiędzy NaN i parametrem skalarnym." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Mniejsze niż (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Mniejsze lub równe (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Nierówne (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8074,15 +8094,16 @@ msgstr "" "fałszywa." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Zwraca tangens parametru." +msgstr "Zwraca wynik boolowski porównania pomiędzy dwoma parametrami." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Zwraca wynik boolowski porównania pomiędzy INF (lub NaN) i parametrem " +"skalarnym." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8175,18 +8196,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Zwraca arcus cosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony cosinus hiperboliczny parametru." +msgstr "Zwraca odwrócony cosinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Zwraca arcus sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony sinus hiperboliczny parametru." +msgstr "Zwraca odwrócony sinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8197,9 +8216,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Zwraca arcus tangens parametrów." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony tangens hiperboliczny parametru." +msgstr "Zwraca odwrócony tangens hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8215,9 +8233,8 @@ msgid "Returns the cosine of the parameter." msgstr "Zwraca cosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Tylko GLES3) Zwraca cosinus hiperboliczny parametru." +msgstr "Zwraca cosinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8285,15 +8302,12 @@ msgid "1.0 / scalar" msgstr "1.0 / skalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Tylko GLES3) Znajduje najbliższą parametrowi liczbę całkowitą." +msgstr "Znajduje najbliższą parametrowi liczbę całkowitą." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "" -"(Tylko GLES3) Znajduje najbliższą parametrowi parzystą liczbę całkowitą." +msgstr "Znajduje najbliższą parametrowi parzystą liczbę całkowitą." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8308,9 +8322,8 @@ msgid "Returns the sine of the parameter." msgstr "Zwraca sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Tylko GLES3) Zwraca sinus hiperboliczny parametru." +msgstr "Zwraca sinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8346,14 +8359,12 @@ msgid "Returns the tangent of the parameter." msgstr "Zwraca tangens parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Tylko GLES3) Zwraca tangens hiperboliczny parametru." +msgstr "Zwraca tangens hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Tylko GLES3) Zwraca obciętą wartość parametru." +msgstr "Zwraca obciętą wartość parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8392,26 +8403,22 @@ msgid "Perform the texture lookup." msgstr "Wykonaj podejrzenie tekstury." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Uniform tekstury kubicznej." +msgstr "Podejrzenie uniformu tekstury kubicznej." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Uniform tekstury 2D." +msgstr "Podejrzenie uniformu tekstury 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Uniform tekstury 2D." +msgstr "Podejrzenie uniformu tekstury 2D triplanarnej." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Funkcja transformacji." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8421,7 +8428,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Tylko GLES3) Oblicz iloczyn diadyczny pary wektorów.\n" +"Oblicz iloczyn diadyczny pary wektorów.\n" "\n" "OuterProduct traktuje pierwszy parametr \"c\" jako kolumnowy wektor (macierz " "z jedną kolumną) i drugi parametr \"r\" jako rzędowy wektor (macierz z " @@ -8438,19 +8445,16 @@ msgid "Decomposes transform to four vectors." msgstr "Rozkłada przekształcenie na cztery wektory." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Tylko GLES3) Liczy wyznacznik przekształcenia." +msgstr "Liczy wyznacznik przekształcenia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Tylko GLES3) Liczy odwrotność przekształcenia." +msgstr "Liczy odwrotność przekształcenia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Tylko GLES3) Liczy transpozycję przekształcenia." +msgstr "Liczy transpozycję przekształcenia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8497,7 +8501,6 @@ msgid "Calculates the dot product of two vectors." msgstr "Liczy iloczyn skalarny dwóch wektorów." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " @@ -8531,7 +8534,6 @@ msgid "1.0 / vector" msgstr "1.0 / wektor" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." @@ -8540,7 +8542,6 @@ msgstr "" "normalny )." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "Zwraca wektor skierowany w kierunku załamania." @@ -8641,70 +8642,60 @@ msgstr "" "kierunku widoku kamery (podaj tu powiązane wejście)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) Skalarna pochodna funkcji." +msgstr "(Tylko tryb fragmentów/światła) Skalarna pochodna funkcji." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) Wektorowa pochodna funkcji." +msgstr "(Tylko tryb fragmentów/światła) Wektorowa pochodna funkcji." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Wektor) Pochodna po \"x\" " -"używając lokalnej zmienności." +"(Tylko tryb fragmentów/światła) (Wektor) Pochodna po \"x\" używając lokalnej " +"zmienności." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Skalar) Pochodna po \"x\" " -"używając lokalnej zmienności." +"(Tylko tryb fragmentów/światła) (Skalar) Pochodna po \"x\" używając lokalnej " +"zmienności." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Wektor) Pochodna po \"y\" " -"używając lokalnej zmienności." +"(Tylko tryb fragmentów/światła) (Wektor) Pochodna po \"y\" używając lokalnej " +"zmienności." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Skalar) Pochodna po \"y\" " -"używając lokalnej zmienności." +"(Tylko tryb fragmentów/światła) (Skalar) Pochodna po \"y\" używając lokalnej " +"zmienności." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Wektor) Suma bezwzględnej " -"pochodnej po \"x\" i \"y\"." +"(Tylko tryb fragmentów/światła) (Wektor) Suma bezwzględnej pochodnej po \"x" +"\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Tylko GLES3) (Tylko tryb fragmentów/światła) (Skalar) Suma bezwzględnej " -"pochodnej po \"x\" i \"y\"." +"(Tylko tryb fragmentów/światła) (Skalar) Suma bezwzględnej pochodnej po \"x" +"\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9930,6 +9921,11 @@ msgid "Extend Script" msgstr "Rozszerz skrypt" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Zmień nadrzędny węzeł" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Zmień na korzeń sceny" @@ -9947,7 +9943,7 @@ msgstr "Skopiuj ścieżkę węzła" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "Usuń (bez potwierdzenie)" +msgstr "Usuń (bez potwierdzenia)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node." @@ -10146,9 +10142,8 @@ msgid "Script is valid." msgstr "Skrypt jest prawidłowy." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Dostępne znaki: a-z, A-Z, 0-9 i _" +msgstr "Dozwolone: a-z, A-Z, 0-9, _ i ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11828,9 +11823,8 @@ msgid "Invalid source for shader." msgstr "Niewłaściwe źródło dla shadera." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Niewłaściwe źródło dla shadera." +msgstr "Niewłaściwa funkcja porównania dla tego typu." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11848,6 +11842,18 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchołków." msgid "Constants cannot be modified." msgstr "Stałe nie mogą być modyfikowane." +#~ msgid "Previous Folder" +#~ msgstr "Poprzedni folder" + +#~ msgid "Next Folder" +#~ msgstr "Następny folder" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Automatycznie otwórz zrzuty ekranu" + +#~ msgid "Open in an external image editor." +#~ msgstr "Otwórz w zewnętrznym edytorze obrazów." + #~ msgid "Reverse" #~ msgstr "Odwróć" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 7b71f79b28..1ab60028e0 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -143,6 +143,31 @@ msgid "Anim Change Call" msgstr "Change yer Anim Call" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Change yer Anim Value" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Change yer Anim Transition" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Change yer Anim Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Change yer Anim Value" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Change yer Anim Call" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1694,7 +1719,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1745,7 +1770,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1771,24 +1796,28 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Slit th' Node" +msgid "Go to previous folder." +msgstr "Toggle ye Breakpoint" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Slit th' Node" +msgid "Go to next folder." +msgstr "Toggle ye Breakpoint" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2675,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3001,6 +3022,11 @@ msgstr "" msgid "Calls" msgstr "Call" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "th' Members:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4709,7 +4735,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6738,7 +6763,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6924,10 +6953,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Yar, Blow th' Selected Down!" @@ -9779,6 +9804,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11588,6 +11618,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Slit th' Node" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Slit th' Node" + +#, fuzzy #~ msgid "Custom Node" #~ msgstr "Slit th' Node" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 4b76dcf9eb..6648ae1f7e 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -64,12 +64,13 @@ # Douglas Fiedler <dognew@gmail.com>, 2019. # Rarysson Guilherme <r_guilherme12@hotmail.com>, 2019. # Gustavo da Silva Santos <gustavo94.rb@gmail.com>, 2019. +# Rafael Roque <rafael.roquec@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" -"Last-Translator: Esdras Tarsis <esdrastarsis@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Rafael Roque <rafael.roquec@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -188,6 +189,31 @@ msgid "Anim Change Call" msgstr "Alterar Chamada da Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Alterar Tempo de Quadro-Chave da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Alterar Transição da Animação" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Alterar Transformação da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Alterar Valor de Quadro-Chave da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Alterar Chamada da Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Alterar Duração da Animação" @@ -1737,7 +1763,7 @@ msgstr "Mostrar no Gerenciador de Arquivos" msgid "New Folder..." msgstr "Nova Pasta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Atualizar" @@ -1788,7 +1814,7 @@ msgstr "Avançar" msgid "Go Up" msgstr "Acima" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Alternar Arquivos Ocultos" @@ -1813,23 +1839,31 @@ msgid "Move Favorite Down" msgstr "Mover Favorito Abaixo" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Pasta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir para diretório (pasta) pai." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Próxima Pasta" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir para diretório (pasta) pai." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir para diretório (pasta) pai." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Pesquisar arquivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(Des)favoritar pasta atual." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Alternar visibilidade de arquivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2562,9 +2596,8 @@ msgid "Go to previously opened scene." msgstr "Ir para cena aberta anteriormente." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Copiar Caminho" +msgstr "Copiar Texto" #: editor/editor_node.cpp msgid "Next tab" @@ -2777,14 +2810,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Capturas de Telas ficam salvas na Pasta Editor Data/Settings." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Abrir Capturas de Tela Automaticamente" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Abrir em um editor de imagens externo." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Alternar Tela-Cheia" @@ -2945,13 +2970,12 @@ msgid "Manage Templates" msgstr "Gerenciar Templates" #: editor/editor_node.cpp -#, fuzzy msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" "Isso instalará o projeto Android para compilações personalizadas.\n" -"Observe que, para usá-lo, ele precisa ser ativado por predefinição de " +"Note que, para usá-lo, ele precisa estar habilitado por predefinição de " "exportação." #: editor/editor_node.cpp @@ -3071,7 +3095,7 @@ msgstr "Medida:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "Tempo de Quadro (seg)" +msgstr "Tempo do Frame (seg)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" @@ -3079,11 +3103,11 @@ msgstr "Tempo Médio (seg)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "% de Quadro" +msgstr "Frame %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "Quadro Físico %" +msgstr "Frame de Física %" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -3105,6 +3129,11 @@ msgstr "Tempo" msgid "Calls" msgstr "Chamadas" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Ativo" @@ -4776,9 +4805,8 @@ msgid "Idle" msgstr "Ocioso" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Instalar" +msgstr "Instalar..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4809,7 +4837,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4823,9 +4850,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Solicitando..." +msgstr "Inverter ordenação." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4906,39 +4932,32 @@ msgid "Rotation Step:" msgstr "Passo de Rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Mover guia vertical" +msgstr "Mover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Criar novo guia vertical" +msgstr "Criar Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Remover guia vertical" +msgstr "Remover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Mover guia horizontal" +msgstr "Mover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Criar novo guia horizontal" +msgstr "Criar Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Remover guia horizontal" +msgstr "Remover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Criar novos guias horizontais e verticais" +msgstr "Criar Guias Horizontais e Verticais" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5299,9 +5318,8 @@ msgid "Divide grid step by 2" msgstr "Dividir o passo da grade por 2" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "Visão Traseira" +msgstr "Vista Panorâmica" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5525,9 +5543,8 @@ msgid "This doesn't work on scene root!" msgstr "Não funciona na raiz da cena!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" -msgstr "Criar Forma Trimesh" +msgstr "Criar Forma Estática Trimesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Failed creating shapes!" @@ -5955,9 +5972,8 @@ msgid "Split Segment (in curve)" msgstr "Dividir Segmentos (na curva)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Mover junta" +msgstr "Mover Junta" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -6290,18 +6306,16 @@ msgid "Find Next" msgstr "Localizar próximo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtrar propriedades" +msgstr "Filtrar scripts" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alternar ordenação alfabética da lista de métodos." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Modo de filtragem:" +msgstr "Métodos de filtragem" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6544,7 +6558,7 @@ msgstr "Marcadores" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Breakpoints" -msgstr "Criar pontos." +msgstr "Pontos de interrupção(Breakpoints)" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6572,19 +6586,16 @@ msgid "Toggle Bookmark" msgstr "Alternar Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Vá para o próximo ponto de interrupção" +msgstr "Ir para o Próximo Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Ir para ponto de interrupção anterior" +msgstr "Ir para o Marcador Anterior" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Marcadores" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" @@ -6665,8 +6676,8 @@ msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"Os seguintes arquivos são mais recentes no disco.\n" -"Que ação deve ser tomada?:" +"Este shader foi modificado no disco.\n" +"Que ação deve ser tomada?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6837,9 +6848,15 @@ msgid "Rear" msgstr "Traseira" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinhar com a Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinhar Seleção com Visualização" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Sem pai onde instanciar um filho." @@ -7027,10 +7044,6 @@ msgid "Focus Selection" msgstr "Focar Seleção" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinhar Seleção com Visualização" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Ferramenta Selecionar" @@ -7246,21 +7259,20 @@ msgid "Settings:" msgstr "Configurações:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "Seleção de Quadros" +msgstr "Nenhum Frame Selecionado" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "Adicionar %d Quadro(s)" +msgstr "Adicionar %d Frame(s)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "Adicionar Quadro" +msgstr "Adicionar Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "ERRO: Não foi possível carregar recurso de quadro!" +msgstr "ERRO: Não foi possível carregar o recurso de frame!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" @@ -7268,7 +7280,7 @@ msgstr "Recurso da área de transferência está vazio ou não é uma textura!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "Colar Quadro" +msgstr "Colar Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" @@ -7300,7 +7312,7 @@ msgstr "Repetir" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames:" -msgstr "Quadros da Animação:" +msgstr "Frames da Animação:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add a Texture from File" @@ -7308,7 +7320,7 @@ msgstr "Adicionar Textura de um Arquivo" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "Adicionar Quadros de uma Sprite Sheet" +msgstr "Adicionar Frames de uma Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7327,9 +7339,8 @@ msgid "Move (After)" msgstr "Mover (Depois)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "Pilha de Quadros" +msgstr "Selecionar Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" @@ -7340,14 +7351,13 @@ msgid "Vertical:" msgstr "Vertical:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "Selecionar Tudo" +msgstr "Selecionar/Deselecionar Todos os Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "Criar a partir de Cena" +msgstr "Criar Frames a partir da Planilha de Sprites" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -7419,9 +7429,8 @@ msgid "Remove All" msgstr "Remover Tudo" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Editar tema..." +msgstr "Editar Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -7448,23 +7457,20 @@ msgid "Create From Current Editor Theme" msgstr "Criar a Partir do Tema Atual do Editor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Botão do Mous" +msgstr "Alternar Botão" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "Botão do Meio" +msgstr "Botão Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" msgstr "Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Desabilitado" +msgstr "Item Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" @@ -7483,7 +7489,6 @@ msgid "Checked Radio Item" msgstr "Item Rádio Marcado" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Named Sep." msgstr "Sep. Nomeado" @@ -7492,14 +7497,12 @@ msgid "Submenu" msgstr "Submenu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 1" -msgstr "Item" +msgstr "Item 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 2" -msgstr "Item" +msgstr "Item 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7510,9 +7513,8 @@ msgid "Many" msgstr "Muitas" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Desabilitado" +msgstr "LineEdit Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7527,9 +7529,8 @@ msgid "Tab 3" msgstr "Guia 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "Filhos Editáveis" +msgstr "Item Editável" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" @@ -7605,14 +7606,12 @@ msgid "Transpose" msgstr "Transpor" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Disable Autotile" -msgstr "Autotiles" +msgstr "Desativar Autotile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "Editar prioridade da telha" +msgstr "Ativar Prioridade" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" @@ -7631,27 +7630,22 @@ msgid "Pick Tile" msgstr "Pegar Tile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" msgstr "Rotacionar para a esquerda" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" msgstr "Rotacionar para a direita" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Horizontally" -msgstr "Girar horizontalmente" +msgstr "Inverter Horizontalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Vertically" -msgstr "Girar verticalmente" +msgstr "Inverter Verticalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" msgstr "Limpar Transformação" @@ -7690,42 +7684,35 @@ msgstr "Selecione a forma, subtile ou tile anterior." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Region Mode" -msgstr "Modo de Início:" +msgstr "Modo de Região" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "Modo de Interpolação" +msgstr "Modo de Colisão" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Editar polígono de oclusão" +msgstr "Modo de Oclusão" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Criar Malha de Navegação" +msgstr "Modo de Navegação" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Modo Rotacionar" +msgstr "Modo Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "Modo de Exportação:" +msgstr "Modo de Prioridade" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Modo Panorâmico" +msgstr "Modo de Ícone" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Modo Panorâmico" +msgstr "Modo Índice Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -7815,8 +7802,9 @@ msgid "" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." msgstr "" -"LMB: ligar bit.\n" -"RMB: desligar bit.\n" +"BEM: ligar bit.\n" +"BDM: desligar bit.\n" +"Shift+BEM: Escolher wildcard.\n" "Clique em outro Mosaico para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp @@ -7930,19 +7918,16 @@ msgid "TileSet" msgstr "Conjunto de Telha" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input +" -msgstr "Adicionar Entrada" +msgstr "Adicionar Entrada +" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add output +" -msgstr "Adicionar Entrada" +msgstr "Adicionar saída +" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "Escala:" +msgstr "Escalar" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" @@ -7953,9 +7938,8 @@ msgid "Boolean" msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "Adicionar Entrada" +msgstr "Adicionar porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" @@ -7964,42 +7948,36 @@ msgstr "Adicionar porta de saída" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Change input port type" -msgstr "Mudar tipo padrão" +msgstr "Mudar tipo de porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Change output port type" -msgstr "Mudar tipo padrão" +msgstr "Mudar tipo de porta de saída" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "Alterar Nome da Entrada" +msgstr "Alterar nome da porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "Alterar Nome da Entrada" +msgstr "Alterar nome da porta de saída" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Remover ponto" +msgstr "Remover porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Remover ponto" +msgstr "Remover porta de saída" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Alterar Expressão" +msgstr "Definir expressão" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "VisualShader" +msgstr "Redimensionar nó VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" @@ -8027,7 +8005,7 @@ msgstr "Tipo de Entrada de Shader Visual Alterado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Apenas GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8044,21 +8022,19 @@ msgstr "Luz" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Create Shader Node" -msgstr "Criar Nó" +msgstr "Criar Nó Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Ir para Função" +msgstr "Função cor." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." msgstr "Operador de cor." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Fazer Função" +msgstr "Função Escala de Cinza." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." @@ -8069,9 +8045,8 @@ msgid "Converts RGB vector to HSV equivalent." msgstr "Converter vetor RGB para um HSV equivalente." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Renomear Função" +msgstr "Função Sépia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." @@ -8082,13 +8057,12 @@ msgid "Darken operator." msgstr "Operador de escurecimento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Apenas Diferenças" +msgstr "Operador de diferença." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Operador de desvio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" @@ -8108,34 +8082,33 @@ msgstr "Operador de tela." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "Operador SoftLight." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Color constant." -msgstr "Constante" +msgstr "Cor constante." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Color uniform." -msgstr "Limpar Transformação" +msgstr "Cor uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Retorna o inverso da raiz quadrada do parâmetro." +msgstr "Retorna o resultado booleano da comparação %s entre dois parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Igual (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Maior Que (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Maior ou Igual (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8149,24 +8122,26 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Retorna o resultado booleano da comparação entre INF e o parâmetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Retorna o resultado booleano da comparação entre NaN e um parâmetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Menor Que (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Menor ou Igual (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Diferente (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8176,20 +8151,20 @@ msgstr "" "falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Retorna a tangente do parâmetro." +msgstr "Retorna o resultado booleano da comparação entre dois parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Retorna o resultado booleano da comparação entre INF (ou NaN) e um parâmetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." -msgstr "Alterar Constante Vet" +msgstr "Constante booleana." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." @@ -8197,46 +8172,53 @@ msgstr "Booleano uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "Parâmetro de entrada '%s' para todos os modos de sombreamento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Encaixar no pai" +msgstr "Parâmetro de entrada." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." msgstr "" +"Parâmetro de entrada '%s' para os modos de sombreamento de vértice e " +"fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." msgstr "" +"Parâmetro de entrada '%s' para os modos de sombreamento de fragmento e luz." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de luz." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de vértice." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." msgstr "" +"Parâmetro de entrada '%s' para o modo de sombreamento de vértice e fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Alterar Função Escalar" +msgstr "Função escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "Alterar Operador Escalar" +msgstr "Operador escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." @@ -8279,18 +8261,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Retorna o arco-cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Somente em GLES3) Retorna o coseno hiperbólico inverso do parâmetro." +msgstr "Retorna o cosseno hiperbólico inverso do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Retorna o arco-seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Somente em GLES3) Retorna o seno hiperbólico inverso do parâmetro." +msgstr "Retorna o seno hiperbólico inverso do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8301,10 +8281,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Retorna o arco-tangente dos parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "" -"(Somente em GLES3) Retorna a tangente hiperbólica inversa do parâmetro." +msgstr "Retorna a tangente hiperbólica inversa do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8313,21 +8291,19 @@ msgstr "Encontra o inteiro mais próximo que é maior ou igual ao parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Limita um valor para permanecer entre dois outros valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." msgstr "Retorna o cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Somente em GLES3) Retorna o coseno hiperbólico do parâmetro." +msgstr "Retorna o cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Converts a quantity in radians to degrees." -msgstr "Converte uma quantidade em radianos para graus." +msgstr "Converte um valor em radianos para graus." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." @@ -8343,8 +8319,9 @@ msgid "Finds the nearest integer less than or equal to the parameter." msgstr "Encontra o inteiro mais próximo que é menor ou igual ao parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Calcula a parte decimal do argumento." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." @@ -8361,11 +8338,11 @@ msgstr "Logaritmo de Base-2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Retorna o maior entre dois valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Retorna o menor entre dois valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." @@ -8393,18 +8370,16 @@ msgid "1.0 / scalar" msgstr "1,0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Somente em GLES3) Encontra o inteiro mais próximo ao parâmetro." +msgstr "Encontra o inteiro mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Somente em GLES3) Encontra o inteiro par mais próximo ao parâmetro." +msgstr "Encontra o inteiro par mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Limita o valor entre 0.0 e 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." @@ -8415,15 +8390,15 @@ msgid "Returns the sine of the parameter." msgstr "Retorna o seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Somente em GLES3) Retorna o seno hiperbólico do parâmetro." +msgstr "Retorna o seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." msgstr "Retorna a raiz quadrada do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" "SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" "\n" @@ -8431,13 +8406,22 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Função SmoothStep( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Retorna 0.0 se 'x' é menor que 'edge0' e 1.0 se 'x' é maior que 'edge1'. " +"Caso contrário o valor retornado é interpolado entre 0.0 e 1.0 utilizando " +"polinômios de Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" "Step function( scalar(edge), scalar(x) ).\n" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Função Step( scalar(edge), scalar(x) ).\n" +"\n" +"Retorna 0.0 se 'x' é menor que 'edge' e 1.0 caso contrário." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." @@ -8489,8 +8473,9 @@ msgid "Scalar uniform." msgstr "Alterar Uniforme Escalar" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Faça a pesquisa da textura cúbica." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." @@ -10003,6 +9988,11 @@ msgid "Extend Script" msgstr "Estender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reparentar Nó" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Fazer Raiz de Cena" @@ -11951,6 +11941,18 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "Previous Folder" +#~ msgstr "Pasta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Próxima Pasta" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Tela Automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir em um editor de imagens externo." + #~ msgid "Reverse" #~ msgstr "Reverso" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index 21abed515a..b223e41766 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_PT/>\n" @@ -139,6 +139,31 @@ msgid "Anim Change Call" msgstr "Anim Mudar Chamada" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Mudar Tempo do Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Mudar Transição" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Mudar Transformação" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Mudar Valor do Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Mudar Chamada" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Mudar Duração da Animação" @@ -1692,7 +1717,7 @@ msgstr "Mostrar no Gestor de Ficheiros" msgid "New Folder..." msgstr "Nova Diretoria..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Atualizar" @@ -1743,7 +1768,7 @@ msgstr "Avançar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Alternar Ficheiros escondidos" @@ -1768,23 +1793,31 @@ msgid "Move Favorite Down" msgstr "Mover Favorito para Baixo" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Pasta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir para a pasta acima." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Próxima Pasta" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir para a pasta acima." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir para a pasta acima." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Procurar ficheiros" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(Não) tornar favorita atual pasta." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Alternar visibilidade de ficheiros escondidos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2516,9 +2549,8 @@ msgid "Go to previously opened scene." msgstr "Ir para Cena aberta anteriormente." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Copiar Caminho" +msgstr "Copiar Texto" #: editor/editor_node.cpp msgid "Next tab" @@ -2731,14 +2763,6 @@ msgstr "" "Capturas do ecrã são armazenadas na pasta Dados/Configurações do Editor." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Abrir Capturas do ecrã automaticamente" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Abrir num editor de imagem externo." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Alternar Ecrã completo" @@ -3055,6 +3079,11 @@ msgstr "Tempo" msgid "Calls" msgstr "Chamadas" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -4718,9 +4747,8 @@ msgid "Idle" msgstr "Inativo" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Instalar" +msgstr "Instalar..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4751,7 +4779,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4765,9 +4792,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "A solicitar..." +msgstr "Inverter ordenação." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4846,39 +4872,32 @@ msgid "Rotation Step:" msgstr "Passo da rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" -msgstr "Mover guia vertical" +msgstr "Mover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Criar nova guia vertical" +msgstr "Criar Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Remover guia vertical" +msgstr "Remover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "Mover guia horizontal" +msgstr "Mover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Criar nova guia horizontal" +msgstr "Criar Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Remover guia horizontal" +msgstr "Remover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Criar guias horizontal e vertical" +msgstr "Criar Guias Horizontais e Verticais" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6759,9 +6778,15 @@ msgid "Rear" msgstr "Trás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinhar com a Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinhar seleção com vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Sem parente para criar instância de filho." @@ -6949,10 +6974,6 @@ msgid "Focus Selection" msgstr "Focar na seleção" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinhar seleção com vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleção de ferramenta" @@ -7909,7 +7930,7 @@ msgstr "Alterado Tipo de Entrada do Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Apenas GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -7996,21 +8017,20 @@ msgid "Color uniform." msgstr "Uniforme Cor." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Devolve o inverso da raiz quadrada do parâmetro." +msgstr "Devolve o resultado lógico da comparação %s entre dois parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Igual (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Maior Que (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Maior ou Igual a (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8024,24 +8044,26 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Devolve o resultado lógico da comparação entre INF e um parâmetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Devolve o resultado lógico da comparação entre NaN e um parâmetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Menor Que (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Menor ou Igual a (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Diferente (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8051,15 +8073,16 @@ msgstr "" "falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Devolve a tangente do parâmetro." +msgstr "Devolve o resultado lógico da comparação entre dois parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Devolve o resultado lógico da comparação entre INF (ou NaN) e um parâmetro " +"escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8150,18 +8173,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Devolve o arco seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Apenas GLES3) Devolve o arco cosseno hiperbólico do parâmetro." +msgstr "Devolve o arco cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Devolve o arco seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Apenas GLES3) Devolve o arco seno hiperbólico do parâmetro." +msgstr "Devolve o arco seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8172,9 +8193,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Devolve o arco tangente do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Apenas GLES3) Devolve o arco tangente hiperbólico do parâmetro." +msgstr "Devolve o arco tangente hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8190,9 +8210,8 @@ msgid "Returns the cosine of the parameter." msgstr "Devolve o cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Apenas GLES3) Devolve o cosseno hiperbólico do parâmetro." +msgstr "Devolve o cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8260,14 +8279,12 @@ msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Apenas GLES3) Encontra o inteiro mais próximo do parâmetro." +msgstr "Encontra o inteiro mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Apenas GLES3) Encontra o inteiro ímpar mais próximo do parâmetro." +msgstr "Encontra o inteiro ímpar mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8282,9 +8299,8 @@ msgid "Returns the sine of the parameter." msgstr "Devolve o seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Apenas GLES3) Devolve o seno hiperbólico do parâmetro." +msgstr "Devolve o seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8319,14 +8335,12 @@ msgid "Returns the tangent of the parameter." msgstr "Devolve a tangente do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Apenas GLES3) Devolve a tangente hiperbólica do parâmetro." +msgstr "Devolve a tangente hiperbólica do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Apenas GLES3) Encontra o valor truncado do parâmetro." +msgstr "Encontra o valor truncado do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8365,26 +8379,22 @@ msgid "Perform the texture lookup." msgstr "Executa texture lookup." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Uniforme Textura Cúbica." +msgstr "Consulta uniforme de textura cúbica." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Uniforme Textura 2D." +msgstr "Consulta uniforme de textura 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Uniforme Textura 2D." +msgstr "Consulta uniforme de textura 2D com triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Função Transformação." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8394,7 +8404,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Apenas GLES3) Calcula o produto tensorial de um par de vetores.\n" +"Calcula o produto tensorial de um par de vetores.\n" "\n" "OuterProduct trata o primeiro parâmetro 'c' como um vetor coluna (matriz com " "uma coluna) e o segundo parâmetro 'r' como um vetor linha (matriz com uma " @@ -8411,19 +8421,16 @@ msgid "Decomposes transform to four vectors." msgstr "Decompõe transformação em quatro vetores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Apenas GLES3) Calcula o determinante de uma transformação." +msgstr "Calcula o determinante de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Apenas GLES3) Calcula o inverso de uma transformação." +msgstr "Calcula o inverso de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Apenas GLES3) Calcula a transposta de uma transformação." +msgstr "Calcula a transposta de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8470,7 +8477,6 @@ msgid "Calculates the dot product of two vectors." msgstr "Calcula o produto escalar de dois vetores." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " @@ -8503,7 +8509,6 @@ msgid "1.0 / vector" msgstr "1.0 / vetor" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." @@ -8512,7 +8517,6 @@ msgstr "" "b : vetor normal )." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "Devolve um vetor que aponta na direção da refração." @@ -8612,68 +8616,57 @@ msgstr "" "da câmara (passa entradas associadas)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(Apenas GLES3) (apenas modo Fragment/Light) Função derivada escalar." +msgstr "(Apenas modo Fragment/Light) Função derivada escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(Apenas GLES3) (apenas modo Fragment/Light) Função derivada vetorial." +msgstr "(Apenas modo Fragment/Light) Função derivada vetorial." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." -msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) Derivação em 'x' usando " -"derivação local." +msgstr "(Apenas modo Fragment/Light) Derivada em 'x' usando derivação local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Derivação em 'x' " -"usando derivação local." +"(Apenas modo Fragment/Light) (Escalar) Derivada em 'x' usando derivação " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Vetor) Derivação em 'y' usando " -"derivação local." +"(Apenas modo Fragment/Light) (Vetor) Derivada em 'y' usando derivação local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Derivação em 'y' " -"usando derivação local." +"(Apenas modo Fragment/Light) (Escalar) Derivada em 'y' usando derivação " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Vetor) Soma das derivadas " -"absolutas em 'x' e 'y'." +"(Apenas modo Fragment/Light) (Vetor) Soma das derivadas absolutas em 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Soma das derivadas " -"absolutas em 'x' e 'y'." +"(Apenas modo Fragment/Light) (Escalar) Soma das derivadas absolutas em 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9897,6 +9890,11 @@ msgid "Extend Script" msgstr "Estender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Recolocar Nó" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Tornar Nó Raiz" @@ -10113,9 +10111,8 @@ msgid "Script is valid." msgstr "Script é válido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Permitido: a-z, A-Z, 0-9 e _" +msgstr "Permitido: a-z, A-Z, 0-9, _ e ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11794,9 +11791,8 @@ msgid "Invalid source for shader." msgstr "Fonte inválida para Shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Fonte inválida para Shader." +msgstr "Função de comparação inválida para este tipo." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11814,6 +11810,18 @@ msgstr "Variações só podem ser atribuídas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "Previous Folder" +#~ msgstr "Pasta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Próxima Pasta" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas do ecrã automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir num editor de imagem externo." + #~ msgid "Reverse" #~ msgstr "Inverter" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 0670ec1fbf..efb7ff3a4c 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -136,6 +136,31 @@ msgstr "Anim Schimbare apelare" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Schimbați Timpul Cadru Cheie" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Schimbați Tranziție" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Schimbare transformare" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Schimbare valoare cadre cheie" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Schimbare apelare" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Schimbă Numele Animației:" @@ -1755,7 +1780,7 @@ msgstr "Arătați în Administratorul de Fișiere" msgid "New Folder..." msgstr "Director Nou..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Reîmprospătați" @@ -1806,7 +1831,7 @@ msgstr "Înainte" msgid "Go Up" msgstr "Sus" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Comutați Fișiere Ascunse" @@ -1832,27 +1857,32 @@ msgstr "Deplasați Favorit Jos" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Fila anterioară" +msgid "Go to previous folder." +msgstr "Accesați Directorul Părinte" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Creați Director" +msgid "Go to next folder." +msgstr "Accesați Directorul Părinte" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Accesați Directorul Părinte" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Căutare Clase" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Directorul nu a putut fi creat." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Comutați Fișiere Ascunse" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2829,15 +2859,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Setări ale Editorului" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Deschide Editorul următor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Comută în Ecran Complet" @@ -3163,6 +3184,11 @@ msgstr "Timp" msgid "Calls" msgstr "Apeluri" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Membri" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4936,7 +4962,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Toate" @@ -7034,7 +7059,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7223,10 +7252,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -10135,6 +10160,11 @@ msgstr "Execută Scriptul" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Creați %s Nou" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Salvează Scena" @@ -11920,6 +11950,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Fila anterioară" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Creați Director" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Deschide Editorul următor" + #~ msgid "Reverse" #~ msgstr "Revers" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 7e1ca36524..24fb5100bb 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -52,12 +52,13 @@ # Дмитрий Ефимов <daefimov@gmail.com>, 2019. # Sergey <www.window1@mail.ru>, 2019. # Vladislav <onion.ring@mail.ru>, 2019. +# knightpp <kotteam99@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" -"Last-Translator: Sergey <www.window1@mail.ru>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: knightpp <kotteam99@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -178,6 +179,31 @@ msgid "Anim Change Call" msgstr "Изменить вызов анимации" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Изменить время ключевого кадра" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Изменить переход" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Изменить положение" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Измененить значение ключевого кадра" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Изменить вызов анимации" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Изменить длину анимации" @@ -503,9 +529,8 @@ msgid "Group tracks by node or display them as plain list." msgstr "Группировать треки по узлам или показывать их как простой список." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "Привязка" +msgstr "Привязка:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -1648,6 +1673,7 @@ msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Профиль '%s' уже существует. Удалите его перед импортом, импорт отменен." #: editor/editor_feature_profile.cpp #, fuzzy @@ -1656,7 +1682,7 @@ msgstr "Ошибка при загрузке шаблона '%s'" #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "Сбросить" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1747,7 +1773,7 @@ msgstr "Просмотреть в проводнике" msgid "New Folder..." msgstr "Новая папка..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Обновить" @@ -1798,7 +1824,7 @@ msgstr "Вперёд" msgid "Go Up" msgstr "Вверх" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Скрыть файлы" @@ -1823,24 +1849,31 @@ msgid "Move Favorite Down" msgstr "Переместить избранное вниз" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Предыдущая папка" +#, fuzzy +msgid "Go to previous folder." +msgstr "Перейти к родительской папке." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Следующая папка" +#, fuzzy +msgid "Go to next folder." +msgstr "Перейти к родительской папке." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Перейти к родительской папке." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Поиск файлов" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Добавить или удалить текущую папку из избранных." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Скрыть файлы" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2524,7 +2557,7 @@ msgstr "Закрыть другие вкладки" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Закрыть вкладки справа" #: editor/editor_node.cpp #, fuzzy @@ -2668,7 +2701,7 @@ msgstr "Открыть папку с данными проекта" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Установить шаблон сборки Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2789,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Открыть папку Данные/Настройки редактора" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Открыть следующий редактор" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Переключить полноэкранный режим" @@ -2955,6 +2979,8 @@ msgstr "Не сохранять" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Шаблон сборки Android отсутствует, пожалуйста, установите соответствующие " +"шаблоны." #: editor/editor_node.cpp #, fuzzy @@ -3116,6 +3142,11 @@ msgstr "Время" msgid "Calls" msgstr "Вызовы" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Редактировать тему..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Вкл" @@ -4826,7 +4857,6 @@ msgid "Last" msgstr "Последняя" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Все" @@ -6886,9 +6916,14 @@ msgstr "Зад" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Выравнять с областью просмотра" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Совместить выбранное с видом" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Не выбран родитель для добавления потомка." @@ -7079,10 +7114,6 @@ msgid "Focus Selection" msgstr "Показать выбранное" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Совместить выбранное с видом" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Инструмент выбора" @@ -10035,6 +10066,11 @@ msgid "Extend Script" msgstr "Расширить скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Переподчинить узел" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Создать корневой узел сцены" @@ -11978,6 +12014,19 @@ msgstr "Изменения могут быть назначены только msgid "Constants cannot be modified." msgstr "Константы не могут быть изменены." +#~ msgid "Previous Folder" +#~ msgstr "Предыдущая папка" + +#~ msgid "Next Folder" +#~ msgstr "Следующая папка" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Автоматически открывать скриншоты" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Открыть следующий редактор" + #~ msgid "Reverse" #~ msgstr "Обратно" diff --git a/editor/translations/si.po b/editor/translations/si.po index e9b1a10d98..68f2b09028 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -128,6 +128,31 @@ msgstr "Anim කැදවීම් වෙනස් කරන්න" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim කීෆ්රේම් කාලය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim සංක්රමණය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim පරිවර්තනය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim කීෆ්රේම් අගය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim කැදවීම් වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "සජීවීකරණ පුනරාවර්ථනය" @@ -1652,7 +1677,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1703,7 +1728,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1728,23 +1753,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2614,14 +2643,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2935,6 +2956,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4595,7 +4620,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6573,7 +6597,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6758,10 +6786,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9546,6 +9570,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 4de70122d0..bed5a879ef 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Animácia Zmeniť Hovor" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animácia Zmeniť Keyframe Čas" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animácia zmeniť prechod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animácia zmeniť prechod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animácia Zmeniť Keyframe Hodnotu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animácia Zmeniť Hovor" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Zmeniť Dĺžku Animácie" @@ -1696,7 +1721,7 @@ msgstr "Otvoriť súbor" msgid "New Folder..." msgstr "Vytvoriť adresár" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1747,7 +1772,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1773,12 +1798,12 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "Vytvoriť adresár" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "Vytvoriť adresár" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp @@ -1786,12 +1811,16 @@ msgstr "Vytvoriť adresár" msgid "Go to parent folder." msgstr "Vytvoriť adresár" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2683,14 +2712,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3010,6 +3031,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Súbor:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4715,7 +4741,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6747,7 +6772,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Všetky vybrané" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Všetky vybrané" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6935,11 +6965,6 @@ msgstr "Všetky vybrané" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align Selection With View" -msgstr "Všetky vybrané" - -#: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" msgstr "Všetky vybrané" @@ -9796,6 +9821,11 @@ msgid "Extend Script" msgstr "Popis:" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Vytvoriť adresár" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11597,6 +11627,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Vytvoriť adresár" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Vytvoriť adresár" + +#, fuzzy #~ msgid "View log" #~ msgstr "Súbor:" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 4c325f1c92..3a098b5971 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -141,6 +141,31 @@ msgstr "Animacija Spremeni klic" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija Spremeni čas ključne slike" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija Spremeni prehod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija Spremeni transformacijo" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija Spremeni vrednost ključne slike" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija Spremeni klic" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Spremeni Ime Animacije:" @@ -1752,7 +1777,7 @@ msgstr "Pokaži V Upravitelju Datotek" msgid "New Folder..." msgstr "Nova Mapa..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Osveži" @@ -1803,7 +1828,7 @@ msgstr "Pojdi Naprej" msgid "Go Up" msgstr "Pojdi Navzgor" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Preklopi na Skrite Datoteke" @@ -1829,27 +1854,32 @@ msgstr "Premakni Priljubljeno Navzdol" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Prejšnji zavihek" +msgid "Go to previous folder." +msgstr "Pojdi v nadrejeno mapo" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Ustvarite Mapo" +msgid "Go to next folder." +msgstr "Pojdi v nadrejeno mapo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Pojdi v nadrejeno mapo" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Išči Razrede" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Mape ni mogoče ustvariti." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Preklopi na Skrite Datoteke" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2814,15 +2844,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Nastavitve Urejevalnika" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Odpri naslednji Urejevalnik" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Preklopi na Celozaslonski Način" @@ -3149,6 +3170,11 @@ msgstr "Čas" msgid "Calls" msgstr "Klici" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Člani" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4922,7 +4948,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Vse" @@ -7006,7 +7031,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7196,10 +7225,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Izbira Orodja" @@ -10102,6 +10127,11 @@ msgstr "Zaženi Skripto" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Ustvari Nov %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Shrani Prizor" @@ -11930,6 +11960,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Prejšnji zavihek" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Ustvarite Mapo" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Odpri naslednji Urejevalnik" + #~ msgid "Reverse" #~ msgstr "Obrni" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 24f28a8c61..fa9f6075e3 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -130,6 +130,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ndrysho Gjatësin e Animacionit" @@ -1702,7 +1722,7 @@ msgstr "Shfaq në Menaxherin e Skedarëve" msgid "New Folder..." msgstr "Folder i Ri..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Rifresko" @@ -1753,7 +1773,7 @@ msgstr "Shko Përpara" msgid "Go Up" msgstr "Shko Lartë" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Ndrysho Skedarët e Fshehur" @@ -1778,24 +1798,31 @@ msgid "Move Favorite Down" msgstr "Lëviz të Preferuarën Poshtë" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Folderi i Mëparshëm" +#, fuzzy +msgid "Go to previous folder." +msgstr "Shko te folderi prind" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Folderi Tjetër" +#, fuzzy +msgid "Go to next folder." +msgstr "Shko te folderi prind" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Kërko skedarët" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Hiqe nga të preferuarat folderin aktual." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Ndrysho Skedarët e Fshehur" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2746,15 +2773,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Hap Folderin e Editorit për të Dhënat/Opsionet" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Hap Editorin tjetër" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Ndrysho Ekranin e Plotë" @@ -3074,6 +3092,11 @@ msgstr "Koha" msgid "Calls" msgstr "Thërritjet" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifiko:" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Mbi" @@ -4769,7 +4792,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6765,7 +6787,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6950,10 +6976,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9751,6 +9773,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Krijo një Folder" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11505,15 +11532,22 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Folderi i Mëparshëm" + +#~ msgid "Next Folder" +#~ msgstr "Folderi Tjetër" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Hap Editorin tjetër" + #~ msgid "Update Always" #~ msgstr "Përditëso Gjithmonë" #~ msgid "Delete selected files?" #~ msgstr "Fshi skedarët e zgjedhur?" -#~ msgid "Go to parent folder" -#~ msgstr "Shko te folderi prind" - #~ msgid "Select device from the list" #~ msgstr "Zgjidh paisjen nga lista" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index abbee0d9ad..4b22ba2ff2 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -138,6 +138,31 @@ msgstr "Промени позив анимације" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Промени вредност" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Промени прелаз" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Промени положај" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Промени вредност" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Промени позив анимације" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Промени циклус анимације" @@ -1759,7 +1784,7 @@ msgstr "Покажи у менаџеру датотека" msgid "New Folder..." msgstr "Нови директоријум..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Освежи" @@ -1810,7 +1835,7 @@ msgstr "Напред" msgid "Go Up" msgstr "Иди горе" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Прикажи сакривене датотеке" @@ -1836,27 +1861,32 @@ msgstr "Помери надоле омиљену" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Претодни спрат" +msgid "Go to previous folder." +msgstr "Иди у родитељски директоријум" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Направи директоријум" +msgid "Go to next folder." +msgstr "Иди у родитељски директоријум" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Иди у родитељски директоријум" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Потражи класе" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Неуспех при прављењу директоријума." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Прикажи сакривене датотеке" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2827,15 +2857,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Поставке уредника" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Отвори следећи уредник" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Укљ./Искљ. режим целог екрана" @@ -3164,6 +3185,11 @@ msgstr "Време:" msgid "Calls" msgstr "Позиви цртања" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Измени тему..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4948,7 +4974,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "сви" @@ -7062,9 +7087,14 @@ msgstr "Бок" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Поравнавање са погледом" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Поравнај одабрано са погледом" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Нема родитеља за прављење сина." @@ -7258,10 +7288,6 @@ msgid "Focus Selection" msgstr "Фокус на селекцију" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Поравнај одабрано са погледом" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Избор алатки" @@ -10218,6 +10244,11 @@ msgstr "Покрени скриптицу" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Направи нов" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Сачувај сцену" @@ -12018,6 +12049,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Претодни спрат" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Направи директоријум" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Отвори следећи уредник" + #~ msgid "Reverse" #~ msgstr "Обрнут" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index ee1bce9bb8..21a14c6a83 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -5,12 +5,13 @@ # Milos Ponjavusic <brane@branegames.com>, 2018. # BLu <blmasfon@gmail.com>, 2018. # Vojislav Bajakic <ch3d4.ns@gmail.com>, 2018. +# LT <lakizvezdas@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-13 14:42+0100\n" -"Last-Translator: Vojislav Bajakic <ch3d4.ns@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" +"Last-Translator: LT <lakizvezdas@gmail.com>\n" "Language-Team: Serbian (latin) <https://hosted.weblate.org/projects/godot-" "engine/godot/sr_Latn/>\n" "Language: sr_Latn\n" @@ -19,7 +20,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: Poedit 2.2\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -63,33 +64,31 @@ msgstr "" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "Slobodno" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Balansirano" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "" +msgstr "Ogledalo" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "" +msgstr "Vreme:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "Vrednost:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Animacija dodaj ključ" +msgstr "Dodaj ključ ovde" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Uduplaj Selekciju" +msgstr "Dupliraj Selektovane Ključeve" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" @@ -97,11 +96,11 @@ msgstr "Izbriši označeni ključ(eve)" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "Dodaj Bezier Tačku" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "" +msgstr "Pomeri Bezier Tačke" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -133,8 +132,32 @@ msgstr "Animacija Promjeni Poziv" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija Promjeni Vrijeme Ključnog Kadra" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija Promjeni Tranziciju" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija Promjeni Transformaciju" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija Promjeni Vrijednost Ključnog Kadra" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija Promjeni Poziv" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Promijeni Dužinu Animacije" +msgstr "Promeni Dužinu Animacije" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -159,26 +182,24 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Audio Plejbek Traka" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "" +msgstr "Animacija Plejbek Traka" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Optimizuj Animaciju" +msgstr "Dužina Animacije (frames)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Promijeni Dužinu Animacije" +msgstr "Dužina Animacije (secunde)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Add Track" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Traku" #: editor/animation_track_editor.cpp msgid "Animation Looping" @@ -186,16 +207,18 @@ msgstr "" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "Functions:" -msgstr "" +msgstr "Funkcije:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "Audio Klipovi:" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Clips:" -msgstr "" +msgstr "Anim Klipovi:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -224,7 +247,7 @@ msgstr "Odstrani Kanal Animacije" #: editor/animation_track_editor.cpp msgid "Time (s): " -msgstr "" +msgstr "Vreme (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -247,8 +270,9 @@ msgid "Capture" msgstr "" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Nearest" -msgstr "" +msgstr "Najbliže" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -275,12 +299,12 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "Duplicate Key(s)" -msgstr "Animacija Uduplaj Ključeve" +msgstr "Dupliraj Ključeve" #: editor/animation_track_editor.cpp #, fuzzy msgid "Delete Key(s)" -msgstr "Animacija Obriši Ključeve" +msgstr "Obriši Ključeve" #: editor/animation_track_editor.cpp #, fuzzy @@ -376,7 +400,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "Add Bezier Track" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Bezier Kanal" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." @@ -392,9 +416,8 @@ msgid "Add Transform Track Key" msgstr "Animacija Dodaj kanal i ključ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Kljuc Kanal" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." @@ -1663,7 +1686,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1714,7 +1737,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1739,23 +1762,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "Otiđi Na Prethodni Korak" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "Otiđi Na Sljedeći Korak" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2628,14 +2657,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2949,6 +2970,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Izmjeni Selekciju Krivulje" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4616,7 +4642,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6610,7 +6635,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6795,10 +6824,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9614,6 +9639,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Napravi" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index a216a06f21..0b2f9133c3 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -135,6 +135,31 @@ msgid "Anim Change Call" msgstr "Anim Ändra Anrop" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Ändra Tid för Nyckebild" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Ändra Övergång" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Ändra Transformation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Ändra Värde På Nyckelbild" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Ändra Anrop" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ändra Animationslängd" @@ -1860,7 +1885,7 @@ msgstr "Visa I Filhanteraren" msgid "New Folder..." msgstr "Ny Mapp..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Uppdatera" @@ -1913,7 +1938,7 @@ msgstr "Gå Framåt" msgid "Go Up" msgstr "Gå Upp" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp #, fuzzy msgid "Toggle Hidden Files" msgstr "Växla Dolda Filer" @@ -1942,27 +1967,32 @@ msgstr "Flytta Favorit Ner" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Föregående flik" +msgid "Go to previous folder." +msgstr "Gå till överordnad mapp" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Skapa Mapp" +msgid "Go to next folder." +msgstr "Gå till överordnad mapp" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Gå till överordnad mapp" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Sök Klasser" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kunde inte skapa mapp." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Växla Dolda Filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2997,14 +3027,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3335,6 +3357,11 @@ msgstr "Tid:" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Redigera tema..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp #, fuzzy msgid "On" @@ -5158,7 +5185,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alla" @@ -7277,7 +7303,12 @@ msgstr "Baksida" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Vy från höger" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Vy från höger" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7475,10 +7506,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -10449,6 +10476,11 @@ msgstr "Öppna Skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Byt Förälder-Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Vettigt!" @@ -12337,6 +12369,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Föregående flik" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Skapa Mapp" + +#, fuzzy #~ msgid "Mirror X" #~ msgstr "Spegla X" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 2c7fe3a7a1..4444305cf2 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "மாற்ற அழைப்பு அசைவூட்டு" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "மாற்ற மதிப்பு அசைவூட்டு" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "மாற்றம் அசைவூட்டு" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "உருமாற்றம் அசைவூட்டு" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "மாற்ற மதிப்பு அசைவூட்டு" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "மாற்ற அழைப்பு அசைவூட்டு" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1654,7 +1679,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1705,7 +1730,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1730,23 +1755,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2618,14 +2647,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2938,6 +2959,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "தேர்வு வளைவை [Selection Curve] திருத்து" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4602,7 +4628,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6579,7 +6604,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6764,10 +6793,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9550,6 +9575,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 23e2973342..abc011cfab 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1636,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1687,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1712,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2598,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2918,6 +2934,10 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4572,7 +4592,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6541,7 +6560,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6726,10 +6749,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9495,6 +9514,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index a2d6dda878..e23decda82 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -141,6 +141,31 @@ msgstr "แก้ไขการเรียกฟังก์ชันแอน #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "แก้ไขเวลาคีย์เฟรมแอนิเมชัน" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "แก้ไขทรานสิชันแอนิเมชัน" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "เคลื่อนย้ายแอนิเมชัน" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "แก้ไขค่าคีย์เฟรมแอนิเมชัน" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "แก้ไขการเรียกฟังก์ชันแอนิเมชัน" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "แก้ไขการวนซ้ำแอนิเมชัน" @@ -1759,7 +1784,7 @@ msgstr "แสดงในตัวจัดการไฟล์" msgid "New Folder..." msgstr "สร้างโฟลเดอร์..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "รีเฟรช" @@ -1810,7 +1835,7 @@ msgstr "ไปหน้า" msgid "Go Up" msgstr "ขึ้นบน" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "เปิด/ปิดไฟล์ที่ซ่อน" @@ -1836,27 +1861,32 @@ msgstr "เลื่อนโฟลเดอร์ที่ชอบลง" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "ไปชั้นล่าง" +msgid "Go to previous folder." +msgstr "ไปยังโฟลเดอร์หลัก" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ไปชั้นบน" +msgid "Go to next folder." +msgstr "ไปยังโฟลเดอร์หลัก" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "ไปยังโฟลเดอร์หลัก" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ค้นหาคลาส" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ไม่สามารถสร้างโฟลเดอร์" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "เปิด/ปิดไฟล์ที่ซ่อน" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2792,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ตัวเลือกโปรแกรมสร้างเกม" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "เปิดตัวแก้ไขถัดไป" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "สลับเต็มจอ" @@ -3127,6 +3148,11 @@ msgstr "เวลา" msgid "Calls" msgstr "จำนวนครั้ง" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "แก้ไขธีม..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "เปิด" @@ -4899,7 +4925,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "ทั้งหมด" @@ -7006,9 +7031,14 @@ msgstr "หลัง" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "ย้ายมาที่กล้อง" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "ย้ายวัตถุที่เลือกมาที่กล้อง" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ไม่พบโหนดแม่ที่จะรับอินสแตนซ์โหนดลูก" @@ -7199,10 +7229,6 @@ msgid "Focus Selection" msgstr "มองวัตถุที่เลือก" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "ย้ายวัตถุที่เลือกมาที่กล้อง" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "เครื่องมือเลือก" @@ -10170,6 +10196,11 @@ msgstr "เปิดสคริปต์" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "หาโหนดแม่ใหม่" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "เข้าใจ!" @@ -12045,6 +12076,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "ไปชั้นล่าง" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ไปชั้นบน" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "เปิดตัวแก้ไขถัดไป" + #~ msgid "Reverse" #~ msgstr "ย้อนกลับ" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index af58c36d1c..f59cc0a809 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -152,6 +152,31 @@ msgid "Anim Change Call" msgstr "Animasyon Değişikliği Çağrısı" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Anahtar-kare Zamanını Değiştir" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animasyon Geçişinin Değişimi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animasyon Değişikliği Dönüşümü" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Anahtar-kare Değerini Değiştir" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animasyon Değişikliği Çağrısı" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Animasyon Uzunluğunu Değiştir" @@ -1739,7 +1764,7 @@ msgstr "Dosya Yöneticisinde Göster" msgid "New Folder..." msgstr "Yeni Klasör..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Yenile" @@ -1790,7 +1815,7 @@ msgstr "İleri Git" msgid "Go Up" msgstr "Yukarı Git" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Gizli Dosyalari Aç / Kapat" @@ -1815,25 +1840,32 @@ msgid "Move Favorite Down" msgstr "Beğenileni Aşağı Taşı" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Önceki Klasör" +#, fuzzy +msgid "Go to previous folder." +msgstr "Üst klasöre git" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Sonraki Klasör" +#, fuzzy +msgid "Go to next folder." +msgstr "Üst klasöre git" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Üst klasöre git" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Dosyaları ara" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Bu klasörü favorilerden çıkar/favorilere ekle." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Gizli Dosyalari Aç / Kapat" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2785,15 +2817,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Düzenleyici Verileri/Ayarları Klasörünü Aç" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Sonraki Düzenleyiciyi aç" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Tam Ekran Aç / Kapat" @@ -3113,6 +3136,11 @@ msgstr "Zaman" msgid "Calls" msgstr "Çağrılar" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Tema düzenle..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Açık" @@ -4861,7 +4889,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Hepsi" @@ -6971,9 +6998,14 @@ msgstr "Arka" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Görünüme Ayarla" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Seçimi Görünüme Ayarla" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Çocuğun örnek alacağı bir ebeveyn yok." @@ -7164,10 +7196,6 @@ msgid "Focus Selection" msgstr "Seçime Odaklan" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Seçimi Görünüme Ayarla" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seçim Aracı" @@ -10144,6 +10172,11 @@ msgstr "Betik Aç" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Düğümün Ebeveynliğini Değiştir" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Anlamlı!" @@ -12084,6 +12117,16 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Önceki Klasör" + +#~ msgid "Next Folder" +#~ msgstr "Sonraki Klasör" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Sonraki Düzenleyiciyi aç" + #~ msgid "Reverse" #~ msgstr "Tersi" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index d6c57a6bc8..19e21461cd 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-15 13:10+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -138,6 +138,31 @@ msgid "Anim Change Call" msgstr "Змінити виклик анімації" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Змінити час ключового кадру" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Змінити перехід" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Змінити перетворення" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Змінити значення ключового кадру" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Змінити виклик анімації" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Змінити тривалість анімації" @@ -1693,7 +1718,7 @@ msgstr "Показати у менеджері файлів" msgid "New Folder..." msgstr "Створити теку..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Оновити" @@ -1744,7 +1769,7 @@ msgstr "Йти вперед" msgid "Go Up" msgstr "Вгору" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Перемкнути приховані файли" @@ -1769,23 +1794,31 @@ msgid "Move Favorite Down" msgstr "Перемістити вибране вниз" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Попередня тека" +#, fuzzy +msgid "Go to previous folder." +msgstr "Перейти до батьківської теки." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Наступна тека" +#, fuzzy +msgid "Go to next folder." +msgstr "Перейти до батьківської теки." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Перейти до батьківської теки." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Шукати файли" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Перемкнути стан вибраності для поточної теки." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Увімкнути або вимкнути видимість прихованих файлів." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2517,9 +2550,8 @@ msgid "Go to previously opened scene." msgstr "Перейти до раніше відкритої сцени." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Копіювати шлях" +msgstr "Копіювати текст" #: editor/editor_node.cpp msgid "Next tab" @@ -2732,14 +2764,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Знімки зберігаються у теці Data/Settings редактора." #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "Автоматично відкривати знімки вікон" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "Відкрити у зовнішньому редакторі зображень." - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Перемикач повноекранного режиму" @@ -3060,6 +3084,11 @@ msgstr "Час" msgid "Calls" msgstr "Виклики" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Редагувати тему" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Увімкнено" @@ -4731,9 +4760,8 @@ msgid "Idle" msgstr "Простій" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Встановити" +msgstr "Встановити…" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4764,7 +4792,6 @@ msgid "Last" msgstr "Останній" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Все" @@ -4778,9 +4805,8 @@ msgid "Sort:" msgstr "Сортувати:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Reverse sorting." -msgstr "Запит..." +msgstr "Обернений порядок." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4861,39 +4887,32 @@ msgid "Rotation Step:" msgstr "Крок повороту:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" msgstr "Перемістити вертикальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Створити нову вертикальну напрямну" +msgstr "Створити вертикальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" msgstr "Вилучити вертикальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" msgstr "Перемістити горизонтальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" -msgstr "Створити нову горизонтальну напрямну" +msgstr "Створити горизонтальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" msgstr "Вилучити горизонтальну напрямну" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" -msgstr "Створити нові горизонтальні та вертикальні напрямні" +msgstr "Створити горизонтальні та вертикальні напрямні" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -6780,9 +6799,15 @@ msgid "Rear" msgstr "Ззаду" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Вирівняти з переглядом" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Вирівняти позначене із переглядом" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Немає батьківського запису для дочірнього." @@ -6971,10 +6996,6 @@ msgid "Focus Selection" msgstr "Фокусувати позначене" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Вирівняти позначене із переглядом" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Інструмент позначення" @@ -7937,7 +7958,7 @@ msgstr "Змінено тип введення для візуального ш #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(лише GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8024,21 +8045,20 @@ msgid "Color uniform." msgstr "Однорідний колір." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "Повертає одиницю поділену на квадратний корінь з параметра." +msgstr "Повертає булевий результат порівняння %s між двома параметрами." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Рівність (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Більше (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Більше або дорівнює (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8052,25 +8072,25 @@ msgstr "" msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "Повертає булевий результат порівняння між INF та скалярним параметром." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." -msgstr "" +msgstr "Повертає булевий результат порівняння між NaN і скалярним параметром." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Менше (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Менше або дорівнює (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Не дорівнює (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8079,15 +8099,16 @@ msgstr "" "Повертає пов'язаний вектор за заданим булевим значенням «true» або «false»." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." -msgstr "Повертає тангенс параметра." +msgstr "Повертає булевий результат порівняння між двома параметрами." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Повертає булевий результат порівняння між INF (або NaN) та скалярним " +"параметром." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -8178,18 +8199,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Повертає арккосинус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний косинус параметра." +msgstr "Повертає обернений гіперболічний косинус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Повертає арксинус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний синус параметра." +msgstr "Повертає обернений гіперболічний синус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8200,9 +8219,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Повертає арктангенс параметрів." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний тангенс параметра." +msgstr "Повертає обернений гіперболічний тангенс параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8220,9 +8238,8 @@ msgid "Returns the cosine of the parameter." msgstr "Повертає косинус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic cosine of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний косинус параметра." +msgstr "Повертає гіперболічний косинус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8294,14 +8311,12 @@ msgid "1.0 / scalar" msgstr "1.0 / скаляр" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer to the parameter." -msgstr "(Лише GLES3) Знаходить найближче ціле значення до параметра." +msgstr "Знаходить найближче ціле значення до параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest even integer to the parameter." -msgstr "(Лише GLES3) Знаходить найближче парне ціле значення до параметра." +msgstr "Знаходить найближче парне ціле значення до параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8316,9 +8331,8 @@ msgid "Returns the sine of the parameter." msgstr "Повертає синус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic sine of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний синус параметра." +msgstr "Повертає гіперболічний синус параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8353,14 +8367,12 @@ msgid "Returns the tangent of the parameter." msgstr "Повертає тангенс параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the hyperbolic tangent of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний тангенс параметра." +msgstr "Повертає гіперболічний тангенс параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." -msgstr "(Лише GLES3) Визначає обрізане до цілого значення параметра." +msgstr "Визначає обрізане до цілого значення параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8399,26 +8411,22 @@ msgid "Perform the texture lookup." msgstr "Виконує пошук текстури." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Однорідна кубічна текстура." +msgstr "Пошук однорідної кубічної текстури." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Однорідна пласка текстура." +msgstr "Пошук однорідної пласкої текстури." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Однорідна пласка текстура." +msgstr "Однорідний пошук пласкої текстури за допомогою трьох площин." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." msgstr "Функція перетворення." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -8428,7 +8436,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Лише GLES3) Обчислити зовнішній добуток пари векторів.\n" +"Обчислити зовнішній добуток пари векторів.\n" "\n" "OuterProduct вважає перший параметр, «c», є вектором-стовпчиком (матрицею із " "одного стовпчика) а другий параметр, «r», є вектором-рядком (матрицею із " @@ -8445,19 +8453,16 @@ msgid "Decomposes transform to four vectors." msgstr "Розкладає перетворення на чотири вектори." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the determinant of a transform." -msgstr "(Лише GLES3) Обчислює визначник перетворення." +msgstr "Обчислює визначник перетворення." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the inverse of a transform." -msgstr "(Лише GLES3) Обчислює обернену матрицю перетворення." +msgstr "Обчислює обернену матрицю перетворення." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Calculates the transpose of a transform." -msgstr "(Лише GLES3) Обчислює транспозицію перетворення." +msgstr "Обчислює транспозицію перетворення." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8504,7 +8509,6 @@ msgid "Calculates the dot product of two vectors." msgstr "Обчислює скалярний добуток двох векторів." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " @@ -8537,7 +8541,6 @@ msgid "1.0 / vector" msgstr "1.0 / вектор" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." @@ -8546,7 +8549,6 @@ msgstr "" "вектор нормалі )." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the vector that points in the direction of refraction." msgstr "Повертає вектор, який вказує напрямок рефракції." @@ -8646,72 +8648,59 @@ msgstr "" "напрямку погляду камери (функції слід передати відповіді вхідні дані)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) Функція скалярної " -"похідної." +msgstr "(лише у режимі фрагментів або світла) Функція скалярної похідної." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) Функція векторної " -"похідної." +msgstr "(лише у режимі фрагментів або світла) Функція векторної похідної." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) (вектор) Похідна у «x» на " -"основі локального диференціювання." +"(лише у режимі фрагментів або світла) (вектор) Похідна у «x» на основі " +"локального диференціювання." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) (скаляр) Похідна у «x» на " -"основі локального диференціювання." +"(лише у режимі фрагментів або світла) (скаляр) Похідна у «x» на основі " +"локального диференціювання." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) (вектор) Похідна у «y» на " -"основі локального диференціювання." +"(лише у режимі фрагментів або світла) (вектор) Похідна у «y» на основі " +"локального диференціювання." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) (скаляр) Похідна у «y» на " -"основі локального диференціювання." +"(лише у режимі фрагментів або світла) (скаляр) Похідна у «y» на основі " +"локального диференціювання." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) (вектор) Сума похідних за " -"модулем у «x» та «y»." +"(лише у режимі фрагментів або світла) (вектор) Сума похідних за модулем у " +"«x» та «y»." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або світла) Сума похідних за модулем " -"у «x» та «y»." +"(лише у режимі фрагментів або світла) Сума похідних за модулем у «x» та «y»." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9938,6 +9927,11 @@ msgid "Extend Script" msgstr "Розширити скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Змінити батьківський вузол" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Зробити кореневим для сцени" @@ -10154,9 +10148,8 @@ msgid "Script is valid." msgstr "Скрипт є коректним." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Можна використовувати: a-z, A-Z, 0-9 і _" +msgstr "Можна використовувати: a-z, A-Z, 0-9, _ і ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -11850,9 +11843,8 @@ msgid "Invalid source for shader." msgstr "Некоректне джерело програми побудови тіней." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Некоректне джерело програми побудови тіней." +msgstr "Некоректна функція порівняння для цього типу." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11870,6 +11862,18 @@ msgstr "Змінні величини можна пов'язувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "Previous Folder" +#~ msgstr "Попередня тека" + +#~ msgid "Next Folder" +#~ msgstr "Наступна тека" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Автоматично відкривати знімки вікон" + +#~ msgid "Open in an external image editor." +#~ msgstr "Відкрити у зовнішньому редакторі зображень." + #~ msgid "Reverse" #~ msgstr "Зворотний" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index d667d977da..f22e442132 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -133,6 +133,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -1669,7 +1689,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1720,7 +1740,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1747,24 +1767,30 @@ msgid "Move Favorite Down" msgstr "پسندیدہ نیچے منتقل کریں" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "سب سکریپشن بنائیں" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "سب سکریپشن بنائیں" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "سب سکریپشن بنائیں" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2646,14 +2672,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2968,6 +2986,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr ".تمام کا انتخاب" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4653,7 +4676,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -6669,7 +6691,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr ".تمام کا انتخاب" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6856,11 +6883,6 @@ msgstr ".تمام کا انتخاب" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align Selection With View" -msgstr ".تمام کا انتخاب" - -#: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" msgstr ".تمام کا انتخاب" @@ -9688,6 +9710,11 @@ msgid "Extend Script" msgstr "سب سکریپشن بنائیں" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "سب سکریپشن بنائیں" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 80c323be8d..b8707a154c 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Steve Dang <itsnguu@outlook.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" @@ -28,7 +28,7 @@ msgstr "" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "Hàm convert() có đối số không hợp lệ, sử dụng các hằng TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -71,7 +71,7 @@ msgstr "Miễn phí" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Cân bằng" #: editor/animation_bezier_editor.cpp msgid "Mirror" @@ -86,14 +86,12 @@ msgid "Value:" msgstr "Giá trị:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Chèn Key Anim" +msgstr "Thêm Khoá Tại Đây" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Nhân đôi lựa chọn" +msgstr "Nhân đôi các khoá đã chọn" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" @@ -101,12 +99,11 @@ msgstr "Xoá Key(s) được chọn" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "Thêm điểm Bezier" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "Di chuyển đến..." +msgstr "Di chuyển điểm Bezier" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -138,13 +135,37 @@ msgstr "Đổi Function Gọi Animation" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Đổi thời gian khung hình" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Đổi Transition Animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Đổi Transform Animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Đổi giá trị khung hình" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Đổi Function Gọi Animation" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Đổi vòng lặp Anim" +msgstr "Thay Độ Dài Hoạt Ảnh" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Chỉnh Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -172,14 +193,12 @@ msgid "Animation Playback Track" msgstr "Ngưng chạy animation. (S)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Độ dài Animation (giây)." +msgstr "Độ dài hoạt ảnh (khung hình)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Độ dài Animation (giây)." +msgstr "Độ dài hoạt ảnh (giây)" #: editor/animation_track_editor.cpp #, fuzzy @@ -187,9 +206,8 @@ msgid "Add Track" msgstr "Thêm Track Animation" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "Phóng Animation." +msgstr "Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -366,7 +384,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" +msgstr "Các bản hoạt ảnh chỉ có thể trỏ tới các nút AnimationPlayer." #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." @@ -454,12 +472,11 @@ msgstr "Cảnh bảo: Chỉnh sửa hoạt ảnh đã nhập" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "Chọn Toàn Bộ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Chế độ chọn" +msgstr "Chọn Không có" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -470,14 +487,12 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "Bước (s):" +msgstr "Chụp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation step value." -msgstr "Phóng Animation." +msgstr "Giá trị bước hoạt ảnh." #: editor/animation_track_editor.cpp msgid "Seconds" @@ -521,27 +536,24 @@ msgid "Duplicate Transposed" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "Nhân đôi lựa chọn" +msgstr "Xoá lựa chọn" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "Đến Step tiếp theo" +msgstr "Đến Bước tiếp theo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "Đến Step trước đó" +msgstr "Đến Bước trước đó" #: editor/animation_track_editor.cpp msgid "Optimize Animation" -msgstr "Tối ưu Animation" +msgstr "Tối ưu Hoạt ảnh" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "Dọn dẹp Animation" +msgstr "Dọn dẹp Hoạt ảnh" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" @@ -573,12 +585,11 @@ msgstr "Tối ưu" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "Hủy key không đúng chuẩn" +msgstr "Gỡ bỏ các khoá không hợp lệ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove unresolved and empty tracks" -msgstr "Gỡ bỏ track trống và không tìm thấy" +msgstr "Gỡ bỏ các Tracks không thể xử lý và trống" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" @@ -586,7 +597,7 @@ msgstr "Dọn dẹp tất cả animations" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "Dọn dẹp tất cả Animation (KHÔNG THỂ HỒI LẠI)" +msgstr "Dọn dẹp tất cả Hoạt ảnh (KHÔNG THỂ HỒI LẠI)" #: editor/animation_track_editor.cpp msgid "Clean-Up" @@ -598,7 +609,7 @@ msgstr "Tỉ lệ Scale:" #: editor/animation_track_editor.cpp msgid "Select tracks to copy:" -msgstr "" +msgstr "Chọn các Track để sao chép:" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -610,9 +621,8 @@ msgid "Copy" msgstr "Sao chép" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Thêm Track Animation" +msgstr "Thêm Track Âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -644,20 +654,19 @@ msgstr "Dòng số:" #: editor/code_editor.cpp msgid "Found %d match(es)." -msgstr "" +msgstr "Tìm thấy %d khớp." #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" -msgstr "Không tìm thấy" +msgstr "Không khớp" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "Đã thay thế %d biến cố." #: editor/code_editor.cpp editor/find_in_files.cpp -#, fuzzy msgid "Match Case" -msgstr "Trùng khớp" +msgstr "Khớp Trường Hợp" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" @@ -705,37 +714,32 @@ msgid "Line and column numbers." msgstr "Số dòng và cột." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "Cách thức trong Node được chọn phải được ghi rõ!" +msgstr "Phương thức trong nút đích phải được chỉ định." #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"Cách thức của đối tượng không tìm thấy! ghi rõ một cách thức hợp lệ hoặc " -"đính kèm một script cho đối tượng Node." +"Phương thức không tìm thấy. Chỉ định phương thức hợp lệ hoặc đính kèm tệp " +"lệnh vào nút." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "Kết nối đến Node:" +msgstr "Kết nối đến Nút:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "Không thể kết nối tới host:" +msgstr "Kết nối Tệp lệnh:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Đang kết nối Signal:" +msgstr "Từ tín hiệu:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "Cảnh không chứa mã lệnh." +msgstr "Cảnh không chứa tệp lệnh." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -755,27 +759,26 @@ msgid "Remove" msgstr "Xóa" #: editor/connections_dialog.cpp -#, fuzzy msgid "Add Extra Call Argument:" -msgstr "Thêm đối số:" +msgstr "Thêm đối số mở rộng:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Mở rộng Đối số được gọi:" #: editor/connections_dialog.cpp msgid "Advanced" msgstr "Nâng cao" #: editor/connections_dialog.cpp -#, fuzzy msgid "Deferred" -msgstr "Hoãn lại" +msgstr "Trì hoãn" #: editor/connections_dialog.cpp msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Trì hoãn tín hiệu, lưu vào một hàng chờ và chỉ kích nó vào thời gian rãnh." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -808,7 +811,6 @@ msgid "Connect" msgstr "Kết nối" #: editor/connections_dialog.cpp -#, fuzzy msgid "Signal:" msgstr "Tín hiệu:" @@ -821,9 +823,8 @@ msgid "Disconnect '%s' from '%s'" msgstr "Hủy kết nối '%s' từ '%s'" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect all from signal: '%s'" -msgstr "Hủy kết nối '%s' từ '%s'" +msgstr "Dừng kết nối tất cả từ tín hiệu: '%s'" #: editor/connections_dialog.cpp msgid "Connect..." @@ -868,7 +869,7 @@ msgstr "Đến Method" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "Đổi %s Type" +msgstr "Đổi %s Loại" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" @@ -921,38 +922,42 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" +"Cảnh '%s' hiện đang được chỉnh sửa.\n" +"Các thay đổi chỉ có hiệu lực khi tải lại." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" +"Tài nguyên '%s' đang sử dụng.\n" +"Thay đổi sẽ chỉ hiệu lực khi tải lại." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dependencies" -msgstr "" +msgstr "Các phụ thuộc" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Tài nguyên" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_settings_editor.cpp editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "Đường dẫn" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Các phụ thuộc:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Sửa chữa" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "Trình chỉnh sửa Phụ thuộc" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -970,11 +975,11 @@ msgstr "Mở" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Sở hữu của:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (Can't be restored)" -msgstr "" +msgstr "Gỡ bỏ các tệp đã chọn trong dự án? (Không thể khôi phục)" #: editor/dependency_editor.cpp msgid "" @@ -997,15 +1002,15 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Luôn mở" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Chọn hành động nên thực hiện?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Sửa các phần phụ thuộc" #: editor/dependency_editor.cpp msgid "Errors loading!" @@ -1034,7 +1039,7 @@ msgstr "Xóa" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Sở hữu" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -1119,6 +1124,10 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine dựa trên một số thư viện mã nguồn mở và miễn phí của bên thứ " +"ba, tất cả đều phù hợp với các điều khoản trong giấy phép MIT. Sau đây là " +"danh sách tất cả các thành phần của bên thứ ba với các điều khoản bản quyền " +"và điều khoản cấp phép tương ứng." #: editor/editor_about.cpp msgid "All Components" @@ -1138,7 +1147,7 @@ msgstr "Lỗi không thể mở gói, không phải dạng nén." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Giải nén Assets" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1159,7 +1168,7 @@ msgstr "Gói cài đặt" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Máy phát thanh" #: editor/editor_audio_buses.cpp msgid "Add Effect" @@ -1268,7 +1277,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "" +msgstr "Vị trí cho Bố cục mới..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" @@ -1687,7 +1696,7 @@ msgstr "Xem trong trình quản lý tệp" msgid "New Folder..." msgstr "Thư mục mới ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Làm mới" @@ -1738,7 +1747,7 @@ msgstr "Tiến tới" msgid "Go Up" msgstr "Đi Lên" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Bật tắt File ẩn" @@ -1763,23 +1772,31 @@ msgid "Move Favorite Down" msgstr "Di chuyển Ưa thích xuống" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Thư mục trước" +#, fuzzy +msgid "Go to previous folder." +msgstr "Đến thư mục cha" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Thư mục sau" +#, fuzzy +msgid "Go to next folder." +msgstr "Đến thư mục cha" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Đến thư mục cha" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Tìm kiếm tệp tin" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Bỏ yêu thích thư mục hiện tại." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Bật tắt hiện các tệp tin ẩn." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2687,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Mở thư mục dữ liệu Trình biên tập" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Chế độ Toàn màn hình" @@ -3010,6 +3019,11 @@ msgstr "" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Lưu Theme" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3913,7 +3927,7 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "Thêm Animation" +msgstr "Thêm Hoạt ảnh" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4115,7 +4129,7 @@ msgstr "Đổi bộ lọc" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." -msgstr "" +msgstr "Không có trình phát hoạt ảnh, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." @@ -4127,6 +4141,7 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" +"Trính phát hoạt ảnh không có đường dẫn nút Gốc, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4231,7 +4246,7 @@ msgstr "Chạy hoạt ảnh đã chọn ngược lại từ cuối. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "Ngưng chạy hoạt ảnh. (S)" +msgstr "Dừng chạy lại hoạt ảnh. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" @@ -4690,7 +4705,6 @@ msgid "Last" msgstr "Cuối cùng" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tất cả" @@ -6713,7 +6727,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6898,10 +6916,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -9764,6 +9778,11 @@ msgid "Extend Script" msgstr "Tạo Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Tạo các nút mới." + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -11540,6 +11559,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Thư mục trước" + +#~ msgid "Next Folder" +#~ msgstr "Thư mục sau" + #~ msgid "Reverse" #~ msgstr "Ngược lại" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 815a878f86..affef14b72 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -176,6 +176,31 @@ msgid "Anim Change Call" msgstr "修改回调" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "修改动画关键帧的时长" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "修改动画过渡方式" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "修改动画变换" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "修改动画关键帧的值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "修改回调" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "修改动画长度" @@ -1700,7 +1725,7 @@ msgstr "在文件管理器中显示" msgid "New Folder..." msgstr "新建文件夹 ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "刷新" @@ -1751,7 +1776,7 @@ msgstr "前进" msgid "Go Up" msgstr "上一级" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "切换显示隐藏文件" @@ -1776,23 +1801,31 @@ msgid "Move Favorite Down" msgstr "向下移动收藏" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "上一个文件夹" +#, fuzzy +msgid "Go to previous folder." +msgstr "转到父文件夹。" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "下一个文件夹" +#, fuzzy +msgid "Go to next folder." +msgstr "转到父文件夹。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "转到父文件夹。" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "搜索文件" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(取消)收藏当前文件夹。" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "切换显示隐藏文件。" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2704,14 +2737,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "截图已保存到编辑器设置/数据目录。" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "自动打开截图" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "使用外部图像编辑器打开。" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "全屏模式" @@ -3032,6 +3057,11 @@ msgstr "时间" msgid "Calls" msgstr "调用次数" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "编辑主题..." + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "启用" @@ -4716,7 +4746,6 @@ msgid "Last" msgstr "最后一项" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -6747,9 +6776,15 @@ msgid "Rear" msgstr "后方" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "对齐视图" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "选中项与视图对齐" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "没有选中节点来添加实例。" @@ -6938,10 +6973,6 @@ msgid "Focus Selection" msgstr "选中选中项" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "选中项与视图对齐" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "选择工具" @@ -9844,6 +9875,11 @@ msgid "Extend Script" msgstr "打开脚本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "重设父节点" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "创建场景根节点" @@ -11709,6 +11745,18 @@ msgstr "变量只能在顶点函数中指定。" msgid "Constants cannot be modified." msgstr "不允许修改常量。" +#~ msgid "Previous Folder" +#~ msgstr "上一个文件夹" + +#~ msgid "Next Folder" +#~ msgstr "下一个文件夹" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "自动打开截图" + +#~ msgid "Open in an external image editor." +#~ msgstr "使用外部图像编辑器打开。" + #~ msgid "Reverse" #~ msgstr "反选" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 7e5022d56e..6946008e81 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -137,6 +137,31 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "動畫變化數值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "動畫變化過渡" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "動畫變化過渡" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "動畫變化數值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "動畫軌跡變化數值模式" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "更改動畫名稱:" @@ -1785,7 +1810,7 @@ msgstr "開啟 Project Manager?" msgid "New Folder..." msgstr "新增資料夾" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "重新整理" @@ -1836,7 +1861,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "(不)顯示隱藏的文件" @@ -1864,27 +1889,32 @@ msgstr "下移最愛" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "上一個tab" +msgid "Go to previous folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "新增資料夾" +msgid "Go to next folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "無法新增資料夾" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "在幫助檔搜尋" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "無法新增資料夾" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "(不)顯示隱藏的文件" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2827,15 +2857,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "編輯器設定" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "要離開編輯器嗎?" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "全螢幕" @@ -3168,6 +3189,11 @@ msgstr "時間:" msgid "Calls" msgstr "" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "檔案" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -4959,7 +4985,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -7037,7 +7062,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7230,10 +7259,6 @@ msgid "Focus Selection" msgstr "只限選中" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "所有選項" @@ -10159,6 +10184,11 @@ msgstr "下一個腳本" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "新增" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "儲存場景" @@ -11980,6 +12010,18 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "上一個tab" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "新增資料夾" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "要離開編輯器嗎?" + +#, fuzzy #~ msgid "Failed to create solution." #~ msgstr "資源加載失敗。" @@ -12143,9 +12185,6 @@ msgstr "" #~ msgid "Anim Track Change Interpolation" #~ msgstr "動畫軌跡變化Interpolation" -#~ msgid "Anim Track Change Value Mode" -#~ msgstr "動畫軌跡變化數值模式" - #~ msgid "Edit Selection Curve" #~ msgstr "編輯Selection Curve" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 03f5294c67..54c1f74b02 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -141,6 +141,31 @@ msgstr "更改回調" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "變更關鍵畫格的時間" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "變更轉場效果" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "變更動畫變換" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "變更關鍵畫格的數值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "更改回調" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "變更動畫長度" @@ -1764,7 +1789,7 @@ msgstr "在檔案管理員內顯示" msgid "New Folder..." msgstr "新增資料夾..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "重新整理" @@ -1815,7 +1840,7 @@ msgstr "往前" msgid "Go Up" msgstr "往上" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "切換顯示隱藏檔案" @@ -1842,27 +1867,32 @@ msgstr "向下移動收藏" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "上個分頁" +msgid "Go to previous folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "新增資料夾" +msgid "Go to next folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "無法新增資料夾" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "搜尋 Class" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "無法新增資料夾" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "切換顯示隱藏檔案" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2790,15 +2820,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "開啟 編輯器數據/設定 資料夾" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "開啟下一個編輯器" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "全螢幕顯示" @@ -3120,6 +3141,11 @@ msgstr "時間" msgid "Calls" msgstr "調用" +#: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "編輯主題…" + #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "啟用" @@ -4877,7 +4903,6 @@ msgid "Last" msgstr "最後" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -6953,9 +6978,15 @@ msgid "Rear" msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "與視圖對齊" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "將所選內容與視圖對齊" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -7141,10 +7172,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "將所選內容與視圖對齊" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "工具選擇" @@ -10067,6 +10094,11 @@ msgstr "開啟最近存取" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "新增 %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "儲存場景" @@ -11910,6 +11942,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "上個分頁" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "新增資料夾" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "開啟下一個編輯器" + #~ msgid "Reverse" #~ msgstr "反轉" diff --git a/main/input_default.cpp b/main/input_default.cpp index a03d015fc3..5ba98c20e2 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -629,6 +629,10 @@ Input::CursorShape InputDefault::get_default_cursor_shape() const { } void InputDefault::set_default_cursor_shape(CursorShape p_shape) { + + if (default_shape == p_shape) + return; + default_shape = p_shape; // The default shape is set in Viewport::_gui_input_event. To instantly // see the shape in the viewport we need to trigger a mouse motion event. @@ -686,7 +690,8 @@ void InputDefault::release_pressed_events() { _joy_axis.clear(); for (Map<StringName, InputDefault::Action>::Element *E = action_state.front(); E; E = E->next()) { - action_release(E->key()); + if (E->get().pressed) + action_release(E->key()); } } diff --git a/main/tests/test_string.cpp b/main/tests/test_string.cpp index 05df888f40..ab5fb64252 100644 --- a/main/tests/test_string.cpp +++ b/main/tests/test_string.cpp @@ -1078,6 +1078,44 @@ bool test_34() { return state; } +bool test_35() { +#define COUNT_TEST(x) \ + { \ + bool success = x; \ + state = state && success; \ + if (!success) { \ + OS::get_singleton()->print("\tfailed at: %s\n", #x); \ + } \ + } + + OS::get_singleton()->print("\n\nTest 35: count and countn function\n"); + bool state = true; + + COUNT_TEST(String("").count("Test") == 0); + COUNT_TEST(String("Test").count("") == 0); + COUNT_TEST(String("Test").count("test") == 0); + COUNT_TEST(String("Test").count("TEST") == 0); + COUNT_TEST(String("TEST").count("TEST") == 1); + COUNT_TEST(String("Test").count("Test") == 1); + COUNT_TEST(String("aTest").count("Test") == 1); + COUNT_TEST(String("Testa").count("Test") == 1); + COUNT_TEST(String("TestTestTest").count("Test") == 3); + COUNT_TEST(String("TestTestTest").count("TestTest") == 1); + COUNT_TEST(String("TestGodotTestGodotTestGodot").count("Test") == 3); + + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 8) == 1); + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 12) == 2); + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 16) == 3); + COUNT_TEST(String("TestTestTestTest").count("Test", 4) == 3); + + COUNT_TEST(String("Test").countn("test") == 1); + COUNT_TEST(String("Test").countn("TEST") == 1); + COUNT_TEST(String("testTest-Testatest").countn("tEst") == 4); + COUNT_TEST(String("testTest-TeStatest").countn("tEsT", 4, 16) == 2); + + return state; +} + typedef bool (*TestFunc)(void); TestFunc test_funcs[] = { @@ -1116,6 +1154,7 @@ TestFunc test_funcs[] = { test_32, test_33, test_34, + test_35, 0 }; diff --git a/methods.py b/methods.py index 7840fb1b64..86ab7cd9af 100644 --- a/methods.py +++ b/methods.py @@ -617,7 +617,11 @@ def detect_darwin_sdk_path(platform, env): raise def get_compiler_version(env): - version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) + # Not using this method on clang because it returns 4.2.1 # https://reviews.llvm.org/D56803 + if using_gcc(env): + version = decode_utf8(subprocess.check_output([env['CXX'], '-dumpversion']).strip()) + else: + version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) match = re.search('[0-9][0-9.]*', version) if match is not None: return match.group().split('.') diff --git a/modules/arkit/arkit_interface.mm b/modules/arkit/arkit_interface.mm index de58f93276..68844c54c2 100644 --- a/modules/arkit/arkit_interface.mm +++ b/modules/arkit/arkit_interface.mm @@ -430,7 +430,7 @@ void ARKitInterface::process() { // get some info about our screen and orientation Size2 screen_size = OS::get_singleton()->get_window_size(); - UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // Grab our camera image for our backbuffer CVPixelBufferRef pixelBuffer = current_frame.capturedImage; @@ -531,7 +531,7 @@ void ARKitInterface::process() { // we need to invert this, probably row v.s. column notation affine_transform = CGAffineTransformInvert(affine_transform); - if (orientation != UIDeviceOrientationPortrait) { + if (orientation != UIInterfaceOrientationPortrait) { affine_transform.b = -affine_transform.b; affine_transform.d = -affine_transform.d; affine_transform.ty = 1.0 - affine_transform.ty; @@ -582,28 +582,28 @@ void ARKitInterface::process() { // copy our current frame transform matrix_float4x4 m44 = camera.transform; - if (orientation == UIDeviceOrientationLandscapeLeft) { + if (orientation == UIInterfaceOrientationLandscapeLeft) { transform.basis.elements[0].x = m44.columns[0][0]; transform.basis.elements[1].x = m44.columns[0][1]; transform.basis.elements[2].x = m44.columns[0][2]; transform.basis.elements[0].y = m44.columns[1][0]; transform.basis.elements[1].y = m44.columns[1][1]; transform.basis.elements[2].y = m44.columns[1][2]; - } else if (orientation == UIDeviceOrientationPortrait) { + } else if (orientation == UIInterfaceOrientationPortrait) { transform.basis.elements[0].x = m44.columns[1][0]; transform.basis.elements[1].x = m44.columns[1][1]; transform.basis.elements[2].x = m44.columns[1][2]; transform.basis.elements[0].y = -m44.columns[0][0]; transform.basis.elements[1].y = -m44.columns[0][1]; transform.basis.elements[2].y = -m44.columns[0][2]; - } else if (orientation == UIDeviceOrientationLandscapeRight) { + } else if (orientation == UIInterfaceOrientationLandscapeRight) { transform.basis.elements[0].x = -m44.columns[0][0]; transform.basis.elements[1].x = -m44.columns[0][1]; transform.basis.elements[2].x = -m44.columns[0][2]; transform.basis.elements[0].y = -m44.columns[1][0]; transform.basis.elements[1].y = -m44.columns[1][1]; transform.basis.elements[2].y = -m44.columns[1][2]; - } else if (orientation == UIDeviceOrientationPortraitUpsideDown) { + } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { // this may not be correct transform.basis.elements[0].x = m44.columns[1][0]; transform.basis.elements[1].x = m44.columns[1][1]; diff --git a/modules/assimp/SCsub b/modules/assimp/SCsub index d8ef866bec..275f1ff5e9 100644 --- a/modules/assimp/SCsub +++ b/modules/assimp/SCsub @@ -9,6 +9,7 @@ env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/include']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/IFC']) env_assimp.Prepend(CPPPATH=['#thirdparty/misc']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code']) +env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/common']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/irrXML/']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/unzip/']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/STEPParser']) @@ -65,11 +66,11 @@ env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STEP_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IFC_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_XGL_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASSBIN_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_C4D_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3MF_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X3D_IMPORTER']) - +env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) +env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF2_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_SINGLETHREADED']) if(env['platform'] == 'windows'): @@ -84,7 +85,13 @@ elif(env['platform'] == 'osx'): env_thirdparty = env_assimp.Clone() env_thirdparty.disable_warnings() -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Common/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/PostProcessing/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Material/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/FBX/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/MMD/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF2/*.cpp')) # Godot's own source files env_assimp.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/assimp/godot_update_assimp.sh b/modules/assimp/godot_update_assimp.sh index dcf1e6d4a2..ff8ff59e97 100644..100755 --- a/modules/assimp/godot_update_assimp.sh +++ b/modules/assimp/godot_update_assimp.sh @@ -254,8 +254,9 @@ rm -rf contrib/irrXML rm -rf contrib/Open3DGC rm -rf contrib/openddlparser rm -rf contrib/poly2tri -rm -rf contrib/rapidjson +#rm -rf contrib/rapidjson rm -rf contrib/unzip rm -rf contrib/zip rm -rf contrib/stb_image rm .travis* + diff --git a/modules/bullet/rigid_body_bullet.h b/modules/bullet/rigid_body_bullet.h index 2c9bdb8b0b..f63148092f 100644 --- a/modules/bullet/rigid_body_bullet.h +++ b/modules/bullet/rigid_body_bullet.h @@ -305,7 +305,7 @@ public: void reload_axis_lock(); /// Doc: - /// http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Anti_tunneling_by_Motion_Clamping + /// https://web.archive.org/web/20180404091446/http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Anti_tunneling_by_Motion_Clamping void set_continuous_collision_detection(bool p_enable); bool is_continuous_collision_detection_enabled() const; diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 738b415d16..9d632aaf83 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -581,6 +581,10 @@ void SpaceBullet::create_empty_world(bool p_create_soft_world) { } else { world_mem = malloc(sizeof(btDiscreteDynamicsWorld)); } + if (!world_mem) { + ERR_EXPLAIN("Out of memory"); + ERR_FAIL(); + } if (p_create_soft_world) { collisionConfiguration = bulletnew(GodotSoftCollisionConfiguration(static_cast<btDiscreteDynamicsWorld *>(world_mem))); diff --git a/modules/gdnative/gdnative/string.cpp b/modules/gdnative/gdnative/string.cpp index 913c57eb56..9086121940 100644 --- a/modules/gdnative/gdnative/string.cpp +++ b/modules/gdnative/gdnative/string.cpp @@ -186,6 +186,20 @@ godot_bool GDAPI godot_string_ends_with(const godot_string *p_self, const godot_ return self->ends_with(*string); } +godot_int GDAPI godot_string_count(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to) { + const String *self = (const String *)p_self; + String *what = (String *)&p_what; + + return self->count(*what, p_from, p_to); +} + +godot_int GDAPI godot_string_countn(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to) { + const String *self = (const String *)p_self; + String *what = (String *)&p_what; + + return self->countn(*what, p_from, p_to); +} + godot_int GDAPI godot_string_find(const godot_string *p_self, godot_string p_what) { const String *self = (const String *)p_self; String *what = (String *)&p_what; diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp index a2ac61b35e..d82f2c692d 100644 --- a/modules/gdnative/gdnative/vector2.cpp +++ b/modules/gdnative/gdnative/vector2.cpp @@ -77,6 +77,14 @@ godot_bool GDAPI godot_vector2_is_normalized(const godot_vector2 *p_self) { return self->is_normalized(); } +godot_vector2 GDAPI godot_vector2_direction_to(const godot_vector2 *p_self, const godot_vector2 *p_to) { + godot_vector2 dest; + const Vector2 *self = (const Vector2 *)p_self; + const Vector2 *to = (const Vector2 *)p_to; + *((Vector2 *)&dest) = self->direction_to(*to); + return dest; +} + godot_real GDAPI godot_vector2_distance_to(const godot_vector2 *p_self, const godot_vector2 *p_to) { const Vector2 *self = (const Vector2 *)p_self; const Vector2 *to = (const Vector2 *)p_to; diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp index 894683ab38..15a8ef9a2e 100644 --- a/modules/gdnative/gdnative/vector3.cpp +++ b/modules/gdnative/gdnative/vector3.cpp @@ -182,6 +182,14 @@ godot_vector3 GDAPI godot_vector3_ceil(const godot_vector3 *p_self) { return dest; } +godot_vector3 GDAPI godot_vector3_direction_to(const godot_vector3 *p_self, const godot_vector3 *p_to) { + godot_vector3 dest; + const Vector3 *self = (const Vector3 *)p_self; + const Vector3 *to = (const Vector3 *)p_to; + *((Vector3 *)&dest) = self->direction_to(*to); + return dest; +} + godot_real GDAPI godot_vector3_distance_to(const godot_vector3 *p_self, const godot_vector3 *p_b) { const Vector3 *self = (const Vector3 *)p_self; const Vector3 *b = (const Vector3 *)p_b; diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 6c12ee6534..03258584ce 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -44,6 +44,42 @@ ["const godot_vector2 *", "p_to"], ["const godot_real", "p_delta"] ] + }, + { + "name": "godot_string_count", + "return_type": "godot_int", + "arguments": [ + ["const godot_string *", "p_self"], + ["godot_string", "p_what"], + ["godot_int", "p_from"], + ["godot_int", "p_to"] + ] + }, + { + "name": "godot_string_countn", + "return_type": "godot_int", + "arguments": [ + ["const godot_string *", "p_self"], + ["godot_string", "p_what"], + ["godot_int", "p_from"], + ["godot_int", "p_to"] + ] + }, + { + "name": "godot_vector3_direction_to", + "return_type": "godot_vector3", + "arguments": [ + ["const godot_vector3 *", "p_self"], + ["const godot_vector3 *", "p_to"] + ] + }, + { + "name": "godot_vector2_direction_to", + "return_type": "godot_vector2", + "arguments": [ + ["const godot_vector2 *", "p_self"], + ["const godot_vector2 *", "p_to"] + ] } ] }, @@ -6512,24 +6548,24 @@ "name": "godot_net_bind_stream_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_stream_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_stream_peer *", "p_interface"] ] }, { "name": "godot_net_bind_packet_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_packet_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_packet_peer *", "p_interface"] ] }, { "name": "godot_net_bind_multiplayer_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_multiplayer_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_multiplayer_peer *", "p_interface"] ] } ] diff --git a/modules/gdnative/gdnative_library_editor_plugin.cpp b/modules/gdnative/gdnative_library_editor_plugin.cpp index e2a69b1635..5d272a6cdc 100644 --- a/modules/gdnative/gdnative_library_editor_plugin.cpp +++ b/modules/gdnative/gdnative_library_editor_plugin.cpp @@ -66,10 +66,18 @@ void GDNativeLibraryEditor::_update_tree() { tree->clear(); TreeItem *root = tree->create_item(); - for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) { + PopupMenu *filter_list = filter->get_popup(); + String text = ""; + for (int i = 0; i < filter_list->get_item_count(); i++) { - if (showing_platform != E->key() && showing_platform != "All") + if (!filter_list->is_item_checked(i)) { continue; + } + Map<String, NativePlatformConfig>::Element *E = platforms.find(filter_list->get_item_metadata(i)); + if (!text.empty()) { + text += ", "; + } + text += E->get().name; TreeItem *platform = tree->create_item(root); platform->set_text(0, E->get().name); @@ -119,6 +127,7 @@ void GDNativeLibraryEditor::_update_tree() { platform->set_collapsed(collapsed_items.find(E->get().name) != NULL); } + filter->set_text(text); } void GDNativeLibraryEditor::_on_item_button(Object *item, int column, int id) { @@ -162,9 +171,10 @@ void GDNativeLibraryEditor::_on_dependencies_selected(const PoolStringArray &fil _set_target_value(file_dialog->get_meta("section"), file_dialog->get_meta("target"), files); } -void GDNativeLibraryEditor::_on_filter_selected(int id) { +void GDNativeLibraryEditor::_on_filter_selected(int index) { - showing_platform = filter->get_item_metadata(id); + PopupMenu *filter_list = filter->get_popup(); + filter_list->set_item_checked(index, !filter_list->is_item_checked(index)); _update_tree(); } @@ -265,8 +275,6 @@ void GDNativeLibraryEditor::_translate_to_config_file() { GDNativeLibraryEditor::GDNativeLibraryEditor() { - showing_platform = "All"; - { // Define platforms NativePlatformConfig platform_windows; platform_windows.name = "Windows"; @@ -336,20 +344,21 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() { Label *label = memnew(Label); label->set_text(TTR("Platform:")); hbox->add_child(label); - filter = memnew(OptionButton); - hbox->add_child(filter); + filter = memnew(MenuButton); filter->set_h_size_flags(SIZE_EXPAND_FILL); + filter->set_text_align(filter->ALIGN_LEFT); + hbox->add_child(filter); + PopupMenu *filter_list = filter->get_popup(); + filter_list->set_hide_on_checkable_item_selection(false); int idx = 0; - filter->add_item(TTR("All"), idx); - filter->set_item_metadata(idx, "All"); - idx += 1; for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) { - filter->add_item(E->get().name, idx); - filter->set_item_metadata(idx, E->key()); + filter_list->add_check_item(E->get().name, idx); + filter_list->set_item_metadata(idx, E->key()); + filter_list->set_item_checked(idx, true); idx += 1; } - filter->connect("item_selected", this, "_on_filter_selected"); + filter_list->connect("index_pressed", this, "_on_filter_selected"); tree = memnew(Tree); container->add_child(tree); @@ -387,11 +396,9 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() { void GDNativeLibraryEditorPlugin::edit(Object *p_node) { - if (Object::cast_to<GDNativeLibrary>(p_node)) { - library_editor->edit(Object::cast_to<GDNativeLibrary>(p_node)); - library_editor->show(); - } else - library_editor->hide(); + Ref<GDNativeLibrary> new_library = Object::cast_to<GDNativeLibrary>(p_node); + if (new_library.is_valid()) + library_editor->edit(new_library); } bool GDNativeLibraryEditorPlugin::handles(Object *p_node) const { diff --git a/modules/gdnative/gdnative_library_editor_plugin.h b/modules/gdnative/gdnative_library_editor_plugin.h index e7d50ba29f..8c1449f55a 100644 --- a/modules/gdnative/gdnative_library_editor_plugin.h +++ b/modules/gdnative/gdnative_library_editor_plugin.h @@ -61,7 +61,7 @@ class GDNativeLibraryEditor : public Control { }; Tree *tree; - OptionButton *filter; + MenuButton *filter; EditorFileDialog *file_dialog; ConfirmationDialog *new_architecture_dialog; LineEdit *new_architecture_input; diff --git a/modules/gdnative/include/gdnative/string.h b/modules/gdnative/include/gdnative/string.h index f045ac9d58..7500d70f20 100644 --- a/modules/gdnative/include/gdnative/string.h +++ b/modules/gdnative/include/gdnative/string.h @@ -102,6 +102,8 @@ godot_bool GDAPI godot_string_begins_with_char_array(const godot_string *p_self, godot_array GDAPI godot_string_bigrams(const godot_string *p_self); godot_string GDAPI godot_string_chr(wchar_t p_character); godot_bool GDAPI godot_string_ends_with(const godot_string *p_self, const godot_string *p_string); +godot_int GDAPI godot_string_count(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to); +godot_int GDAPI godot_string_countn(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to); godot_int GDAPI godot_string_find(const godot_string *p_self, godot_string p_what); godot_int GDAPI godot_string_find_from(const godot_string *p_self, godot_string p_what, godot_int p_from); godot_int GDAPI godot_string_findmk(const godot_string *p_self, const godot_array *p_keys); diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h index 7a5ae6afa9..15a6c80887 100644 --- a/modules/gdnative/include/gdnative/vector2.h +++ b/modules/gdnative/include/gdnative/vector2.h @@ -71,6 +71,8 @@ godot_real GDAPI godot_vector2_length_squared(const godot_vector2 *p_self); godot_bool GDAPI godot_vector2_is_normalized(const godot_vector2 *p_self); +godot_vector2 GDAPI godot_vector2_direction_to(const godot_vector2 *p_self, const godot_vector2 *p_b); + godot_real GDAPI godot_vector2_distance_to(const godot_vector2 *p_self, const godot_vector2 *p_to); godot_real GDAPI godot_vector2_distance_squared_to(const godot_vector2 *p_self, const godot_vector2 *p_to); diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h index 70ec6422ac..ee7d029028 100644 --- a/modules/gdnative/include/gdnative/vector3.h +++ b/modules/gdnative/include/gdnative/vector3.h @@ -106,6 +106,8 @@ godot_vector3 GDAPI godot_vector3_floor(const godot_vector3 *p_self); godot_vector3 GDAPI godot_vector3_ceil(const godot_vector3 *p_self); +godot_vector3 GDAPI godot_vector3_direction_to(const godot_vector3 *p_self, const godot_vector3 *p_b); + godot_real GDAPI godot_vector3_distance_to(const godot_vector3 *p_self, const godot_vector3 *p_b); godot_real GDAPI godot_vector3_distance_squared_to(const godot_vector3 *p_self, const godot_vector3 *p_b); diff --git a/modules/gdnative/include/nativescript/godot_nativescript.h b/modules/gdnative/include/nativescript/godot_nativescript.h index f3b9f7fb31..7f52f5736c 100644 --- a/modules/gdnative/include/nativescript/godot_nativescript.h +++ b/modules/gdnative/include/nativescript/godot_nativescript.h @@ -56,7 +56,7 @@ typedef enum { GODOT_PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" GODOT_PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) GODOT_PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - GODOT_PROPERTY_HINT_SPRITE_FRAME, + GODOT_PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat GODOT_PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) GODOT_PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) GODOT_PROPERTY_HINT_LAYERS_2D_RENDER, @@ -98,8 +98,8 @@ typedef enum { GODOT_PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings GODOT_PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor GODOT_PROPERTY_USAGE_CATEGORY = 256, - GODOT_PROPERTY_USAGE_STORE_IF_NONZERO = 512, //only store if nonzero - GODOT_PROPERTY_USAGE_STORE_IF_NONONE = 1024, //only store if false + GODOT_PROPERTY_USAGE_STORE_IF_NONZERO = 512, // FIXME: Obsolete: drop whenever we can break compat + GODOT_PROPERTY_USAGE_STORE_IF_NONONE = 1024, // FIXME: Obsolete: drop whenever we can break compat GODOT_PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, GODOT_PROPERTY_USAGE_RESTART_IF_CHANGED = 4096, GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE = 8192, diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 62a3794c6d..ad47323613 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -322,6 +322,7 @@ <description> The natural exponential function. It raises the mathematical constant [b]e[/b] to the power of [code]s[/code] and returns it. [b]e[/b] has an approximate value of 2.71828. + For exponents to other bases use the method [method pow]. [codeblock] a = exp(2) # Approximately 7.39 [/codeblock] @@ -1095,7 +1096,7 @@ <argument index="0" name="step" type="float"> </argument> <description> - Returns the position of the first non-zero digit, after the decimal point. + Returns the position of the first non-zero digit, after the decimal point. Note that the maximum return value is 10, which is a design decision in the implementation. [codeblock] # n is 0 n = step_decimals(5) diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp index 95715ab648..59b53b5f9a 100644 --- a/modules/gdscript/gdscript_tokenizer.cpp +++ b/modules/gdscript/gdscript_tokenizer.cpp @@ -517,7 +517,22 @@ void GDScriptTokenizerText::_advance() { INCPOS(1); column = 1; int i = 0; - while (GETCHAR(i) == ' ' || GETCHAR(i) == '\t') { + while (true) { + if (GETCHAR(i) == ' ') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_SPACES; + if (file_indent_type != INDENT_SPACES) { + _make_error("Spaces used for indentation in tab-indented file!"); + return; + } + } else if (GETCHAR(i) == '\t') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_TABS; + if (file_indent_type != INDENT_TABS) { + _make_error("Tabs used for indentation in space-indented file!"); + return; + } + } else { + break; // not indentation anymore + } i++; } @@ -555,9 +570,25 @@ void GDScriptTokenizerText::_advance() { column = 1; line++; int i = 0; - while (GETCHAR(i) == ' ' || GETCHAR(i) == '\t') { + while (true) { + if (GETCHAR(i) == ' ') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_SPACES; + if (file_indent_type != INDENT_SPACES) { + _make_error("Spaces used for indentation in tab-indented file!"); + return; + } + } else if (GETCHAR(i) == '\t') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_TABS; + if (file_indent_type != INDENT_TABS) { + _make_error("Tabs used for indentation in space-indented file!"); + return; + } + } else { + break; // not indentation anymore + } i++; } + _make_newline(i); return; @@ -1082,6 +1113,7 @@ void GDScriptTokenizerText::set_code(const String &p_code) { ignore_warnings = false; #endif // DEBUG_ENABLED last_error = ""; + file_indent_type = INDENT_NONE; for (int i = 0; i < MAX_LOOKAHEAD + 1; i++) _advance(); } diff --git a/modules/gdscript/gdscript_tokenizer.h b/modules/gdscript/gdscript_tokenizer.h index 7b977ff67c..89d586b912 100644 --- a/modules/gdscript/gdscript_tokenizer.h +++ b/modules/gdscript/gdscript_tokenizer.h @@ -222,6 +222,12 @@ class GDScriptTokenizerText : public GDScriptTokenizer { int tk_rb_pos; String last_error; bool error_flag; + enum { + INDENT_NONE, + INDENT_SPACES, + INDENT_TABS, + } file_indent_type; + #ifdef DEBUG_ENABLED Vector<Pair<int, String> > warning_skips; Set<String> warning_global_skips; diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 078a490b22..846c84d222 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -629,7 +629,6 @@ void CSharpLanguage::frame() { if (exc) { GDMonoUtils::debug_unhandled_exception(exc); - GD_UNREACHABLE(); } } } diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs index 1edc426e00..233aab45b3 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs @@ -85,7 +85,7 @@ namespace GodotTools.ProjectEditor void AddPropertyIfNotPresent(string name, string condition, string value) { if (root.PropertyGroups - .Any(g => g.Condition == string.Empty || g.Condition == condition && + .Any(g => (g.Condition == string.Empty || g.Condition == condition) && g.Properties .Any(p => p.Name == name && p.Value == value && diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs index f849356919..d8cb9024c3 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs @@ -137,7 +137,7 @@ namespace GodotTools.Build private static string BuildArguments(string solution, string config, string loggerOutputDir, List<string> customProperties) { - string arguments = $@"""{solution}"" /v:normal /t:Rebuild ""/p:{"Configuration=" + config}"" " + + string arguments = $@"""{solution}"" /v:normal /t:Build ""/p:{"Configuration=" + config}"" " + $@"""/l:{typeof(GodotBuildLogger).FullName},{GodotBuildLogger.AssemblyPath};{loggerOutputDir}"""; foreach (string customProperty in customProperties) diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs index f0068385f4..926aabdf89 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs @@ -15,7 +15,6 @@ namespace GodotTools.Build { private static string _msbuildToolsPath = string.Empty; private static string _msbuildUnixPath = string.Empty; - private static string _xbuildUnixPath = string.Empty; public static string FindMsBuild() { @@ -44,7 +43,6 @@ namespace GodotTools.Build return Path.Combine(_msbuildToolsPath, "MSBuild.exe"); } - case GodotSharpBuilds.BuildTool.MsBuildMono: { string msbuildPath = Path.Combine(Internal.MonoWindowsInstallRoot, "bin", "msbuild.bat"); @@ -56,19 +54,6 @@ namespace GodotTools.Build return msbuildPath; } - - case GodotSharpBuilds.BuildTool.XBuild: - { - string xbuildPath = Path.Combine(Internal.MonoWindowsInstallRoot, "bin", "xbuild.bat"); - - if (!File.Exists(xbuildPath)) - { - throw new FileNotFoundException($"Cannot find executable for '{GodotSharpBuilds.PropNameXbuild}'. Tried with path: {xbuildPath}"); - } - - return xbuildPath; - } - default: throw new IndexOutOfRangeException("Invalid build tool in editor settings"); } @@ -76,20 +61,7 @@ namespace GodotTools.Build if (OS.IsUnix()) { - if (buildTool == GodotSharpBuilds.BuildTool.XBuild) - { - if (_xbuildUnixPath.Empty() || !File.Exists(_xbuildUnixPath)) - { - // Try to search it again if it wasn't found last time or if it was removed from its location - _xbuildUnixPath = FindBuildEngineOnUnix("msbuild"); - } - - if (_xbuildUnixPath.Empty()) - { - throw new FileNotFoundException($"Cannot find binary for '{GodotSharpBuilds.PropNameXbuild}'"); - } - } - else + if (buildTool == GodotSharpBuilds.BuildTool.MsBuildMono) { if (_msbuildUnixPath.Empty() || !File.Exists(_msbuildUnixPath)) { @@ -101,9 +73,13 @@ namespace GodotTools.Build { throw new FileNotFoundException($"Cannot find binary for '{GodotSharpBuilds.PropNameMsbuildMono}'"); } - } - return buildTool != GodotSharpBuilds.BuildTool.XBuild ? _msbuildUnixPath : _xbuildUnixPath; + return _msbuildUnixPath; + } + else + { + throw new IndexOutOfRangeException("Invalid build tool in editor settings"); + } } throw new PlatformNotSupportedException(); diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs index a884b0ead0..de3a4d9a6e 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs @@ -18,7 +18,6 @@ namespace GodotTools public const string PropNameMsbuildMono = "MSBuild (Mono)"; public const string PropNameMsbuildVs = "MSBuild (VS Build Tools)"; - public const string PropNameXbuild = "xbuild (Deprecated)"; public const string MsBuildIssuesFileName = "msbuild_issues.csv"; public const string MsBuildLogFileName = "msbuild_log.txt"; @@ -26,8 +25,7 @@ namespace GodotTools public enum BuildTool { MsBuildMono, - MsBuildVs, - XBuild // Deprecated + MsBuildVs } private static void RemoveOldIssuesFile(MonoBuildInfo buildInfo) @@ -64,7 +62,7 @@ namespace GodotTools private static string GetIssuesFilePath(MonoBuildInfo buildInfo) { - return Path.Combine(Godot.ProjectSettings.LocalizePath(buildInfo.LogsDirPath), MsBuildIssuesFileName); + return Path.Combine(buildInfo.LogsDirPath, MsBuildIssuesFileName); } private static void PrintVerbose(string text) @@ -202,6 +200,9 @@ namespace GodotTools // case the user decided to delete them at some point after they were loaded. Internal.UpdateApiAssembliesFromPrebuilt(); + var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings(); + var buildTool = (BuildTool)editorSettings.GetSetting("mono/builds/build_tool"); + using (var pr = new EditorProgress("mono_project_debug_build", "Building project solution...", 1)) { pr.Step("Building project solution", 0); @@ -209,7 +210,7 @@ namespace GodotTools var buildInfo = new MonoBuildInfo(GodotSharpDirs.ProjectSlnPath, config); // Add Godot defines - string constants = OS.IsWindows() ? "GodotDefineConstants=\"" : "GodotDefineConstants=\\\""; + string constants = buildTool == BuildTool.MsBuildVs ? "GodotDefineConstants=\"" : "GodotDefineConstants=\\\""; foreach (var godotDefine in godotDefines) constants += $"GODOT_{godotDefine.ToUpper().Replace("-", "_").Replace(" ", "_").Replace(";", "_")};"; @@ -217,7 +218,7 @@ namespace GodotTools if (Internal.GodotIsRealTDouble()) constants += "GODOT_REAL_T_IS_DOUBLE;"; - constants += OS.IsWindows() ? "\"" : "\\\""; + constants += buildTool == BuildTool.MsBuildVs ? "\"" : "\\\""; buildInfo.CustomProperties.Add(constants); @@ -267,8 +268,8 @@ namespace GodotTools ["name"] = "mono/builds/build_tool", ["hint"] = Godot.PropertyHint.Enum, ["hint_string"] = OS.IsWindows() ? - $"{PropNameMsbuildMono},{PropNameMsbuildVs},{PropNameXbuild}" : - $"{PropNameMsbuildMono},{PropNameXbuild}" + $"{PropNameMsbuildMono},{PropNameMsbuildVs}" : + $"{PropNameMsbuildMono}" }); EditorDef("mono/builds/print_build_output", false); diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 90dec43412..9b5afb94a3 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -298,7 +298,16 @@ namespace GodotTools if (line >= 0) scriptPath += $";{line + 1};{col}"; - GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath).Execute(scriptPath); + try + { + GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath).Execute(scriptPath); + } + catch (FileNotFoundException) + { + string editorName = editor == ExternalEditor.VisualStudioForMac ? "Visual Studio" : "MonoDevelop"; + GD.PushError($"Cannot find code editor: {editorName}"); + return Error.FileNotFound; + } break; } diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs b/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs index 75fdacc0da..3a74fa2f66 100644 --- a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs +++ b/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs @@ -61,41 +61,48 @@ namespace GodotTools { using (var file = new Godot.File()) { - Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); - - if (openError != Error.Ok) - return; - - while (!file.EofReached()) + try { - string[] csvColumns = file.GetCsvLine(); + Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); - if (csvColumns.Length == 1 && csvColumns[0].Empty()) + if (openError != Error.Ok) return; - if (csvColumns.Length != 7) + while (!file.EofReached()) { - GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); - continue; + string[] csvColumns = file.GetCsvLine(); + + if (csvColumns.Length == 1 && csvColumns[0].Empty()) + return; + + if (csvColumns.Length != 7) + { + GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); + continue; + } + + var issue = new BuildIssue + { + Warning = csvColumns[0] == "warning", + File = csvColumns[1], + Line = int.Parse(csvColumns[2]), + Column = int.Parse(csvColumns[3]), + Code = csvColumns[4], + Message = csvColumns[5], + ProjectFile = csvColumns[6] + }; + + if (issue.Warning) + WarningCount += 1; + else + ErrorCount += 1; + + issues.Add(issue); } - - var issue = new BuildIssue - { - Warning = csvColumns[0] == "warning", - File = csvColumns[1], - Line = int.Parse(csvColumns[2]), - Column = int.Parse(csvColumns[3]), - Code = csvColumns[4], - Message = csvColumns[5], - ProjectFile = csvColumns[6] - }; - - if (issue.Warning) - WarningCount += 1; - else - ErrorCount += 1; - - issues.Add(issue); + } + finally + { + file.Close(); // Disposing it is not enough. We need to call Close() } } } diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs b/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs index 0c8d86e799..61a0a992ce 100644 --- a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs +++ b/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs @@ -4,6 +4,7 @@ using System.IO; using System.Collections.Generic; using System.Diagnostics; using GodotTools.Internals; +using GodotTools.Utils; namespace GodotTools { @@ -30,7 +31,7 @@ namespace GodotTools if (Utils.OS.IsOSX()) { - string bundleId = CodeEditorBundleIds[editorId]; + string bundleId = BundleIds[editorId]; if (Internal.IsOsxAppBundleInstalled(bundleId)) { @@ -47,12 +48,12 @@ namespace GodotTools } else { - command = CodeEditorPaths[editorId]; + command = OS.PathWhich(ExecutableNames[editorId]); } } else { - command = CodeEditorPaths[editorId]; + command = OS.PathWhich(ExecutableNames[editorId]); } args.Add("--ipc-tcp"); @@ -70,6 +71,9 @@ namespace GodotTools args.Add("\"" + Path.GetFullPath(filePath.NormalizePath()) + cursor + "\""); } + if (command == null) + throw new FileNotFoundException(); + if (newWindow) { process = Process.Start(new ProcessStartInfo @@ -99,20 +103,20 @@ namespace GodotTools this.editorId = editorId; } - private static readonly IReadOnlyDictionary<EditorId, string> CodeEditorPaths; - private static readonly IReadOnlyDictionary<EditorId, string> CodeEditorBundleIds; + private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames; + private static readonly IReadOnlyDictionary<EditorId, string> BundleIds; static MonoDevelopInstance() { if (Utils.OS.IsOSX()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // Rely on PATH {EditorId.MonoDevelop, "monodevelop"}, {EditorId.VisualStudioForMac, "VisualStudio"} }; - CodeEditorBundleIds = new Dictionary<EditorId, string> + BundleIds = new Dictionary<EditorId, string> { // TODO EditorId.MonoDevelop {EditorId.VisualStudioForMac, "com.microsoft.visual-studio"} @@ -120,7 +124,7 @@ namespace GodotTools } else if (Utils.OS.IsWindows()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // XamarinStudio is no longer a thing, and the latest version is quite old // MonoDevelop is available from source only on Windows. The recommendation @@ -131,7 +135,7 @@ namespace GodotTools } else if (Utils.OS.IsUnix()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // Rely on PATH {EditorId.MonoDevelop, "monodevelop"} diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs index 3ae6c10bbf..288c65de74 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs @@ -10,8 +10,9 @@ namespace GodotTools.Utils { foreach (T elem in enumerable) { - if (predicate(elem) != null) - return elem; + T result = predicate(elem); + if (result != null) + return result; } return orElse; diff --git a/modules/mono/glue/Managed/Files/Basis.cs b/modules/mono/glue/Managed/Files/Basis.cs index 9cc31a0557..5a6a5ff658 100644 --- a/modules/mono/glue/Managed/Files/Basis.cs +++ b/modules/mono/glue/Managed/Files/Basis.cs @@ -225,7 +225,7 @@ namespace Godot return orthonormalizedBasis.Quat(); } - internal void SetQuantScale(Quat quat, Vector3 scale) + internal void SetQuatScale(Quat quat, Vector3 scale) { SetDiagonal(scale); Rotate(quat); @@ -241,7 +241,6 @@ namespace Godot Row0 = new Vector3(diagonal.x, 0, 0); Row1 = new Vector3(0, diagonal.y, 0); Row2 = new Vector3(0, 0, diagonal.z); - } public real_t Determinant() diff --git a/modules/mono/glue/Managed/Files/NodePath.cs b/modules/mono/glue/Managed/Files/NodePath.cs index 94a4ed1de9..4de4e1e6a9 100644 --- a/modules/mono/glue/Managed/Files/NodePath.cs +++ b/modules/mono/glue/Managed/Files/NodePath.cs @@ -55,7 +55,7 @@ namespace Godot get { return ptr; } } - public NodePath() : this(string.Empty) { } + public NodePath() : this(string.Empty) {} public NodePath(string path) { diff --git a/modules/mono/glue/Managed/Files/Quat.cs b/modules/mono/glue/Managed/Files/Quat.cs index 0d4349084a..f1d97b9b5c 100644 --- a/modules/mono/glue/Managed/Files/Quat.cs +++ b/modules/mono/glue/Managed/Files/Quat.cs @@ -95,6 +95,7 @@ namespace Godot return this / Length; } + [Obsolete("Set is deprecated. Use the Quat(" + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y, real_t z, real_t w) { this.x = x; @@ -103,16 +104,19 @@ namespace Godot this.w = w; } + [Obsolete("Set is deprecated. Use the Quat(" + nameof(Quat) + ") constructor instead.", error: true)] public void Set(Quat q) { this = q; } + [Obsolete("SetAxisAngle is deprecated. Use the Quat(" + nameof(Vector3) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void SetAxisAngle(Vector3 axis, real_t angle) { this = new Quat(axis, angle); } + [Obsolete("SetEuler is deprecated. Use the Quat(" + nameof(Vector3) + ") constructor instead.", error: true)] public void SetEuler(Vector3 eulerYXZ) { this = new Quat(eulerYXZ); @@ -229,9 +233,9 @@ namespace Godot public Quat(Vector3 eulerYXZ) { - real_t half_a1 = eulerYXZ.y * (real_t)0.5; - real_t half_a2 = eulerYXZ.x * (real_t)0.5; - real_t half_a3 = eulerYXZ.z * (real_t)0.5; + real_t half_a1 = eulerYXZ.y * 0.5f; + real_t half_a2 = eulerYXZ.x * 0.5f; + real_t half_a3 = eulerYXZ.z * 0.5f; // R = Y(a1).X(a2).Z(a3) convention for Euler angles. // Conversion to quaternion as listed in https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf (page A-6) @@ -246,7 +250,7 @@ namespace Godot x = sin_a1 * cos_a2 * sin_a3 + cos_a1 * sin_a2 * cos_a3; y = sin_a1 * cos_a2 * cos_a3 - cos_a1 * sin_a2 * sin_a3; - z = -sin_a1 * sin_a2 * cos_a3 + cos_a1 * cos_a2 * sin_a3; + z = cos_a1 * cos_a2 * sin_a3 - sin_a1 * sin_a2 * cos_a3; w = sin_a1 * sin_a2 * sin_a3 + cos_a1 * cos_a2 * cos_a3; } diff --git a/modules/mono/glue/Managed/Files/StringExtensions.cs b/modules/mono/glue/Managed/Files/StringExtensions.cs index b43034fbb5..6045c83e95 100644 --- a/modules/mono/glue/Managed/Files/StringExtensions.cs +++ b/modules/mono/glue/Managed/Files/StringExtensions.cs @@ -98,6 +98,66 @@ namespace Godot } // <summary> + // Return the amount of substrings in string. + // </summary> + public static int Count(this string instance, string what, bool caseSensitive = true, int from = 0, int to = 0) + { + if (what.Length == 0) + { + return 0; + } + + int len = instance.Length; + int slen = what.Length; + + if (len < slen) + { + return 0; + } + + string str; + + if (from >= 0 && to >= 0) + { + if (to == 0) + { + to = len; + } + else if (from >= to) + { + return 0; + } + if (from == 0 && to == len) + { + str = instance; + } + else + { + str = instance.Substring(from, to - from); + } + } + else + { + return 0; + } + + int c = 0; + int idx; + + do + { + idx = str.IndexOf(what, caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase); + if (idx != -1) + { + str = str.Substring(idx + slen); + ++c; + } + } while (idx != -1); + + return c; + } + + // <summary> // Return a copy of the string with special characters escaped using the C language standard. // </summary> public static string CEscape(this string instance) diff --git a/modules/mono/glue/Managed/Files/Transform.cs b/modules/mono/glue/Managed/Files/Transform.cs index bd79144873..de70ccbe98 100644 --- a/modules/mono/glue/Managed/Files/Transform.cs +++ b/modules/mono/glue/Managed/Files/Transform.cs @@ -33,7 +33,7 @@ namespace Godot Vector3 destinationLocation = transform.origin; var interpolated = new Transform(); - interpolated.basis.SetQuantScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c)); + interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c)); interpolated.origin = sourceLocation.LinearInterpolate(destinationLocation, c); return interpolated; diff --git a/modules/mono/glue/Managed/Files/Transform2D.cs b/modules/mono/glue/Managed/Files/Transform2D.cs index 33ff286769..12a3811230 100644 --- a/modules/mono/glue/Managed/Files/Transform2D.cs +++ b/modules/mono/glue/Managed/Files/Transform2D.cs @@ -98,6 +98,8 @@ namespace Godot return x[columnIndex]; case 1: return y[columnIndex]; + case 2: + return origin[columnIndex]; default: throw new IndexOutOfRangeException(); } @@ -112,6 +114,9 @@ namespace Godot case 1: y[columnIndex] = value; return; + case 2: + origin[columnIndex] = value; + return; default: throw new IndexOutOfRangeException(); } @@ -136,7 +141,7 @@ namespace Godot inv[0] *= new Vector2(detInv, -detInv); inv[1] *= new Vector2(-detInv, detInv); - inv[2] = BasisXform(-inv[2]); + inv[2] = inv.BasisXform(-inv[2]); return inv; } diff --git a/modules/mono/glue/Managed/Files/Vector2.cs b/modules/mono/glue/Managed/Files/Vector2.cs index a7f26283a7..3fb40d8a61 100644 --- a/modules/mono/glue/Managed/Files/Vector2.cs +++ b/modules/mono/glue/Managed/Files/Vector2.cs @@ -222,11 +222,13 @@ namespace Godot return new Vector2(Mathf.Round(x), Mathf.Round(y)); } + [Obsolete("Set is deprecated. Use the Vector2(" + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y) { this.x = x; this.y = y; } + [Obsolete("Set is deprecated. Use the Vector2(" + nameof(Vector2) + ") constructor instead.", error: true)] public void Set(Vector2 v) { x = v.x; diff --git a/modules/mono/glue/Managed/Files/Vector3.cs b/modules/mono/glue/Managed/Files/Vector3.cs index 16803ae55c..68601da1e7 100644 --- a/modules/mono/glue/Managed/Files/Vector3.cs +++ b/modules/mono/glue/Managed/Files/Vector3.cs @@ -248,12 +248,14 @@ namespace Godot return new Basis(axis, phi).Xform(this); } + [Obsolete("Set is deprecated. Use the Vector3(" + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y, real_t z) { this.x = x; this.y = y; this.z = z; } + [Obsolete("Set is deprecated. Use the Vector3(" + nameof(Vector3) + ") constructor instead.", error: true)] public void Set(Vector3 v) { x = v.x; diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 571bf598f3..45f79074be 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -283,6 +283,18 @@ void GDMono::initialize() { add_mono_shared_libs_dir_to_path(); + { + PropertyInfo exc_policy_prop = PropertyInfo(Variant::INT, "mono/unhandled_exception_policy", PROPERTY_HINT_ENUM, + vformat("Terminate Application:%s,Log Error:%s", (int)POLICY_TERMINATE_APP, (int)POLICY_LOG_ERROR)); + unhandled_exception_policy = (UnhandledExceptionPolicy)(int)GLOBAL_DEF(exc_policy_prop.name, (int)POLICY_TERMINATE_APP); + ProjectSettings::get_singleton()->set_custom_property_info(exc_policy_prop.name, exc_policy_prop); + + if (Engine::get_singleton()->is_editor_hint()) { + // Unhandled exceptions should not terminate the editor + unhandled_exception_policy = POLICY_LOG_ERROR; + } + } + GDMonoAssembly::initialize(); gdmono_profiler_init(); @@ -645,7 +657,14 @@ bool GDMono::_load_core_api_assembly() { #ifdef TOOLS_ENABLED // For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date - String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(CORE_API_ASSEMBLY_NAME ".dll"); + + // If running the project manager, load it from the prebuilt API directory + String assembly_dir = !Main::is_project_manager() ? + GodotSharpDirs::get_res_assemblies_dir() : + GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); + + String assembly_path = assembly_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll"); + bool success = FileAccess::exists(assembly_path) && load_assembly_from(CORE_API_ASSEMBLY_NAME, assembly_path, &core_api_assembly); #else @@ -676,7 +695,14 @@ bool GDMono::_load_editor_api_assembly() { return true; // For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date - String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); + + // If running the project manager, load it from the prebuilt API directory + String assembly_dir = !Main::is_project_manager() ? + GodotSharpDirs::get_res_assemblies_dir() : + GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); + + String assembly_path = assembly_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); + bool success = FileAccess::exists(assembly_path) && load_assembly_from(EDITOR_API_ASSEMBLY_NAME, assembly_path, &editor_api_assembly); @@ -728,6 +754,12 @@ void GDMono::_load_api_assemblies() { // The API assemblies are out of sync. Fine, try one more time, but this time // update them from the prebuilt assemblies directory before trying to load them. + // Shouldn't happen. The project manager loads the prebuilt API assemblies + if (Main::is_project_manager()) { + ERR_EXPLAIN("Failed to load one of the prebuilt API assemblies"); + CRASH_NOW(); + } + // 1. Unload the scripts domain if (_unload_scripts_domain() != OK) { ERR_EXPLAIN("Mono: Failed to unload scripts domain"); @@ -1063,6 +1095,8 @@ GDMono::GDMono() { #ifdef TOOLS_ENABLED api_editor_hash = 0; #endif + + unhandled_exception_policy = POLICY_TERMINATE_APP; } GDMono::~GDMono() { diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index deebe5fd50..c5bcce4fa1 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -80,6 +80,13 @@ String to_string(Type p_type); class GDMono { +public: + enum UnhandledExceptionPolicy { + POLICY_TERMINATE_APP, + POLICY_LOG_ERROR + }; + +private: bool runtime_initialized; bool finalizing_scripts_domain; @@ -102,6 +109,8 @@ class GDMono { HashMap<uint32_t, HashMap<String, GDMonoAssembly *> > assemblies; + UnhandledExceptionPolicy unhandled_exception_policy; + void _domain_assemblies_cleanup(uint32_t p_domain_id); bool _are_api_assemblies_out_of_sync(); @@ -162,7 +171,9 @@ public: static GDMono *get_singleton() { return singleton; } - static void unhandled_exception_hook(MonoObject *p_exc, void *p_user_data); + GD_NORETURN static void unhandled_exception_hook(MonoObject *p_exc, void *p_user_data); + + UnhandledExceptionPolicy get_unhandled_exception_policy() const { return unhandled_exception_policy; } // Do not use these, unless you know what you're doing void add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly); diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp index a84332d4cd..e50e3b0794 100644 --- a/modules/mono/mono_gd/gd_mono_internals.cpp +++ b/modules/mono/mono_gd/gd_mono_internals.cpp @@ -108,9 +108,18 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) { void unhandled_exception(MonoException *p_exc) { mono_unhandled_exception((MonoObject *)p_exc); // prints the exception as well - // Too bad 'mono_invoke_unhandled_exception_hook' is not exposed to embedders - GDMono::unhandled_exception_hook((MonoObject *)p_exc, NULL); - GD_UNREACHABLE(); + + if (GDMono::get_singleton()->get_unhandled_exception_policy() == GDMono::POLICY_TERMINATE_APP) { + // Too bad 'mono_invoke_unhandled_exception_hook' is not exposed to embedders + GDMono::unhandled_exception_hook((MonoObject *)p_exc, NULL); + GD_UNREACHABLE(); + } else { +#ifdef DEBUG_ENABLED + GDMonoUtils::debug_send_unhandled_exception_error((MonoException *)p_exc); + if (ScriptDebugger::get_singleton()) + ScriptDebugger::get_singleton()->idle_poll(); +#endif + } } } // namespace GDMonoInternals diff --git a/modules/mono/mono_gd/gd_mono_internals.h b/modules/mono/mono_gd/gd_mono_internals.h index 2d77bde27c..0d82723913 100644 --- a/modules/mono/mono_gd/gd_mono_internals.h +++ b/modules/mono/mono_gd/gd_mono_internals.h @@ -45,7 +45,7 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged); * Do not call this function directly. * Use GDMonoUtils::debug_unhandled_exception(MonoException *) instead. */ -GD_NORETURN void unhandled_exception(MonoException *p_exc); +void unhandled_exception(MonoException *p_exc); } // namespace GDMonoInternals diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp index 5987fa8ebb..7afdfc8ac8 100644 --- a/modules/mono/mono_gd/gd_mono_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_utils.cpp @@ -37,6 +37,10 @@ #include "core/project_settings.h" #include "core/reference.h" +#ifdef TOOLS_ENABLED +#include "editor/script_editor_debugger.h" +#endif + #include "../csharp_script.h" #include "../utils/macros.h" #include "../utils/mutex_utils.h" @@ -596,8 +600,14 @@ void debug_print_unhandled_exception(MonoException *p_exc) { void debug_send_unhandled_exception_error(MonoException *p_exc) { #ifdef DEBUG_ENABLED - if (!ScriptDebugger::get_singleton()) + if (!ScriptDebugger::get_singleton()) { +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + ERR_PRINTS(GDMonoUtils::get_exception_name_and_message(p_exc)); + } +#endif return; + } _TLS_RECURSION_GUARD_; @@ -621,7 +631,7 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) { if (unexpected_exc) { GDMonoInternals::unhandled_exception(unexpected_exc); - GD_UNREACHABLE(); + return; } Vector<ScriptLanguage::StackInfo> _si; @@ -655,7 +665,6 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) { void debug_unhandled_exception(MonoException *p_exc) { GDMonoInternals::unhandled_exception(p_exc); // prints the exception as well - GD_UNREACHABLE(); } void print_unhandled_exception(MonoException *p_exc) { @@ -665,11 +674,9 @@ void print_unhandled_exception(MonoException *p_exc) { void set_pending_exception(MonoException *p_exc) { #ifdef NO_PENDING_EXCEPTIONS debug_unhandled_exception(p_exc); - GD_UNREACHABLE(); #else if (get_runtime_invoke_count() == 0) { debug_unhandled_exception(p_exc); - GD_UNREACHABLE(); } if (!mono_runtime_set_pending_exception(p_exc, false)) { diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h index f535fbb6d0..d73743bf0b 100644 --- a/modules/mono/mono_gd/gd_mono_utils.h +++ b/modules/mono/mono_gd/gd_mono_utils.h @@ -289,7 +289,7 @@ void set_exception_message(MonoException *p_exc, String message); void debug_print_unhandled_exception(MonoException *p_exc); void debug_send_unhandled_exception_error(MonoException *p_exc); -GD_NORETURN void debug_unhandled_exception(MonoException *p_exc); +void debug_unhandled_exception(MonoException *p_exc); void print_unhandled_exception(MonoException *p_exc); /** diff --git a/modules/websocket/wsl_client.cpp b/modules/websocket/wsl_client.cpp index 86374e8f80..af75f2a320 100644 --- a/modules/websocket/wsl_client.cpp +++ b/modules/websocket/wsl_client.cpp @@ -190,8 +190,8 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, Error err = _tcp->connect_to_host(addr, p_port); if (err != OK) { - _on_error(); _tcp->disconnect_from_host(); + _on_error(); return err; } _connection = _tcp; @@ -230,8 +230,8 @@ void WSLClient::poll() { if (_peer->is_connected_to_host()) { _peer->poll(); if (!_peer->is_connected_to_host()) { - _on_disconnect(_peer->close_code != -1); disconnect_from_host(); + _on_disconnect(_peer->close_code != -1); } return; } @@ -242,8 +242,8 @@ void WSLClient::poll() { switch (_tcp->get_status()) { case StreamPeerTCP::STATUS_NONE: // Clean close - _on_error(); disconnect_from_host(); + _on_error(); break; case StreamPeerTCP::STATUS_CONNECTED: { Ref<StreamPeerSSL> ssl; @@ -255,8 +255,8 @@ void WSLClient::poll() { ERR_FAIL_COND(ssl.is_null()); ssl->set_blocking_handshake_enabled(false); if (ssl->connect_to_stream(_tcp, verify_ssl, _host) != OK) { - _on_error(); disconnect_from_host(); + _on_error(); return; } _connection = ssl; @@ -268,8 +268,8 @@ void WSLClient::poll() { if (ssl->get_status() == StreamPeerSSL::STATUS_HANDSHAKING) return; // Need more polling. else if (ssl->get_status() != StreamPeerSSL::STATUS_CONNECTED) { - _on_error(); disconnect_from_host(); + _on_error(); return; // Error. } } @@ -277,8 +277,8 @@ void WSLClient::poll() { _do_handshake(); } break; case StreamPeerTCP::STATUS_ERROR: - _on_error(); disconnect_from_host(); + _on_error(); break; case StreamPeerTCP::STATUS_CONNECTING: break; // Wait for connection diff --git a/platform/android/SCsub b/platform/android/SCsub index d772dc9d71..e355caf0f9 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -53,7 +53,6 @@ if lib_arch_dir != '': out_dir = '#platform/android/java/libs/' + lib_type_dir + '/' + lib_arch_dir env_android.Command(out_dir + '/libgodot_android.so', '#bin/libgodot' + env['SHLIBSUFFIX'], Move("$TARGET", "$SOURCE")) - ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so' - env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE")) + + stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so' + env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE")) diff --git a/platform/android/detect.py b/platform/android/detect.py index 3f179e3a65..283791f336 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -28,7 +28,6 @@ def get_opts(): ('ndk_platform', 'Target platform (android-<api>, e.g. "android-18")', "android-18"), EnumVariable('android_arch', 'Target architecture', "armv7", ('armv7', 'arm64v8', 'x86', 'x86_64')), BoolVariable('android_neon', 'Enable NEON support (armv7 only)', True), - BoolVariable('android_stl', 'Enable Android STL support (for modules)', True) ] @@ -205,31 +204,29 @@ def configure(env): common_opts = ['-fno-integrated-as', '-gcc-toolchain', gcc_toolchain_path] - lib_sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] - ## Compile flags + + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"]) + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"]) + env.Append(CXXFLAGS=["-std=gnu++14"]) + # Disable exceptions and rtti on non-tools (template) builds - if env['tools'] or env['android_stl']: - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"]) - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"]) - env.Append(CXXFLAGS=['-frtti', "-std=gnu++14"]) + if env['tools']: + env.Append(CXXFLAGS=['-frtti']) else: env.Append(CXXFLAGS=['-fno-rtti', '-fno-exceptions']) # Don't use dynamic_cast, necessary with no-rtti. env.Append(CPPDEFINES=['NO_SAFE_CAST']) - ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - print("Using NDK unified headers") - sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" - env.Append(CPPFLAGS=["--sysroot=" + sysroot]) - env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/android/support/include"]) - # For unified headers this define has to be set manually - env.Append(CPPDEFINES=[('__ANDROID_API__', str(get_platform(env['ndk_platform'])))]) - else: - print("Using NDK deprecated headers") - env.Append(CPPFLAGS=["-isystem", lib_sysroot + "/usr/include"]) + lib_sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] + + # Using NDK unified headers (NDK r15+) + sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" + env.Append(CPPFLAGS=["--sysroot=" + sysroot]) + env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/android/support/include"]) + # For unified headers this define has to be set manually + env.Append(CPPDEFINES=[('__ANDROID_API__', str(get_platform(env['ndk_platform'])))]) env.Append(CCFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split()) env.Append(CPPDEFINES=['NO_STATVFS', 'GLES_ENABLED']) @@ -263,18 +260,15 @@ def configure(env): env.Append(CCFLAGS=common_opts) ## Link flags - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - if LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"): - env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a', '-Wl,--exclude-libs,libatomic.a', '-nostdlib++']) - else: - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"]) - env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) - env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"]) - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"]) + + ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) + if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"): + env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a', '-Wl,--exclude-libs,libatomic.a', '-nostdlib++']) else: - env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) - if mt_link: - env.Append(LINKFLAGS=['-Wl,--threads']) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"]) + env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) + env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"]) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"]) if env["android_arch"] == "armv7": env.Append(LINKFLAGS='-Wl,--fix-cortex-a8'.split()) diff --git a/platform/iphone/camera_ios.mm b/platform/iphone/camera_ios.mm index 029ce6debf..ff84df66ff 100644 --- a/platform/iphone/camera_ios.mm +++ b/platform/iphone/camera_ios.mm @@ -158,7 +158,7 @@ } else if (dataCbCr == NULL) { print_line("Couldn't access CbCr pixel buffer data"); } else { - UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; Ref<Image> img[2]; { diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 726882438b..a48f784529 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1599,6 +1599,7 @@ void OS_OSX::finalize() { memdelete(joypad_osx); memdelete(input); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); //memdelete(rasterizer); @@ -2410,7 +2411,7 @@ Size2 OS_OSX::get_min_window_size() const { void OS_OSX::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -2426,7 +2427,7 @@ void OS_OSX::set_min_window_size(const Size2 p_size) { void OS_OSX::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp index abb7b391d3..75ce422e9e 100644 --- a/platform/uwp/export/export.cpp +++ b/platform/uwp/export/export.cpp @@ -519,7 +519,9 @@ Error AppxPackager::add_file(String p_file_name, const uint8_t *p_buffer, size_t int total_out_before = strm.total_out; - deflate(&strm, Z_FULL_FLUSH); + int err = deflate(&strm, Z_FULL_FLUSH); + ERR_FAIL_COND_V(err >= 0, ERR_BUG); // Negative means bug + bh.compressed_size = strm.total_out - total_out_before; //package->store_buffer(strm_out.ptr(), strm.total_out - total_out_before); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 745f3ce379..07470cec92 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1537,6 +1537,7 @@ void OS_Windows::finalize() { memdelete(camera_server); touch_state.clear(); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); #ifdef OPENGL_ENABLED @@ -1812,7 +1813,7 @@ Size2 OS_Windows::get_min_window_size() const { void OS_Windows::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -1821,7 +1822,7 @@ void OS_Windows::set_min_window_size(const Size2 p_size) { void OS_Windows::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; @@ -2251,9 +2252,17 @@ uint64_t OS_Windows::get_unix_time() const { FILETIME fep; SystemTimeToFileTime(&ep, &fep); - // FIXME: dereferencing type-punned pointer will break strict-aliasing rules (GCC warning) + // Type punning through unions (rather than pointer cast) as per: // https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime#remarks - return (*(uint64_t *)&ft - *(uint64_t *)&fep) / 10000000; + ULARGE_INTEGER ft_punning; + ft_punning.LowPart = ft.dwLowDateTime; + ft_punning.HighPart = ft.dwHighDateTime; + + ULARGE_INTEGER fep_punning; + fep_punning.LowPart = fep.dwLowDateTime; + fep_punning.HighPart = fep.dwHighDateTime; + + return (ft_punning.QuadPart - fep_punning.QuadPart) / 10000000; }; uint64_t OS_Windows::get_system_time_secs() const { diff --git a/platform/x11/joypad_linux.cpp b/platform/x11/joypad_linux.cpp index e6328ee14d..4242952374 100644 --- a/platform/x11/joypad_linux.cpp +++ b/platform/x11/joypad_linux.cpp @@ -513,6 +513,8 @@ void JoypadLinux::process_joypads() { break; default: + if (ev.code >= MAX_ABS) + return; if (joy->abs_map[ev.code] != -1 && joy->abs_info[ev.code]) { InputDefault::JoyAxis value = axis_correct(joy->abs_info[ev.code], ev.value); joy->curr_axis[joy->abs_map[ev.code]] = value; diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 9b35648046..0d1e702d04 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -788,6 +788,7 @@ void OS_X11::finalize() { memdelete(camera_server); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); //memdelete(rasterizer); @@ -1265,7 +1266,7 @@ Size2 OS_X11::get_min_window_size() const { void OS_X11::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -1294,7 +1295,7 @@ void OS_X11::set_min_window_size(const Size2 p_size) { void OS_X11::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp index 758bd84114..c33c77e16b 100644 --- a/platform/x11/power_x11.cpp +++ b/platform/x11/power_x11.cpp @@ -268,9 +268,7 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { check_proc_acpi_battery(node.utf8().get_data(), &have_battery, &charging /*, seconds, percent*/); node = dirp->get_next(); } - memdelete(dirp); } - dirp->change_dir(proc_acpi_ac_adapter_path); err = dirp->list_dir_begin(); if (err != OK) { @@ -281,7 +279,6 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { check_proc_acpi_ac_adapter(node.utf8().get_data(), &have_ac); node = dirp->get_next(); } - memdelete(dirp); } if (!have_battery) { @@ -294,6 +291,7 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { this->power_state = OS::POWERSTATE_ON_BATTERY; } + memdelete(dirp); return true; /* definitive answer. */ } diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index c7f622dee3..83cc1eeb46 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "animated_sprite.h" + #include "core/os/os.h" #include "scene/scene_string_names.h" @@ -356,12 +357,11 @@ void AnimatedSprite::_validate_property(PropertyInfo &property) const { } if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; } + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -709,7 +709,7 @@ void AnimatedSprite::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index 6626fccf1c..d7a8005187 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -259,6 +259,7 @@ void Sprite::set_frame(int p_frame) { frame = p_frame; _change_notify("frame"); + _change_notify("frame_coords"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -267,6 +268,17 @@ int Sprite::get_frame() const { return frame; } +void Sprite::set_frame_coords(const Vector2 &p_coord) { + ERR_FAIL_INDEX(int(p_coord.x), vframes); + ERR_FAIL_INDEX(int(p_coord.y), hframes); + + set_frame(int(p_coord.y) * hframes + int(p_coord.x)); +} + +Vector2 Sprite::get_frame_coords() const { + return Vector2(frame % hframes, frame / hframes); +} + void Sprite::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); @@ -371,10 +383,9 @@ Rect2 Sprite::get_rect() const { void Sprite::_validate_property(PropertyInfo &property) const { if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -421,6 +432,9 @@ void Sprite::_bind_methods() { ClassDB::bind_method(D_METHOD("set_frame", "frame"), &Sprite::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &Sprite::get_frame); + ClassDB::bind_method(D_METHOD("set_frame_coords", "coords"), &Sprite::set_frame_coords); + ClassDB::bind_method(D_METHOD("get_frame_coords"), &Sprite::get_frame_coords); + ClassDB::bind_method(D_METHOD("set_vframes", "vframes"), &Sprite::set_vframes); ClassDB::bind_method(D_METHOD("get_vframes"), &Sprite::get_vframes); @@ -442,7 +456,8 @@ void Sprite::_bind_methods() { ADD_GROUP("Animation", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frame_coords", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_frame_coords", "get_frame_coords"); ADD_GROUP("Region", "region_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); diff --git a/scene/2d/sprite.h b/scene/2d/sprite.h index e38db3a299..490db31cdb 100644 --- a/scene/2d/sprite.h +++ b/scene/2d/sprite.h @@ -110,6 +110,9 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_frame_coords(const Vector2 &p_row); + Vector2 get_frame_coords() const; + void set_vframes(int p_amount); int get_vframes() const; diff --git a/scene/3d/collision_object.cpp b/scene/3d/collision_object.cpp index 9d3e2983c4..63301fc226 100644 --- a/scene/3d/collision_object.cpp +++ b/scene/3d/collision_object.cpp @@ -370,7 +370,7 @@ String CollisionObject::get_configuration_warning() const { String warning = Spatial::get_configuration_warning(); if (shapes.empty()) { - if (warning == String()) { + if (!warning.empty()) { warning += "\n\n"; } warning += TTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape or CollisionPolygon as a child to define its shape."); diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index 2c315790ac..fc5523633d 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -564,6 +564,9 @@ void Sprite3D::set_frame(int p_frame) { frame = p_frame; _queue_update(); + + _change_notify("frame"); + _change_notify("frame_coords"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -572,6 +575,17 @@ int Sprite3D::get_frame() const { return frame; } +void Sprite3D::set_frame_coords(const Vector2 &p_coord) { + ERR_FAIL_INDEX(int(p_coord.x), vframes); + ERR_FAIL_INDEX(int(p_coord.y), hframes); + + set_frame(int(p_coord.y) * hframes + int(p_coord.x)); +} + +Vector2 Sprite3D::get_frame_coords() const { + return Vector2(frame % hframes, frame / hframes); +} + void Sprite3D::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); @@ -628,10 +642,9 @@ Rect2 Sprite3D::get_item_rect() const { void Sprite3D::_validate_property(PropertyInfo &property) const { if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -649,6 +662,9 @@ void Sprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_frame", "frame"), &Sprite3D::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &Sprite3D::get_frame); + ClassDB::bind_method(D_METHOD("set_frame_coords", "coords"), &Sprite3D::set_frame_coords); + ClassDB::bind_method(D_METHOD("get_frame_coords"), &Sprite3D::get_frame_coords); + ClassDB::bind_method(D_METHOD("set_vframes", "vframes"), &Sprite3D::set_vframes); ClassDB::bind_method(D_METHOD("get_vframes"), &Sprite3D::get_vframes); @@ -659,7 +675,8 @@ void Sprite3D::_bind_methods() { ADD_GROUP("Animation", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frame_coords", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_frame_coords", "get_frame_coords"); ADD_GROUP("Region", "region_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); ADD_PROPERTY(PropertyInfo(Variant::RECT2, "region_rect"), "set_region_rect", "get_region_rect"); @@ -851,14 +868,11 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &property) const { } if (property.name == "frame") { - property.hint = PROPERTY_HINT_RANGE; - - if (frames->has_animation(animation)) { + if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; - } else { - property.hint_string = "0,0,0"; } + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -1091,7 +1105,7 @@ void AnimatedSprite3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); } diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 0e086ef31e..5ae9b153f9 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -173,6 +173,9 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_frame_coords(const Vector2 &p_row); + Vector2 get_frame_coords() const; + void set_vframes(int p_amount); int get_vframes() const; diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp index 89e96e0227..98e68cfbda 100644 --- a/scene/3d/vehicle_body.cpp +++ b/scene/3d/vehicle_body.cpp @@ -272,6 +272,20 @@ void VehicleWheel::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rpm"), &VehicleWheel::get_rpm); + ClassDB::bind_method(D_METHOD("set_engine_force", "engine_force"), &VehicleWheel::set_engine_force); + ClassDB::bind_method(D_METHOD("get_engine_force"), &VehicleWheel::get_engine_force); + + ClassDB::bind_method(D_METHOD("set_brake", "brake"), &VehicleWheel::set_brake); + ClassDB::bind_method(D_METHOD("get_brake"), &VehicleWheel::get_brake); + + ClassDB::bind_method(D_METHOD("set_steering", "steering"), &VehicleWheel::set_steering); + ClassDB::bind_method(D_METHOD("get_steering"), &VehicleWheel::get_steering); + + ADD_GROUP("Per-Wheel Motion", ""); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "engine_force", PROPERTY_HINT_RANGE, "0.00,1024.0,0.01,or_greater"), "set_engine_force", "get_engine_force"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "brake", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_brake", "get_brake"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "steering", PROPERTY_HINT_RANGE, "-180,180.0,0.01"), "set_steering", "get_steering"); + ADD_GROUP("VehicleBody Motion", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_as_traction"), "set_use_as_traction", "is_used_as_traction"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_as_steering"), "set_use_as_steering", "is_used_as_steering"); ADD_GROUP("Wheel", "wheel_"); @@ -288,6 +302,34 @@ void VehicleWheel::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "damping_relaxation"), "set_damping_relaxation", "get_damping_relaxation"); } +void VehicleWheel::set_engine_force(float p_engine_force) { + + m_engineForce = p_engine_force; +} + +float VehicleWheel::get_engine_force() const { + + return m_engineForce; +} + +void VehicleWheel::set_brake(float p_brake) { + + m_brake = p_brake; +} +float VehicleWheel::get_brake() const { + + return m_brake; +} + +void VehicleWheel::set_steering(float p_steering) { + + m_steering = p_steering; +} +float VehicleWheel::get_steering() const { + + return m_steering; +} + void VehicleWheel::set_use_as_traction(bool p_enable) { engine_traction = p_enable; @@ -374,10 +416,7 @@ void VehicleBody::_update_wheel(int p_idx, PhysicsDirectBodyState *s) { Vector3 fwd = up.cross(right); fwd = fwd.normalized(); - //rotate around steering over de wheelAxleWS - real_t steering = wheel.steers ? m_steeringValue : 0.0; - - Basis steeringMat(up, steering); + Basis steeringMat(up, wheel.m_steering); Basis rotatingMat(right, wheel.m_rotation); @@ -723,12 +762,11 @@ void VehicleBody::_update_friction(PhysicsDirectBodyState *s) { real_t rollingFriction = 0.f; if (wheelInfo.m_raycastInfo.m_isInContact) { - if (engine_force != 0.f && wheelInfo.engine_traction) { - rollingFriction = -engine_force * s->get_step(); + if (wheelInfo.m_engineForce != 0.f) { + rollingFriction = -wheelInfo.m_engineForce * s->get_step(); } else { real_t defaultRollingFrictionImpulse = 0.f; - float cbrake = MAX(wheelInfo.m_brake, brake); - real_t maxImpulse = cbrake ? cbrake : defaultRollingFrictionImpulse; + real_t maxImpulse = wheelInfo.m_brake ? wheelInfo.m_brake : defaultRollingFrictionImpulse; btVehicleWheelContactPoint contactPt(s, wheelInfo.m_raycastInfo.m_groundObject, wheelInfo.m_raycastInfo.m_contactPointWS, m_forwardWS[wheel], maxImpulse); rollingFriction = _calc_rolling_friction(contactPt); } @@ -886,6 +924,11 @@ void VehicleBody::_direct_state_changed(Object *p_state) { void VehicleBody::set_engine_force(float p_engine_force) { engine_force = p_engine_force; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + if (wheelInfo.engine_traction) + wheelInfo.m_engineForce = p_engine_force; + } } float VehicleBody::get_engine_force() const { @@ -896,6 +939,10 @@ float VehicleBody::get_engine_force() const { void VehicleBody::set_brake(float p_brake) { brake = p_brake; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + wheelInfo.m_brake = p_brake; + } } float VehicleBody::get_brake() const { @@ -905,6 +952,11 @@ float VehicleBody::get_brake() const { void VehicleBody::set_steering(float p_steering) { m_steeringValue = p_steering; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + if (wheelInfo.steers) + wheelInfo.m_steering = p_steering; + } } float VehicleBody::get_steering() const { diff --git a/scene/3d/vehicle_body.h b/scene/3d/vehicle_body.h index 9e3fe72282..914bfd54bd 100644 --- a/scene/3d/vehicle_body.h +++ b/scene/3d/vehicle_body.h @@ -70,7 +70,7 @@ class VehicleWheel : public Spatial { real_t m_deltaRotation; real_t m_rpm; real_t m_rollInfluence; - //real_t m_engineForce; + real_t m_engineForce; real_t m_brake; real_t m_clippedInvContactDotSuspension; @@ -137,6 +137,15 @@ public: float get_rpm() const; + void set_engine_force(float p_engine_force); + float get_engine_force() const; + + void set_brake(float p_brake); + float get_brake() const; + + void set_steering(float p_steering); + float get_steering() const; + String get_configuration_warning() const; VehicleWheel(); diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 26be17f6c1..5ec6c68163 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -289,7 +289,7 @@ void Control::_update_minimum_size() { Size2 minsize = get_combined_minimum_size(); if (minsize.x > data.size_cache.x || minsize.y > data.size_cache.y) { - set_size(data.size_cache); + _size_changed(); } data.updating_last_minimum_size = false; @@ -850,6 +850,12 @@ Ref<Texture> Control::get_icon(const StringName &p_name, const StringName &p_typ theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_icon(p_name, type)) { + return Theme::get_project_default()->get_icon(p_name, type); + } + } + return Theme::get_default()->get_icon(p_name, type); } @@ -886,6 +892,12 @@ Ref<Shader> Control::get_shader(const StringName &p_name, const StringName &p_ty theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_shader(p_name, type)) { + return Theme::get_project_default()->get_shader(p_name, type); + } + } + return Theme::get_default()->get_shader(p_name, type); } @@ -925,6 +937,9 @@ Ref<StyleBox> Control::get_stylebox(const StringName &p_name, const StringName & } while (class_name != StringName()) { + if (Theme::get_project_default().is_valid() && Theme::get_project_default()->has_stylebox(p_name, type)) + return Theme::get_project_default()->get_stylebox(p_name, type); + if (Theme::get_default()->has_stylebox(p_name, class_name)) return Theme::get_default()->get_stylebox(p_name, class_name); @@ -1001,6 +1016,11 @@ Color Control::get_color(const StringName &p_name, const StringName &p_type) con theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return Theme::get_project_default()->get_color(p_name, type); + } + } return Theme::get_default()->get_color(p_name, type); } @@ -1036,6 +1056,11 @@ int Control::get_constant(const StringName &p_name, const StringName &p_type) co theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_constant(p_name, type)) { + return Theme::get_project_default()->get_constant(p_name, type); + } + } return Theme::get_default()->get_constant(p_name, type); } @@ -1106,6 +1131,11 @@ bool Control::has_icon(const StringName &p_name, const StringName &p_type) const theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return true; + } + } return Theme::get_default()->has_icon(p_name, type); } @@ -1140,6 +1170,11 @@ bool Control::has_shader(const StringName &p_name, const StringName &p_type) con theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_shader(p_name, type)) { + return true; + } + } return Theme::get_default()->has_shader(p_name, type); } bool Control::has_stylebox(const StringName &p_name, const StringName &p_type) const { @@ -1173,6 +1208,11 @@ bool Control::has_stylebox(const StringName &p_name, const StringName &p_type) c theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_stylebox(p_name, type)) { + return true; + } + } return Theme::get_default()->has_stylebox(p_name, type); } bool Control::has_font(const StringName &p_name, const StringName &p_type) const { @@ -1206,6 +1246,11 @@ bool Control::has_font(const StringName &p_name, const StringName &p_type) const theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_font(p_name, type)) { + return true; + } + } return Theme::get_default()->has_font(p_name, type); } @@ -1240,6 +1285,11 @@ bool Control::has_color(const StringName &p_name, const StringName &p_type) cons theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return true; + } + } return Theme::get_default()->has_color(p_name, type); } @@ -1274,6 +1324,11 @@ bool Control::has_constant(const StringName &p_name, const StringName &p_type) c theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_constant(p_name, type)) { + return true; + } + } return Theme::get_default()->has_constant(p_name, type); } diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 04fb991f78..f1bdbb5ff5 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -403,11 +403,10 @@ void FileDialog::update_file_list() { List<String> files; List<String> dirs; - bool is_dir; bool is_hidden; String item; - while ((item = dir_access->get_next(&is_dir)) != "") { + while ((item = dir_access->get_next()) != "") { if (item == "." || item == "..") continue; @@ -415,7 +414,7 @@ void FileDialog::update_file_list() { is_hidden = dir_access->current_is_hidden(); if (show_hidden_files || !is_hidden) { - if (!is_dir) + if (!dir_access->current_is_dir()) files.push_back(item); else dirs.push_back(item); @@ -880,14 +879,14 @@ FileDialog::FileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); - refresh->set_tooltip(RTR("Refresh")); + refresh->set_tooltip(RTR("Refresh files.")); refresh->connect("pressed", this, "_update_file_list"); hbc->add_child(refresh); show_hidden = memnew(ToolButton); show_hidden->set_toggle_mode(true); show_hidden->set_pressed(is_showing_hidden_files()); - show_hidden->set_tooltip(RTR("Toggle Hidden Files")); + show_hidden->set_tooltip(RTR("Toggle the visibility of hidden files.")); show_hidden->connect("toggled", this, "set_show_hidden_files"); hbc->add_child(show_hidden); diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 58671655dc..d1840e43a3 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -43,40 +43,42 @@ Size2 OptionButton::get_minimum_size() const { void OptionButton::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - - if (!has_icon("arrow")) - return; - - RID ci = get_canvas_item(); - Ref<Texture> arrow = Control::get_icon("arrow"); - Ref<StyleBox> normal = get_stylebox("normal"); - Color clr = Color(1, 1, 1); - if (get_constant("modulate_arrow")) { - switch (get_draw_mode()) { - case DRAW_PRESSED: - clr = get_color("font_color_pressed"); - break; - case DRAW_HOVER: - clr = get_color("font_color_hover"); - break; - case DRAW_DISABLED: - clr = get_color("font_color_disabled"); - break; - default: - clr = get_color("font_color"); + switch (p_what) { + case NOTIFICATION_DRAW: { + + if (!has_icon("arrow")) + return; + + RID ci = get_canvas_item(); + Ref<Texture> arrow = Control::get_icon("arrow"); + Color clr = Color(1, 1, 1); + if (get_constant("modulate_arrow")) { + switch (get_draw_mode()) { + case DRAW_PRESSED: + clr = get_color("font_color_pressed"); + break; + case DRAW_HOVER: + clr = get_color("font_color_hover"); + break; + case DRAW_DISABLED: + clr = get_color("font_color_disabled"); + break; + default: + clr = get_color("font_color"); + } } - } - Size2 size = get_size(); + Size2 size = get_size(); - Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2))); - arrow->draw(ci, ofs, clr); - } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2))); + arrow->draw(ci, ofs, clr); + } break; + case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible_in_tree()) { - popup->hide(); - } + if (!is_visible_in_tree()) { + popup->hide(); + } + } break; } } diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 279253889c..db277d3705 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -40,7 +40,7 @@ Size2 SpinBox::get_minimum_size() const { void SpinBox::_value_changed(double) { - String value = String::num(get_value(), Math::step_decimals(get_step())); + String value = String::num(get_value(), Math::range_step_decimals(get_step())); if (prefix != "") value = prefix + " " + value; if (suffix != "") diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 39c76e6646..be8f1cf36e 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -303,7 +303,7 @@ void TabContainer::_notification(int p_what) { // Draw the tab contents. Control *control = Object::cast_to<Control>(tabs[i + first_tab_cache]); - String text = control->has_meta("_tab_name") ? String(tr(String(control->get_meta("_tab_name")))) : String(control->get_name()); + String text = control->has_meta("_tab_name") ? String(tr(String(control->get_meta("_tab_name")))) : String(tr(control->get_name())); int x_content = tab_rect.position.x + tab_style->get_margin(MARGIN_LEFT); int top_margin = tab_style->get_margin(MARGIN_TOP); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 814100afdc..81f2f46a80 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -1315,7 +1315,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Ref<Texture> updown = cache.updown; - String valtext = String::num(p_item->cells[i].val, Math::step_decimals(p_item->cells[i].step)); + String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step)); //String valtext = rtos( p_item->cells[i].val ); if (p_item->cells[i].suffix != String()) @@ -1926,7 +1926,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } else { - editor_text = String::num(p_item->cells[col].val, Math::step_decimals(p_item->cells[col].step)); + editor_text = String::num(p_item->cells[col].val, Math::range_step_decimals(p_item->cells[col].step)); if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) bring_up_editor = false; } @@ -2755,7 +2755,7 @@ bool Tree::edit_selected() { text_editor->set_position(textedpos); text_editor->set_size(rect.size); text_editor->clear(); - text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::step_decimals(c.step))); + text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::range_step_decimals(c.step))); text_editor->select_all(); if (c.mode == TreeItem::CELL_MODE_RANGE) { diff --git a/scene/main/instance_placeholder.cpp b/scene/main/instance_placeholder.cpp index 71addd6fea..99ecc8bc37 100644 --- a/scene/main/instance_placeholder.cpp +++ b/scene/main/instance_placeholder.cpp @@ -92,6 +92,8 @@ Node *InstancePlaceholder::create_instance(bool p_replace, const Ref<PackedScene if (!ps.is_valid()) return NULL; Node *scene = ps->instance(); + if (!scene) + return NULL; scene->set_name(get_name()); int pos = get_position_in_parent(); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 2badf19f2b..dbf3150ae0 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -1507,8 +1507,11 @@ void SceneTree::_live_edit_instance_node_func(const NodePath &p_parent, const St Node *n2 = n->get_node(p_parent); Node *no = ps->instance(); - no->set_name(p_name); + if (!no) { + continue; + } + no->set_name(p_name); n2->add_child(no); } } diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 2533d91156..974c9771e0 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -607,6 +607,7 @@ void register_scene_types() { ClassDB::register_class<PrismMesh>(); ClassDB::register_class<QuadMesh>(); ClassDB::register_class<SphereMesh>(); + ClassDB::register_class<PointMesh>(); ClassDB::register_virtual_class<Material>(); ClassDB::register_class<SpatialMaterial>(); SceneTree::add_idle_callback(SpatialMaterial::flush_changes); @@ -751,7 +752,7 @@ void register_scene_types() { if (theme_path != String()) { Ref<Theme> theme = ResourceLoader::load(theme_path); if (theme.is_valid()) { - Theme::set_default(theme); + Theme::set_project_default(theme); if (font.is_valid()) { Theme::set_default_font(font); } diff --git a/scene/resources/default_theme/make_header.py b/scene/resources/default_theme/make_header.py index bd5a723b23..cf0ccf1c3a 100755 --- a/scene/resources/default_theme/make_header.py +++ b/scene/resources/default_theme/make_header.py @@ -1,9 +1,14 @@ #!/usr/bin/env python import glob +import os enc = "utf-8" +# Change to the directory where the script is located, +# so that the script can be run from any location +os.chdir(os.path.dirname(os.path.realpath(__file__))) + # Generate include files f = open("theme_data.h", "wb") diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index 74a493d3b5..24fdaafbe1 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -1572,3 +1572,19 @@ SphereMesh::SphereMesh() { rings = 32; is_hemisphere = false; } + +/** + PointMesh +*/ + +void PointMesh::_create_mesh_array(Array &p_arr) const { + PoolVector<Vector3> faces; + faces.resize(1); + faces.set(0, Vector3(0.0, 0.0, 0.0)); + + p_arr[VS::ARRAY_VERTEX] = faces; +} + +PointMesh::PointMesh() { + primitive_type = PRIMITIVE_POINTS; +} diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 312899c028..fad49f9642 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -322,4 +322,19 @@ public: SphereMesh(); }; +/** + A single point for use in particle systems +*/ + +class PointMesh : public PrimitiveMesh { + + GDCLASS(PointMesh, PrimitiveMesh) + +protected: + virtual void _create_mesh_array(Array &p_arr) const; + +public: + PointMesh(); +}; + #endif diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp index 69258bc834..ae18be1695 100644 --- a/scene/resources/theme.cpp +++ b/scene/resources/theme.cpp @@ -32,8 +32,6 @@ #include "core/os/file_access.h" #include "core/print_string.h" -Ref<Theme> Theme::default_theme; - void Theme::_emit_theme_changed() { emit_changed(); @@ -186,11 +184,6 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { } } -Ref<Theme> Theme::get_default() { - - return default_theme; -} - void Theme::set_default_theme_font(const Ref<Font> &p_default_font) { if (default_theme_font == p_default_font) @@ -215,14 +208,31 @@ Ref<Font> Theme::get_default_theme_font() const { return default_theme_font; } +Ref<Theme> Theme::project_default_theme; +Ref<Theme> Theme::default_theme; +Ref<Texture> Theme::default_icon; +Ref<StyleBox> Theme::default_style; +Ref<Font> Theme::default_font; + +Ref<Theme> Theme::get_default() { + + return default_theme; +} + void Theme::set_default(const Ref<Theme> &p_default) { default_theme = p_default; } -Ref<Texture> Theme::default_icon; -Ref<StyleBox> Theme::default_style; -Ref<Font> Theme::default_font; +Ref<Theme> Theme::get_project_default() { + + return project_default_theme; +} + +void Theme::set_project_default(const Ref<Theme> &p_project_default) { + + project_default_theme = p_project_default; +} void Theme::set_default_icon(const Ref<Texture> &p_icon) { diff --git a/scene/resources/theme.h b/scene/resources/theme.h index fb59073cbe..4c4f9b5aba 100644 --- a/scene/resources/theme.h +++ b/scene/resources/theme.h @@ -46,7 +46,6 @@ class Theme : public Resource { GDCLASS(Theme, Resource); RES_BASE_EXTENSION("theme"); - static Ref<Theme> default_theme; void _emit_theme_changed(); HashMap<StringName, HashMap<StringName, Ref<Texture> > > icon_map; @@ -61,6 +60,8 @@ protected: bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List<PropertyInfo> *p_list) const; + static Ref<Theme> project_default_theme; + static Ref<Theme> default_theme; static Ref<Texture> default_icon; static Ref<StyleBox> default_style; static Ref<Font> default_font; @@ -137,6 +138,9 @@ public: static Ref<Theme> get_default(); static void set_default(const Ref<Theme> &p_default); + static Ref<Theme> get_project_default(); + static void set_project_default(const Ref<Theme> &p_default); + static void set_default_icon(const Ref<Texture> &p_icon); static void set_default_style(const Ref<StyleBox> &p_style); static void set_default_font(const Ref<Font> &p_font); diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h index cafc7a0f00..4585e7fdcc 100644 --- a/scene/resources/visual_shader_nodes.h +++ b/scene/resources/visual_shader_nodes.h @@ -1624,13 +1624,13 @@ public: virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty - void set_comparsion_type(ComparsionType p_func); + void set_comparsion_type(ComparsionType p_type); ComparsionType get_comparsion_type() const; void set_function(Function p_func); Function get_function() const; - void set_condition(Condition p_mode); + void set_condition(Condition p_cond); Condition get_condition() const; virtual Vector<StringName> get_editable_properties() const; diff --git a/servers/audio/effects/audio_effect_pitch_shift.cpp b/servers/audio/effects/audio_effect_pitch_shift.cpp index c250f2e2bd..ec3182685f 100644 --- a/servers/audio/effects/audio_effect_pitch_shift.cpp +++ b/servers/audio/effects/audio_effect_pitch_shift.cpp @@ -70,7 +70,7 @@ * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice and this license appear in all source copies. * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF -* ANY KIND. See http://www.dspguru.com/wol.htm for more information. +* ANY KIND. See https://dspguru.com/wide-open-license/ for more information. * *****************************************************************************/ diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp index a13fa65009..d0f8fd8aff 100644 --- a/servers/physics/collision_solver_sat.cpp +++ b/servers/physics/collision_solver_sat.cpp @@ -274,8 +274,8 @@ static void _generate_contacts_from_supports(const Vector3 *p_points_A, int p_po points_B = p_points_B; } - int version_A = (pointcount_A > 3 ? 3 : pointcount_A) - 1; - int version_B = (pointcount_B > 3 ? 3 : pointcount_B) - 1; + int version_A = (pointcount_A > 2 ? 2 : pointcount_A) - 1; + int version_B = (pointcount_B > 2 ? 2 : pointcount_B) - 1; GenerateContactsFunc contacts_func = generate_contacts_func_table[version_A][version_B]; ERR_FAIL_COND(!contacts_func); diff --git a/servers/physics/collision_solver_sw.cpp b/servers/physics/collision_solver_sw.cpp index 0d10dae8cc..d970dd39fb 100644 --- a/servers/physics/collision_solver_sw.cpp +++ b/servers/physics/collision_solver_sw.cpp @@ -233,8 +233,6 @@ bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A, const Transform & return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false, r_sep_axis, p_margin_A, p_margin_B); } - - return false; } void CollisionSolverSW::concave_distance_callback(void *p_userdata, ShapeSW *p_convex) { @@ -371,6 +369,4 @@ bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A, const Transform return gjk_epa_calculate_distance(p_shape_A, p_transform_A, p_shape_B, p_transform_B, r_point_A, r_point_B); //should pass sepaxis.. } - - return false; } diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp index 1d1b30286e..209cddda5e 100644 --- a/servers/physics/joints/hinge_joint_sw.cpp +++ b/servers/physics/joints/hinge_joint_sw.cpp @@ -198,7 +198,6 @@ bool HingeJointSW::setup(real_t p_step) { plane_space(m_rbAFrame.basis.get_axis(2), jointAxis0local, jointAxis1local); - A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2)); Vector3 jointAxis0 = A->get_transform().basis.xform(jointAxis0local); Vector3 jointAxis1 = A->get_transform().basis.xform(jointAxis1local); Vector3 hingeAxisWorld = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2)); diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp index 60bbcef4b6..5dff655ea1 100644 --- a/servers/physics_2d/body_2d_sw.cpp +++ b/servers/physics_2d/body_2d_sw.cpp @@ -185,28 +185,28 @@ real_t Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const { case Physics2DServer::BODY_PARAM_BOUNCE: { return bounce; - } break; + } case Physics2DServer::BODY_PARAM_FRICTION: { return friction; - } break; + } case Physics2DServer::BODY_PARAM_MASS: { return mass; - } break; + } case Physics2DServer::BODY_PARAM_INERTIA: { return _inv_inertia == 0 ? 0 : 1.0 / _inv_inertia; - } break; + } case Physics2DServer::BODY_PARAM_GRAVITY_SCALE: { return gravity_scale; - } break; + } case Physics2DServer::BODY_PARAM_LINEAR_DAMP: { return linear_damp; - } break; + } case Physics2DServer::BODY_PARAM_ANGULAR_DAMP: { return angular_damp; - } break; + } default: { } } @@ -343,19 +343,19 @@ Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const { switch (p_state) { case Physics2DServer::BODY_STATE_TRANSFORM: { return get_transform(); - } break; + } case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { return linear_velocity; - } break; + } case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { return angular_velocity; - } break; + } case Physics2DServer::BODY_STATE_SLEEPING: { return !is_active(); - } break; + } case Physics2DServer::BODY_STATE_CAN_SLEEP: { return can_sleep; - } break; + } } return Variant(); diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.cpp b/servers/physics_2d/broad_phase_2d_hash_grid.cpp index 1bbb50c974..6dd19c2868 100644 --- a/servers/physics_2d/broad_phase_2d_hash_grid.cpp +++ b/servers/physics_2d/broad_phase_2d_hash_grid.cpp @@ -673,7 +673,7 @@ public IEnumerable<Point3D> GetCellsOnRay(Ray ray, int maxDepth) // "A Fast Voxel Traversal Algorithm for Ray Tracing" // John Amanatides, Andrew Woo // http://www.cse.yorku.ca/~amana/research/grid.pdf - // http://www.devmaster.net/articles/raytracing_series/A%20faster%20voxel%20traversal%20algorithm%20for%20ray%20tracing.pdf + // https://web.archive.org/web/20100616193049/http://www.devmaster.net/articles/raytracing_series/A%20faster%20voxel%20traversal%20algorithm%20for%20ray%20tracing.pdf // NOTES: // * This code assumes that the ray's position and direction are in 'cell coordinates', which means diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index 9d75f71ff0..19e4b8c1d9 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -172,8 +172,8 @@ static void _generate_contacts_from_supports(const Vector2 *p_points_A, int p_po points_B = p_points_B; } - int version_A = (pointcount_A > 3 ? 3 : pointcount_A) - 1; - int version_B = (pointcount_B > 3 ? 3 : pointcount_B) - 1; + int version_A = (pointcount_A > 2 ? 2 : pointcount_A) - 1; + int version_B = (pointcount_B > 2 ? 2 : pointcount_B) - 1; GenerateContactsFunc contacts_func = generate_contacts_func_table[version_A][version_B]; ERR_FAIL_COND(!contacts_func); diff --git a/servers/physics_2d/collision_solver_2d_sw.cpp b/servers/physics_2d/collision_solver_2d_sw.cpp index e49961c048..03c0fd5981 100644 --- a/servers/physics_2d/collision_solver_2d_sw.cpp +++ b/servers/physics_2d/collision_solver_2d_sw.cpp @@ -249,6 +249,4 @@ bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A, const Transform2D &p return collision_solver(p_shape_A, p_transform_A, p_motion_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, sep_axis, margin_A, margin_B); } - - return false; } diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp index 71c00c0abf..c698290fd9 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp +++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp @@ -54,8 +54,6 @@ void Physics2DServerWrapMT::thread_loop() { server_thread = Thread::get_caller_id(); - OS::get_singleton()->make_rendering_thread(); - physics_2d_server->init(); exit = false; diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index 14fefbf195..25973aa295 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -967,7 +967,7 @@ bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map<String bool ShaderLanguage::_validate_operator(OperatorNode *p_op, DataType *r_ret_type) { bool valid = false; - DataType ret_type; + DataType ret_type = TYPE_VOID; switch (p_op->op) { case OP_EQUAL: @@ -3059,7 +3059,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons String ident = identifier; bool ok = true; - DataType member_type; + DataType member_type = TYPE_VOID; switch (dt) { case TYPE_BVEC2: case TYPE_IVEC2: diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index c6468694fd..25e18d0623 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -1118,7 +1118,7 @@ void VisualServer::mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_prim } offsets[i] = elem_size; continue; - } break; + } default: { ERR_FAIL(); } @@ -1286,7 +1286,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format, PoolVector<uint8_ } offsets[i] = elem_size; continue; - } break; + } default: { ERR_FAIL_V(Array()); } diff --git a/thirdparty/README.md b/thirdparty/README.md index 81e30c3f6b..99f917dbc1 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -4,7 +4,7 @@ ## assimp - Upstream: http://github.com/assimp/assimp -- Version: git (d3d98a7ec0c8d38e1952b46dfe53f7e9233dc92d) +- Version: git (1d565b0aab5a2ee00462f18c5b8a81f6a5454a48) - License: BSD-3-Clause diff --git a/thirdparty/assimp/assimp/config.h b/thirdparty/assimp/assimp/config.h index 8b0634d28b..382a698268 100644 --- a/thirdparty/assimp/assimp/config.h +++ b/thirdparty/assimp/assimp/config.h @@ -647,6 +647,21 @@ enum aiComponent { "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall not remove empty bones. + * + * + * Empty bone are often used to define connections for other models. + */ +#define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ + "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + +// --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall convert the unit from cm to m. + */ +#define AI_CONFIG_FBX_CONVERT_TO_M \ + "AI_CONFIG_FBX_CONVERT_TO_M" + +// --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * * ASSIMP does not support vertex keyframes (only bone animation is supported). @@ -978,3 +993,4 @@ enum aiComponent { /* #cmakedefine ASSIMP_DOUBLE_PRECISION 1 */ #endif // !! AI_CONFIG_H_INC + diff --git a/thirdparty/assimp/code/CApi/AssimpCExport.cpp b/thirdparty/assimp/code/CApi/AssimpCExport.cpp new file mode 100644 index 0000000000..7557edcfc6 --- /dev/null +++ b/thirdparty/assimp/code/CApi/AssimpCExport.cpp @@ -0,0 +1,156 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file AssimpCExport.cpp +Assimp C export interface. See Exporter.cpp for some notes. +*/ + +#ifndef ASSIMP_BUILD_NO_EXPORT + +#include "CInterfaceIOWrapper.h" +#include <assimp/SceneCombiner.h> +#include "Common/ScenePrivate.h" +#include <assimp/Exporter.hpp> + +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API size_t aiGetExportFormatCount(void) +{ + return Exporter().GetExportFormatCount(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiExportFormatDesc* aiGetExportFormatDescription( size_t index) +{ + // Note: this is valid as the index always pertains to a built-in exporter, + // for which the returned structure is guaranteed to be of static storage duration. + Exporter exporter; + const aiExportFormatDesc* orig( exporter.GetExportFormatDescription( index ) ); + if (NULL == orig) { + return NULL; + } + + aiExportFormatDesc *desc = new aiExportFormatDesc; + desc->description = new char[ strlen( orig->description ) + 1 ](); + ::strncpy( (char*) desc->description, orig->description, strlen( orig->description ) ); + desc->fileExtension = new char[ strlen( orig->fileExtension ) + 1 ](); + ::strncpy( ( char* ) desc->fileExtension, orig->fileExtension, strlen( orig->fileExtension ) ); + desc->id = new char[ strlen( orig->id ) + 1 ](); + ::strncpy( ( char* ) desc->id, orig->id, strlen( orig->id ) ); + + return desc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiReleaseExportFormatDescription( const aiExportFormatDesc *desc ) { + if (NULL == desc) { + return; + } + + delete [] desc->description; + delete [] desc->fileExtension; + delete [] desc->id; + delete desc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiCopyScene(const aiScene* pIn, aiScene** pOut) +{ + if (!pOut || !pIn) { + return; + } + + SceneCombiner::CopyScene(pOut,pIn,true); + ScenePriv(*pOut)->mIsCopy = true; +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiFreeScene(const C_STRUCT aiScene* pIn) +{ + // note: aiReleaseImport() is also able to delete scene copies, but in addition + // it also handles scenes with import metadata. + delete pIn; +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiExportScene( const aiScene* pScene, const char* pFormatId, const char* pFileName, unsigned int pPreprocessing ) +{ + return ::aiExportSceneEx(pScene,pFormatId,pFileName,NULL,pPreprocessing); +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiExportSceneEx( const aiScene* pScene, const char* pFormatId, const char* pFileName, aiFileIO* pIO, unsigned int pPreprocessing ) +{ + Exporter exp; + + if (pIO) { + exp.SetIOHandler(new CIOSystemWrapper(pIO)); + } + return exp.Export(pScene,pFormatId,pFileName,pPreprocessing); +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const C_STRUCT aiExportDataBlob* aiExportSceneToBlob( const aiScene* pScene, const char* pFormatId, unsigned int pPreprocessing ) +{ + Exporter exp; + if (!exp.ExportToBlob(pScene,pFormatId,pPreprocessing)) { + return NULL; + } + const aiExportDataBlob* blob = exp.GetOrphanedBlob(); + ai_assert(blob); + + return blob; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API C_STRUCT void aiReleaseExportBlob( const aiExportDataBlob* pData ) +{ + delete pData; +} + +#endif // !ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/CInterfaceIOWrapper.cpp b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.cpp index 5a3a49565a..5a3a49565a 100644 --- a/thirdparty/assimp/code/CInterfaceIOWrapper.cpp +++ b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.cpp diff --git a/thirdparty/assimp/code/CInterfaceIOWrapper.h b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.h index 2162320302..2162320302 100644 --- a/thirdparty/assimp/code/CInterfaceIOWrapper.h +++ b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.h diff --git a/thirdparty/assimp/code/Common/Assimp.cpp b/thirdparty/assimp/code/Common/Assimp.cpp new file mode 100644 index 0000000000..178b2c01d0 --- /dev/null +++ b/thirdparty/assimp/code/Common/Assimp.cpp @@ -0,0 +1,695 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +/** @file Assimp.cpp + * @brief Implementation of the Plain-C API + */ + +#include <assimp/cimport.h> +#include <assimp/LogStream.hpp> +#include <assimp/DefaultLogger.hpp> +#include <assimp/Importer.hpp> +#include <assimp/importerdesc.h> +#include <assimp/scene.h> +#include <assimp/GenericProperty.h> +#include <assimp/Exceptional.h> +#include <assimp/BaseImporter.h> + +#include "CApi/CInterfaceIOWrapper.h" +#include "Importer.h" +#include "ScenePrivate.h" + +#include <list> + +// ------------------------------------------------------------------------------------------------ +#ifndef ASSIMP_BUILD_SINGLETHREADED +# include <thread> +# include <mutex> +#endif +// ------------------------------------------------------------------------------------------------ +using namespace Assimp; + +namespace Assimp { + // underlying structure for aiPropertyStore + typedef BatchLoader::PropertyMap PropertyMap; + + /** Stores the LogStream objects for all active C log streams */ + struct mpred { + bool operator () (const aiLogStream& s0, const aiLogStream& s1) const { + return s0.callback<s1.callback&&s0.user<s1.user; + } + }; + typedef std::map<aiLogStream, Assimp::LogStream*, mpred> LogStreamMap; + + /** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ + typedef std::list<Assimp::LogStream*> PredefLogStreamMap; + + /** Local storage of all active log streams */ + static LogStreamMap gActiveLogStreams; + + /** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ + static PredefLogStreamMap gPredefinedStreams; + + /** Error message of the last failed import process */ + static std::string gLastErrorString; + + /** Verbose logging active or not? */ + static aiBool gVerboseLogging = false; + + /** will return all registered importers. */ + void GetImporterInstanceList(std::vector< BaseImporter* >& out); + + /** will delete all registered importers. */ + void DeleteImporterInstanceList(std::vector< BaseImporter* >& out); +} // namespace assimp + + +#ifndef ASSIMP_BUILD_SINGLETHREADED +/** Global mutex to manage the access to the log-stream map */ +static std::mutex gLogStreamMutex; +#endif + +// ------------------------------------------------------------------------------------------------ +// Custom LogStream implementation for the C-API +class LogToCallbackRedirector : public LogStream { +public: + explicit LogToCallbackRedirector(const aiLogStream& s) + : stream (s) { + ai_assert(NULL != s.callback); + } + + ~LogToCallbackRedirector() { +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + // (HACK) Check whether the 'stream.user' pointer points to a + // custom LogStream allocated by #aiGetPredefinedLogStream. + // In this case, we need to delete it, too. Of course, this + // might cause strange problems, but the chance is quite low. + + PredefLogStreamMap::iterator it = std::find(gPredefinedStreams.begin(), + gPredefinedStreams.end(), (Assimp::LogStream*)stream.user); + + if (it != gPredefinedStreams.end()) { + delete *it; + gPredefinedStreams.erase(it); + } + } + + /** @copydoc LogStream::write */ + void write(const char* message) { + stream.callback(message,stream.user); + } + +private: + aiLogStream stream; +}; + +// ------------------------------------------------------------------------------------------------ +void ReportSceneNotFoundError() { + ASSIMP_LOG_ERROR("Unable to find the Assimp::Importer for this aiScene. " + "The C-API does not accept scenes produced by the C++ API and vice versa"); + + ai_assert(false); +} + +// ------------------------------------------------------------------------------------------------ +// Reads the given file and returns its content. +const aiScene* aiImportFile( const char* pFile, unsigned int pFlags) { + return aiImportFileEx(pFile,pFlags,NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileEx( const char* pFile, unsigned int pFlags, aiFileIO* pFS) { + return aiImportFileExWithProperties(pFile, pFlags, pFS, NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileExWithProperties( const char* pFile, unsigned int pFlags, + aiFileIO* pFS, const aiPropertyStore* props) { + ai_assert(NULL != pFile); + + const aiScene* scene = NULL; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // create an Importer for this file + Assimp::Importer* imp = new Assimp::Importer(); + + // copy properties + if(props) { + const PropertyMap* pp = reinterpret_cast<const PropertyMap*>(props); + ImporterPimpl* pimpl = imp->Pimpl(); + pimpl->mIntProperties = pp->ints; + pimpl->mFloatProperties = pp->floats; + pimpl->mStringProperties = pp->strings; + pimpl->mMatrixProperties = pp->matrices; + } + // setup a custom IO system if necessary + if (pFS) { + imp->SetIOHandler( new CIOSystemWrapper (pFS) ); + } + + // and have it read the file + scene = imp->ReadFile( pFile, pFlags); + + // if succeeded, store the importer in the scene and keep it alive + if( scene) { + ScenePrivateData* priv = const_cast<ScenePrivateData*>( ScenePriv(scene) ); + priv->mOrigImporter = imp; + } else { + // if failed, extract error code and destroy the import + gLastErrorString = imp->GetErrorString(); + delete imp; + } + + // return imported data. If the import failed the pointer is NULL anyways + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + + return scene; +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileFromMemory( + const char* pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char* pHint) +{ + return aiImportFileFromMemoryWithProperties(pBuffer, pLength, pFlags, pHint, NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileFromMemoryWithProperties( + const char* pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char* pHint, + const aiPropertyStore* props) +{ + ai_assert( NULL != pBuffer ); + ai_assert( 0 != pLength ); + + const aiScene* scene = NULL; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // create an Importer for this file + Assimp::Importer* imp = new Assimp::Importer(); + + // copy properties + if(props) { + const PropertyMap* pp = reinterpret_cast<const PropertyMap*>(props); + ImporterPimpl* pimpl = imp->Pimpl(); + pimpl->mIntProperties = pp->ints; + pimpl->mFloatProperties = pp->floats; + pimpl->mStringProperties = pp->strings; + pimpl->mMatrixProperties = pp->matrices; + } + + // and have it read the file from the memory buffer + scene = imp->ReadFileFromMemory( pBuffer, pLength, pFlags,pHint); + + // if succeeded, store the importer in the scene and keep it alive + if( scene) { + ScenePrivateData* priv = const_cast<ScenePrivateData*>( ScenePriv(scene) ); + priv->mOrigImporter = imp; + } + else { + // if failed, extract error code and destroy the import + gLastErrorString = imp->GetErrorString(); + delete imp; + } + // return imported data. If the import failed the pointer is NULL anyways + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + return scene; +} + +// ------------------------------------------------------------------------------------------------ +// Releases all resources associated with the given import process. +void aiReleaseImport( const aiScene* pScene) +{ + if (!pScene) { + return; + } + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pScene); + if( !priv || !priv->mOrigImporter) { + delete pScene; + } + else { + // deleting the Importer also deletes the scene + // Note: the reason that this is not written as 'delete priv->mOrigImporter' + // is a suspected bug in gcc 4.4+ (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52339) + Importer* importer = priv->mOrigImporter; + delete importer; + } + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiScene* aiApplyPostProcessing(const aiScene* pScene, + unsigned int pFlags) +{ + const aiScene* sc = NULL; + + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pScene); + if( !priv || !priv->mOrigImporter) { + ReportSceneNotFoundError(); + return NULL; + } + + sc = priv->mOrigImporter->ApplyPostProcessing(pFlags); + + if (!sc) { + aiReleaseImport(pScene); + return NULL; + } + + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + return sc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiScene *aiApplyCustomizedPostProcessing( const aiScene *scene, + BaseProcess* process, + bool requestValidation ) { + const aiScene* sc( NULL ); + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv( scene ); + if ( NULL == priv || NULL == priv->mOrigImporter ) { + ReportSceneNotFoundError(); + return NULL; + } + + sc = priv->mOrigImporter->ApplyCustomizedPostProcessing( process, requestValidation ); + + if ( !sc ) { + aiReleaseImport( scene ); + return NULL; + } + + ASSIMP_END_EXCEPTION_REGION( const aiScene* ); + + return sc; +} + +// ------------------------------------------------------------------------------------------------ +void CallbackToLogRedirector (const char* msg, char* dt) +{ + ai_assert( NULL != msg ); + ai_assert( NULL != dt ); + LogStream* s = (LogStream*)dt; + + s->write(msg); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiLogStream aiGetPredefinedLogStream(aiDefaultLogStream pStream,const char* file) +{ + aiLogStream sout; + + ASSIMP_BEGIN_EXCEPTION_REGION(); + LogStream* stream = LogStream::createDefaultStream(pStream,file); + if (!stream) { + sout.callback = NULL; + sout.user = NULL; + } + else { + sout.callback = &CallbackToLogRedirector; + sout.user = (char*)stream; + } + gPredefinedStreams.push_back(stream); + ASSIMP_END_EXCEPTION_REGION(aiLogStream); + return sout; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiAttachLogStream( const aiLogStream* stream ) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + + LogStream* lg = new LogToCallbackRedirector(*stream); + gActiveLogStreams[*stream] = lg; + + if (DefaultLogger::isNullLogger()) { + DefaultLogger::create(NULL,(gVerboseLogging == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); + } + DefaultLogger::get()->attachStream(lg); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiDetachLogStream( const aiLogStream* stream) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + // find the log-stream associated with this data + LogStreamMap::iterator it = gActiveLogStreams.find( *stream); + // it should be there... else the user is playing fools with us + if( it == gActiveLogStreams.end()) { + return AI_FAILURE; + } + DefaultLogger::get()->detatchStream( it->second ); + delete it->second; + + gActiveLogStreams.erase( it); + + if (gActiveLogStreams.empty()) { + DefaultLogger::kill(); + } + ASSIMP_END_EXCEPTION_REGION(aiReturn); + return AI_SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiDetachAllLogStreams(void) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + Logger *logger( DefaultLogger::get() ); + if ( NULL == logger ) { + return; + } + + for (LogStreamMap::iterator it = gActiveLogStreams.begin(); it != gActiveLogStreams.end(); ++it) { + logger->detatchStream( it->second ); + delete it->second; + } + gActiveLogStreams.clear(); + DefaultLogger::kill(); + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiEnableVerboseLogging(aiBool d) +{ + if (!DefaultLogger::isNullLogger()) { + DefaultLogger::get()->setLogSeverity((d == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); + } + gVerboseLogging = d; +} + +// ------------------------------------------------------------------------------------------------ +// Returns the error text of the last failed import process. +const char* aiGetErrorString() +{ + return gLastErrorString.c_str(); +} + +// ----------------------------------------------------------------------------------------------- +// Return the description of a importer given its index +const aiImporterDesc* aiGetImportFormatDescription( size_t pIndex) +{ + return Importer().GetImporterInfo(pIndex); +} + +// ----------------------------------------------------------------------------------------------- +// Return the number of importers +size_t aiGetImportFormatCount(void) +{ + return Importer().GetImporterCount(); +} + +// ------------------------------------------------------------------------------------------------ +// Returns the error text of the last failed import process. +aiBool aiIsExtensionSupported(const char* szExtension) +{ + ai_assert(NULL != szExtension); + aiBool candoit=AI_FALSE; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // FIXME: no need to create a temporary Importer instance just for that .. + Assimp::Importer tmp; + candoit = tmp.IsExtensionSupported(std::string(szExtension)) ? AI_TRUE : AI_FALSE; + + ASSIMP_END_EXCEPTION_REGION(aiBool); + return candoit; +} + +// ------------------------------------------------------------------------------------------------ +// Get a list of all file extensions supported by ASSIMP +void aiGetExtensionList(aiString* szOut) +{ + ai_assert(NULL != szOut); + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // FIXME: no need to create a temporary Importer instance just for that .. + Assimp::Importer tmp; + tmp.GetExtensionList(*szOut); + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Get the memory requirements for a particular import. +void aiGetMemoryRequirements(const C_STRUCT aiScene* pIn, + C_STRUCT aiMemoryInfo* in) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pIn); + if( !priv || !priv->mOrigImporter) { + ReportSceneNotFoundError(); + return; + } + + return priv->mOrigImporter->GetMemoryRequirements(*in); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiPropertyStore* aiCreatePropertyStore(void) +{ + return reinterpret_cast<aiPropertyStore*>( new PropertyMap() ); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiReleasePropertyStore(aiPropertyStore* p) +{ + delete reinterpret_cast<PropertyMap*>(p); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyInteger +ASSIMP_API void aiSetImportPropertyInteger(aiPropertyStore* p, const char* szName, int value) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<int>(pp->ints,szName,value); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyFloat +ASSIMP_API void aiSetImportPropertyFloat(aiPropertyStore* p, const char* szName, ai_real value) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<ai_real>(pp->floats,szName,value); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyString +ASSIMP_API void aiSetImportPropertyString(aiPropertyStore* p, const char* szName, + const C_STRUCT aiString* st) +{ + if (!st) { + return; + } + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<std::string>(pp->strings,szName,std::string(st->C_Str())); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyMatrix +ASSIMP_API void aiSetImportPropertyMatrix(aiPropertyStore* p, const char* szName, + const C_STRUCT aiMatrix4x4* mat) +{ + if (!mat) { + return; + } + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<aiMatrix4x4>(pp->matrices,szName,*mat); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Rotation matrix to quaternion +ASSIMP_API void aiCreateQuaternionFromMatrix(aiQuaternion* quat,const aiMatrix3x3* mat) +{ + ai_assert( NULL != quat ); + ai_assert( NULL != mat ); + *quat = aiQuaternion(*mat); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix decomposition +ASSIMP_API void aiDecomposeMatrix(const aiMatrix4x4* mat,aiVector3D* scaling, + aiQuaternion* rotation, + aiVector3D* position) +{ + ai_assert( NULL != rotation ); + ai_assert( NULL != position ); + ai_assert( NULL != scaling ); + ai_assert( NULL != mat ); + mat->Decompose(*scaling,*rotation,*position); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix transpose +ASSIMP_API void aiTransposeMatrix3(aiMatrix3x3* mat) +{ + ai_assert(NULL != mat); + mat->Transpose(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiTransposeMatrix4(aiMatrix4x4* mat) +{ + ai_assert(NULL != mat); + mat->Transpose(); +} + +// ------------------------------------------------------------------------------------------------ +// Vector transformation +ASSIMP_API void aiTransformVecByMatrix3(aiVector3D* vec, + const aiMatrix3x3* mat) +{ + ai_assert( NULL != mat ); + ai_assert( NULL != vec); + *vec *= (*mat); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiTransformVecByMatrix4(aiVector3D* vec, + const aiMatrix4x4* mat) +{ + ai_assert( NULL != mat ); + ai_assert( NULL != vec ); + + *vec *= (*mat); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix multiplication +ASSIMP_API void aiMultiplyMatrix4( + aiMatrix4x4* dst, + const aiMatrix4x4* src) +{ + ai_assert( NULL != dst ); + ai_assert( NULL != src ); + *dst = (*dst) * (*src); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiMultiplyMatrix3( + aiMatrix3x3* dst, + const aiMatrix3x3* src) +{ + ai_assert( NULL != dst ); + ai_assert( NULL != src ); + *dst = (*dst) * (*src); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix identity +ASSIMP_API void aiIdentityMatrix3( + aiMatrix3x3* mat) +{ + ai_assert(NULL != mat); + *mat = aiMatrix3x3(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiIdentityMatrix4( + aiMatrix4x4* mat) +{ + ai_assert(NULL != mat); + *mat = aiMatrix4x4(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API C_STRUCT const aiImporterDesc* aiGetImporterDesc( const char *extension ) { + if( NULL == extension ) { + return NULL; + } + const aiImporterDesc *desc( NULL ); + std::vector< BaseImporter* > out; + GetImporterInstanceList( out ); + for( size_t i = 0; i < out.size(); ++i ) { + if( 0 == strncmp( out[ i ]->GetInfo()->mFileExtensions, extension, strlen( extension ) ) ) { + desc = out[ i ]->GetInfo(); + break; + } + } + + DeleteImporterInstanceList(out); + + return desc; +} + +// ------------------------------------------------------------------------------------------------ diff --git a/thirdparty/assimp/code/BaseImporter.cpp b/thirdparty/assimp/code/Common/BaseImporter.cpp index 4803c6d6f2..0a5694aa0e 100644 --- a/thirdparty/assimp/code/BaseImporter.cpp +++ b/thirdparty/assimp/code/Common/BaseImporter.cpp @@ -320,7 +320,11 @@ std::string BaseImporter::GetExtension( const std::string& file ) { return false; } -#include "../contrib/utf8cpp/source/utf8.h" +#ifdef ASSIMP_USE_HUNTER +# include <utf8/utf8.h> +#else +# include "../contrib/utf8cpp/source/utf8.h" +#endif // ------------------------------------------------------------------------------------------------ // Convert to UTF8 data diff --git a/thirdparty/assimp/code/BaseProcess.cpp b/thirdparty/assimp/code/Common/BaseProcess.cpp index 18872c3693..e247be418d 100644 --- a/thirdparty/assimp/code/BaseProcess.cpp +++ b/thirdparty/assimp/code/Common/BaseProcess.cpp @@ -89,7 +89,7 @@ void BaseProcess::ExecuteOnScene( Importer* pImp) // and kill the partially imported data delete pImp->Pimpl()->mScene; - pImp->Pimpl()->mScene = NULL; + pImp->Pimpl()->mScene = nullptr; } } diff --git a/thirdparty/assimp/code/BaseProcess.h b/thirdparty/assimp/code/Common/BaseProcess.h index 4d5c7a76be..4d5c7a76be 100644 --- a/thirdparty/assimp/code/BaseProcess.h +++ b/thirdparty/assimp/code/Common/BaseProcess.h diff --git a/thirdparty/assimp/code/Bitmap.cpp b/thirdparty/assimp/code/Common/Bitmap.cpp index b22b71ea9e..b22b71ea9e 100644 --- a/thirdparty/assimp/code/Bitmap.cpp +++ b/thirdparty/assimp/code/Common/Bitmap.cpp diff --git a/thirdparty/assimp/code/CreateAnimMesh.cpp b/thirdparty/assimp/code/Common/CreateAnimMesh.cpp index 1a052849bb..98b60e5319 100644 --- a/thirdparty/assimp/code/CreateAnimMesh.cpp +++ b/thirdparty/assimp/code/Common/CreateAnimMesh.cpp @@ -47,10 +47,6 @@ namespace Assimp { aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh) { aiAnimMesh *animesh = new aiAnimMesh; - animesh->mVertices = NULL; - animesh->mNormals = NULL; - animesh->mTangents = NULL; - animesh->mBitangents = NULL; animesh->mNumVertices = mesh->mNumVertices; if (mesh->mVertices) { animesh->mVertices = new aiVector3D[animesh->mNumVertices]; diff --git a/thirdparty/assimp/code/DefaultIOStream.cpp b/thirdparty/assimp/code/Common/DefaultIOStream.cpp index 1c100b6189..1c100b6189 100644 --- a/thirdparty/assimp/code/DefaultIOStream.cpp +++ b/thirdparty/assimp/code/Common/DefaultIOStream.cpp diff --git a/thirdparty/assimp/code/DefaultIOSystem.cpp b/thirdparty/assimp/code/Common/DefaultIOSystem.cpp index d40b67de32..d40b67de32 100644 --- a/thirdparty/assimp/code/DefaultIOSystem.cpp +++ b/thirdparty/assimp/code/Common/DefaultIOSystem.cpp diff --git a/thirdparty/assimp/code/DefaultLogger.cpp b/thirdparty/assimp/code/Common/DefaultLogger.cpp index de3528d2b4..de3528d2b4 100644 --- a/thirdparty/assimp/code/DefaultLogger.cpp +++ b/thirdparty/assimp/code/Common/DefaultLogger.cpp diff --git a/thirdparty/assimp/code/DefaultProgressHandler.h b/thirdparty/assimp/code/Common/DefaultProgressHandler.h index bd2cce00be..bd2cce00be 100644 --- a/thirdparty/assimp/code/DefaultProgressHandler.h +++ b/thirdparty/assimp/code/Common/DefaultProgressHandler.h diff --git a/thirdparty/assimp/code/Exporter.cpp b/thirdparty/assimp/code/Common/Exporter.cpp index 8848e87f5b..090b561ae0 100644 --- a/thirdparty/assimp/code/Exporter.cpp +++ b/thirdparty/assimp/code/Common/Exporter.cpp @@ -61,15 +61,16 @@ Here we implement only the C++ interface (Assimp::Exporter). #include <assimp/mesh.h> #include <assimp/postprocess.h> #include <assimp/scene.h> - -#include "DefaultProgressHandler.h" -#include "BaseProcess.h" -#include "JoinVerticesProcess.h" -#include "MakeVerboseFormat.h" -#include "ConvertToLHProcess.h" -#include "PretransformVertices.h" #include <assimp/Exceptional.h> -#include "ScenePrivate.h" + +#include "Common/DefaultProgressHandler.h" +#include "Common/BaseProcess.h" +#include "Common/ScenePrivate.h" +#include "PostProcessing/CalcTangentsProcess.h" +#include "PostProcessing/MakeVerboseFormat.h" +#include "PostProcessing/JoinVerticesProcess.h" +#include "PostProcessing/ConvertToLHProcess.h" +#include "PostProcessing/PretransformVertices.h" #include <memory> @@ -101,6 +102,7 @@ void ExportSceneX3D(const char*, IOSystem*, const aiScene*, const ExportProperti void ExportSceneFBX(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneFBXA(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportScene3MF( const char*, IOSystem*, const aiScene*, const ExportProperties* ); +void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::ExportProperties*); // ------------------------------------------------------------------------------------------------ // global array of all export formats which Assimp supports in its current build @@ -161,11 +163,11 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER - Exporter::ExportFormatEntry( "assbin", "Assimp Binary", "assbin" , &ExportSceneAssbin, 0 ), + Exporter::ExportFormatEntry( "assbin", "Assimp Binary File", "assbin" , &ExportSceneAssbin, 0 ), #endif #ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER - Exporter::ExportFormatEntry( "assxml", "Assxml Document", "assxml" , &ExportSceneAssxml, 0 ), + Exporter::ExportFormatEntry( "assxml", "Assimp XML Document", "assxml" , &ExportSceneAssxml, 0 ), #endif #ifndef ASSIMP_BUILD_NO_X3D_EXPORTER @@ -178,7 +180,11 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_3MF_EXPORTER - Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ) + Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ), +#endif + +#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER + Exporter::ExportFormatEntry( "assjson", "Assimp JSON Document", "json", &ExportAssimp2Json, 0) #endif }; @@ -288,7 +294,7 @@ void Exporter::SetProgressHandler(ProgressHandler* pHandler) { // ------------------------------------------------------------------------------------------------ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const char* pFormatId, - unsigned int, const ExportProperties* /*pProperties*/ ) { + unsigned int pPreprocessing, const ExportProperties* pProperties) { if (pimpl->blob) { delete pimpl->blob; pimpl->blob = nullptr; @@ -298,7 +304,7 @@ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const cha BlobIOSystem* blobio = new BlobIOSystem(); pimpl->mIOSystem = std::shared_ptr<IOSystem>( blobio ); - if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName())) { + if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName(), pPreprocessing, pProperties)) { pimpl->mIOSystem = old; return nullptr; } diff --git a/thirdparty/assimp/code/FileLogStream.h b/thirdparty/assimp/code/Common/FileLogStream.h index 740c503192..740c503192 100644 --- a/thirdparty/assimp/code/FileLogStream.h +++ b/thirdparty/assimp/code/Common/FileLogStream.h diff --git a/thirdparty/assimp/code/FileSystemFilter.h b/thirdparty/assimp/code/Common/FileSystemFilter.h index 9923cdbdd3..9923cdbdd3 100644 --- a/thirdparty/assimp/code/FileSystemFilter.h +++ b/thirdparty/assimp/code/Common/FileSystemFilter.h diff --git a/thirdparty/assimp/code/Common/IFF.h b/thirdparty/assimp/code/Common/IFF.h new file mode 100644 index 0000000000..91d7d48289 --- /dev/null +++ b/thirdparty/assimp/code/Common/IFF.h @@ -0,0 +1,102 @@ +// Definitions for the Interchange File Format (IFF) +// Alexander Gessler, 2006 +// Adapted to Assimp August 2008 + +#ifndef AI_IFF_H_INCLUDED +#define AI_IFF_H_INCLUDED + +#include <assimp/ByteSwapper.h> + +namespace Assimp { +namespace IFF { + +///////////////////////////////////////////////////////////////////////////////// +//! Describes an IFF chunk header +///////////////////////////////////////////////////////////////////////////////// +struct ChunkHeader +{ + //! Type of the chunk header - FourCC + uint32_t type; + + //! Length of the chunk data, in bytes + uint32_t length; +}; + + +///////////////////////////////////////////////////////////////////////////////// +//! Describes an IFF sub chunk header +///////////////////////////////////////////////////////////////////////////////// +struct SubChunkHeader +{ + //! Type of the chunk header - FourCC + uint32_t type; + + //! Length of the chunk data, in bytes + uint16_t length; +}; + + +#define AI_IFF_FOURCC(a,b,c,d) ((uint32_t) (((uint8_t)a << 24u) | \ + ((uint8_t)b << 16u) | ((uint8_t)c << 8u) | ((uint8_t)d))) + + +#define AI_IFF_FOURCC_FORM AI_IFF_FOURCC('F','O','R','M') + + +///////////////////////////////////////////////////////////////////////////////// +//! Load a chunk header +//! @param outFile Pointer to the file data - points to the chunk data afterwards +//! @return Copy of the chunk header +///////////////////////////////////////////////////////////////////////////////// +inline ChunkHeader LoadChunk(uint8_t*& outFile) +{ + ChunkHeader head; + ::memcpy(&head.type, outFile, 4); + outFile += 4; + ::memcpy(&head.length, outFile, 4); + outFile += 4; + AI_LSWAP4(head.length); + AI_LSWAP4(head.type); + return head; +} + +///////////////////////////////////////////////////////////////////////////////// +//! Load a sub chunk header +//! @param outFile Pointer to the file data - points to the chunk data afterwards +//! @return Copy of the sub chunk header +///////////////////////////////////////////////////////////////////////////////// +inline SubChunkHeader LoadSubChunk(uint8_t*& outFile) +{ + SubChunkHeader head; + ::memcpy(&head.type, outFile, 4); + outFile += 4; + ::memcpy(&head.length, outFile, 2); + outFile += 2; + AI_LSWAP2(head.length); + AI_LSWAP4(head.type); + return head; +} + +///////////////////////////////////////////////////////////////////////////////// +//! Read the file header and return the type of the file and its size +//! @param outFile Pointer to the file data. The buffer must at +//! least be 12 bytes large. +//! @param fileType Receives the type of the file +//! @return 0 if everything was OK, otherwise an error message +///////////////////////////////////////////////////////////////////////////////// +inline const char* ReadHeader(uint8_t* outFile, uint32_t& fileType) +{ + ChunkHeader head = LoadChunk(outFile); + if(AI_IFF_FOURCC_FORM != head.type) + { + return "The file is not an IFF file: FORM chunk is missing"; + } + ::memcpy(&fileType, outFile, 4); + AI_LSWAP4(fileType); + return 0; +} + + +}} + +#endif // !! AI_IFF_H_INCLUDED diff --git a/thirdparty/assimp/code/Importer.cpp b/thirdparty/assimp/code/Common/Importer.cpp index 65b16471cc..91b50859a0 100644 --- a/thirdparty/assimp/code/Importer.cpp +++ b/thirdparty/assimp/code/Common/Importer.cpp @@ -64,15 +64,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ------------------------------------------------------------------------------------------------ // Internal headers // ------------------------------------------------------------------------------------------------ -#include "Importer.h" -#include <assimp/BaseImporter.h> -#include "BaseProcess.h" +#include "Common/Importer.h" +#include "Common/BaseProcess.h" +#include "Common/DefaultProgressHandler.h" +#include "PostProcessing/ProcessHelper.h" +#include "Common/ScenePreprocessor.h" +#include "Common/ScenePrivate.h" -#include "DefaultProgressHandler.h" +#include <assimp/BaseImporter.h> #include <assimp/GenericProperty.h> -#include "ProcessHelper.h" -#include "ScenePreprocessor.h" -#include "ScenePrivate.h" #include <assimp/MemoryIOWrapper.h> #include <assimp/Profiler.h> #include <assimp/TinyFormatter.h> @@ -86,7 +86,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/DefaultIOSystem.h> #ifndef ASSIMP_BUILD_NO_VALIDATEDS_PROCESS -# include "ValidateDataStructure.h" +# include "PostProcessing/ValidateDataStructure.h" #endif using namespace Assimp::Profiling; @@ -590,10 +590,12 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) // Find an worker class which can handle the file BaseImporter* imp = NULL; + SetPropertyInteger("importerIndex", -1); for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, false)) { imp = pimpl->mImporter[a]; + SetPropertyInteger("importerIndex", a); break; } } @@ -606,6 +608,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, true)) { imp = pimpl->mImporter[a]; + SetPropertyInteger("importerIndex", a); break; } } diff --git a/thirdparty/assimp/code/Importer.h b/thirdparty/assimp/code/Common/Importer.h index a439d99c2f..a439d99c2f 100644 --- a/thirdparty/assimp/code/Importer.h +++ b/thirdparty/assimp/code/Common/Importer.h diff --git a/thirdparty/assimp/code/ImporterRegistry.cpp b/thirdparty/assimp/code/Common/ImporterRegistry.cpp index 747815fa6f..32ac3b4168 100644 --- a/thirdparty/assimp/code/ImporterRegistry.cpp +++ b/thirdparty/assimp/code/Common/ImporterRegistry.cpp @@ -56,146 +56,146 @@ corresponding preprocessor flag to selectively disable formats. // (include_new_importers_here) // ------------------------------------------------------------------------------------------------ #ifndef ASSIMP_BUILD_NO_X_IMPORTER -# include "XFileImporter.h" +# include "X/XFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_AMF_IMPORTER -# include "AMFImporter.hpp" +# include "AMF/AMFImporter.hpp" #endif #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER -# include "3DSLoader.h" +# include "3DS/3DSLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD3_IMPORTER -# include "MD3Loader.h" +# include "MD3/MD3Loader.h" #endif #ifndef ASSIMP_BUILD_NO_MDL_IMPORTER -# include "MDLLoader.h" +# include "MDL/MDLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD2_IMPORTER -# include "MD2Loader.h" +# include "MD2/MD2Loader.h" #endif #ifndef ASSIMP_BUILD_NO_PLY_IMPORTER -# include "PlyLoader.h" +# include "Ply/PlyLoader.h" #endif #ifndef ASSIMP_BUILD_NO_ASE_IMPORTER -# include "ASELoader.h" +# include "ASE/ASELoader.h" #endif #ifndef ASSIMP_BUILD_NO_OBJ_IMPORTER -# include "ObjFileImporter.h" +# include "Obj/ObjFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_HMP_IMPORTER -# include "HMPLoader.h" +# include "HMP/HMPLoader.h" #endif #ifndef ASSIMP_BUILD_NO_SMD_IMPORTER -# include "SMDLoader.h" +# include "SMD/SMDLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MDC_IMPORTER -# include "MDCLoader.h" +# include "MDC/MDCLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD5_IMPORTER -# include "MD5Loader.h" +# include "MD5/MD5Loader.h" #endif #ifndef ASSIMP_BUILD_NO_STL_IMPORTER -# include "STLLoader.h" +# include "STL/STLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_LWO_IMPORTER -# include "LWOLoader.h" +# include "LWO/LWOLoader.h" #endif #ifndef ASSIMP_BUILD_NO_DXF_IMPORTER -# include "DXFLoader.h" +# include "DXF/DXFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_NFF_IMPORTER -# include "NFFLoader.h" +# include "NFF/NFFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_RAW_IMPORTER -# include "RawLoader.h" +# include "Raw/RawLoader.h" #endif #ifndef ASSIMP_BUILD_NO_SIB_IMPORTER -# include "SIBImporter.h" +# include "SIB/SIBImporter.h" #endif #ifndef ASSIMP_BUILD_NO_OFF_IMPORTER -# include "OFFLoader.h" +# include "OFF/OFFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_AC_IMPORTER -# include "ACLoader.h" +# include "AC/ACLoader.h" #endif #ifndef ASSIMP_BUILD_NO_BVH_IMPORTER -# include "BVHLoader.h" +# include "BVH/BVHLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IRRMESH_IMPORTER -# include "IRRMeshLoader.h" +# include "Irr/IRRMeshLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IRR_IMPORTER -# include "IRRLoader.h" +# include "Irr/IRRLoader.h" #endif #ifndef ASSIMP_BUILD_NO_Q3D_IMPORTER -# include "Q3DLoader.h" +# include "Q3D/Q3DLoader.h" #endif #ifndef ASSIMP_BUILD_NO_B3D_IMPORTER -# include "B3DImporter.h" +# include "B3D/B3DImporter.h" #endif #ifndef ASSIMP_BUILD_NO_COLLADA_IMPORTER -# include "ColladaLoader.h" +# include "Collada/ColladaLoader.h" #endif #ifndef ASSIMP_BUILD_NO_TERRAGEN_IMPORTER -# include "TerragenLoader.h" +# include "Terragen/TerragenLoader.h" #endif #ifndef ASSIMP_BUILD_NO_CSM_IMPORTER -# include "CSMLoader.h" +# include "CSM/CSMLoader.h" #endif #ifndef ASSIMP_BUILD_NO_3D_IMPORTER -# include "UnrealLoader.h" +# include "Unreal/UnrealLoader.h" #endif #ifndef ASSIMP_BUILD_NO_LWS_IMPORTER -# include "LWSLoader.h" +# include "LWS/LWSLoader.h" #endif #ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER -# include "OgreImporter.h" +# include "Ogre/OgreImporter.h" #endif #ifndef ASSIMP_BUILD_NO_OPENGEX_IMPORTER -# include "OpenGEXImporter.h" +# include "OpenGEX/OpenGEXImporter.h" #endif #ifndef ASSIMP_BUILD_NO_MS3D_IMPORTER -# include "MS3DLoader.h" +# include "MS3D/MS3DLoader.h" #endif #ifndef ASSIMP_BUILD_NO_COB_IMPORTER -# include "COBLoader.h" +# include "COB/COBLoader.h" #endif #ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER -# include "BlenderLoader.h" +# include "Blender/BlenderLoader.h" #endif #ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER -# include "Q3BSPFileImporter.h" +# include "Q3BSP/Q3BSPFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_NDO_IMPORTER -# include "NDOLoader.h" +# include "NDO/NDOLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IFC_IMPORTER # include "Importer/IFC/IFCLoader.h" #endif #ifndef ASSIMP_BUILD_NO_XGL_IMPORTER -# include "XGLLoader.h" +# include "XGL/XGLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER -# include "FBXImporter.h" +# include "FBX/FBXImporter.h" #endif #ifndef ASSIMP_BUILD_NO_ASSBIN_IMPORTER -# include "AssbinLoader.h" +# include "Assbin/AssbinLoader.h" #endif #ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER -# include "glTFImporter.h" -# include "glTF2Importer.h" +# include "glTF/glTFImporter.h" +# include "glTF2/glTF2Importer.h" #endif #ifndef ASSIMP_BUILD_NO_C4D_IMPORTER -# include "C4DImporter.h" +# include "C4D/C4DImporter.h" #endif #ifndef ASSIMP_BUILD_NO_3MF_IMPORTER -# include "D3MFImporter.h" +# include "3MF/D3MFImporter.h" #endif #ifndef ASSIMP_BUILD_NO_X3D_IMPORTER -# include "X3DImporter.hpp" +# include "X3D/X3DImporter.hpp" #endif #ifndef ASSIMP_BUILD_NO_MMD_IMPORTER -# include "MMDImporter.h" +# include "MMD/MMDImporter.h" #endif #ifndef ASSIMP_BUILD_NO_STEP_IMPORTER # include "Importer/StepFile/StepFileImporter.h" @@ -364,7 +364,7 @@ void GetImporterInstanceList(std::vector< BaseImporter* >& out) void DeleteImporterInstanceList(std::vector< BaseImporter* >& deleteList){ for(size_t i= 0; i<deleteList.size();++i){ delete deleteList[i]; - deleteList[i]=NULL; + deleteList[i]=nullptr; }//for } diff --git a/thirdparty/assimp/code/PolyTools.h b/thirdparty/assimp/code/Common/PolyTools.h index fbbda0e7d1..fbbda0e7d1 100644 --- a/thirdparty/assimp/code/PolyTools.h +++ b/thirdparty/assimp/code/Common/PolyTools.h diff --git a/thirdparty/assimp/code/PostStepRegistry.cpp b/thirdparty/assimp/code/Common/PostStepRegistry.cpp index 15b4a28843..ef58f8ddfd 100644 --- a/thirdparty/assimp/code/PostStepRegistry.cpp +++ b/thirdparty/assimp/code/Common/PostStepRegistry.cpp @@ -48,89 +48,93 @@ directly (unless you are adding new steps), instead use the corresponding preprocessor flag to selectively disable steps. */ -#include "ProcessHelper.h" +#include "PostProcessing/ProcessHelper.h" #ifndef ASSIMP_BUILD_NO_CALCTANGENTS_PROCESS -# include "CalcTangentsProcess.h" +# include "PostProcessing/CalcTangentsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_JOINVERTICES_PROCESS -# include "JoinVerticesProcess.h" +# include "PostProcessing/JoinVerticesProcess.h" #endif #if !(defined ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS && defined ASSIMP_BUILD_NO_FLIPUVS_PROCESS && defined ASSIMP_BUILD_NO_FLIPWINDINGORDER_PROCESS) -# include "ConvertToLHProcess.h" +# include "PostProcessing/ConvertToLHProcess.h" #endif #ifndef ASSIMP_BUILD_NO_TRIANGULATE_PROCESS -# include "TriangulateProcess.h" +# include "PostProcessing/TriangulateProcess.h" #endif #ifndef ASSIMP_BUILD_NO_DROPFACENORMALS_PROCESS -# include "DropFaceNormalsProcess.h" +# include "PostProcessing/DropFaceNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENFACENORMALS_PROCESS -# include "GenFaceNormalsProcess.h" +# include "PostProcessing/GenFaceNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENVERTEXNORMALS_PROCESS -# include "GenVertexNormalsProcess.h" +# include "PostProcessing/GenVertexNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_REMOVEVC_PROCESS -# include "RemoveVCProcess.h" +# include "PostProcessing/RemoveVCProcess.h" #endif #ifndef ASSIMP_BUILD_NO_SPLITLARGEMESHES_PROCESS -# include "SplitLargeMeshes.h" +# include "PostProcessing/SplitLargeMeshes.h" #endif #ifndef ASSIMP_BUILD_NO_PRETRANSFORMVERTICES_PROCESS -# include "PretransformVertices.h" +# include "PostProcessing/PretransformVertices.h" #endif #ifndef ASSIMP_BUILD_NO_LIMITBONEWEIGHTS_PROCESS -# include "LimitBoneWeightsProcess.h" +# include "PostProcessing/LimitBoneWeightsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_VALIDATEDS_PROCESS -# include "ValidateDataStructure.h" +# include "PostProcessing/ValidateDataStructure.h" #endif #ifndef ASSIMP_BUILD_NO_IMPROVECACHELOCALITY_PROCESS -# include "ImproveCacheLocality.h" +# include "PostProcessing/ImproveCacheLocality.h" #endif #ifndef ASSIMP_BUILD_NO_FIXINFACINGNORMALS_PROCESS -# include "FixNormalsStep.h" +# include "PostProcessing/FixNormalsStep.h" #endif #ifndef ASSIMP_BUILD_NO_REMOVE_REDUNDANTMATERIALS_PROCESS -# include "RemoveRedundantMaterials.h" +# include "PostProcessing/RemoveRedundantMaterials.h" #endif #if (!defined ASSIMP_BUILD_NO_EMBEDTEXTURES_PROCESS) -# include "EmbedTexturesProcess.h" +# include "PostProcessing/EmbedTexturesProcess.h" #endif #ifndef ASSIMP_BUILD_NO_FINDINVALIDDATA_PROCESS -# include "FindInvalidDataProcess.h" +# include "PostProcessing/FindInvalidDataProcess.h" #endif #ifndef ASSIMP_BUILD_NO_FINDDEGENERATES_PROCESS -# include "FindDegenerates.h" +# include "PostProcessing/FindDegenerates.h" #endif #ifndef ASSIMP_BUILD_NO_SORTBYPTYPE_PROCESS -# include "SortByPTypeProcess.h" +# include "PostProcessing/SortByPTypeProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENUVCOORDS_PROCESS -# include "ComputeUVMappingProcess.h" +# include "PostProcessing/ComputeUVMappingProcess.h" #endif #ifndef ASSIMP_BUILD_NO_TRANSFORMTEXCOORDS_PROCESS -# include "TextureTransform.h" +# include "PostProcessing/TextureTransform.h" #endif #ifndef ASSIMP_BUILD_NO_FINDINSTANCES_PROCESS -# include "FindInstancesProcess.h" +# include "PostProcessing/FindInstancesProcess.h" #endif #ifndef ASSIMP_BUILD_NO_OPTIMIZEMESHES_PROCESS -# include "OptimizeMeshes.h" +# include "PostProcessing/OptimizeMeshes.h" #endif #ifndef ASSIMP_BUILD_NO_OPTIMIZEGRAPH_PROCESS -# include "OptimizeGraph.h" +# include "PostProcessing/OptimizeGraph.h" #endif #ifndef ASSIMP_BUILD_NO_SPLITBYBONECOUNT_PROCESS -# include "SplitByBoneCountProcess.h" +# include "Common/SplitByBoneCountProcess.h" #endif #ifndef ASSIMP_BUILD_NO_DEBONE_PROCESS -# include "DeboneProcess.h" +# include "PostProcessing/DeboneProcess.h" #endif #if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS) -# include "ScaleProcess.h" +# include "PostProcessing/ScaleProcess.h" #endif +#if (!defined ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS) +# include "PostProcessing/GenBoundingBoxesProcess.h" +#endif + namespace Assimp { @@ -246,6 +250,9 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out) #if (!defined ASSIMP_BUILD_NO_IMPROVECACHELOCALITY_PROCESS) out.push_back( new ImproveCacheLocalityProcess()); #endif +#if (!defined ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS) + out.push_back(new GenBoundingBoxesProcess); +#endif } } diff --git a/thirdparty/assimp/code/RemoveComments.cpp b/thirdparty/assimp/code/Common/RemoveComments.cpp index 91700a7699..91700a7699 100644 --- a/thirdparty/assimp/code/RemoveComments.cpp +++ b/thirdparty/assimp/code/Common/RemoveComments.cpp diff --git a/thirdparty/assimp/code/SGSpatialSort.cpp b/thirdparty/assimp/code/Common/SGSpatialSort.cpp index 120070b0aa..120070b0aa 100644 --- a/thirdparty/assimp/code/SGSpatialSort.cpp +++ b/thirdparty/assimp/code/Common/SGSpatialSort.cpp diff --git a/thirdparty/assimp/code/SceneCombiner.cpp b/thirdparty/assimp/code/Common/SceneCombiner.cpp index e445bd7434..e445bd7434 100644 --- a/thirdparty/assimp/code/SceneCombiner.cpp +++ b/thirdparty/assimp/code/Common/SceneCombiner.cpp diff --git a/thirdparty/assimp/code/ScenePreprocessor.cpp b/thirdparty/assimp/code/Common/ScenePreprocessor.cpp index 432a3d7666..432a3d7666 100644 --- a/thirdparty/assimp/code/ScenePreprocessor.cpp +++ b/thirdparty/assimp/code/Common/ScenePreprocessor.cpp diff --git a/thirdparty/assimp/code/ScenePreprocessor.h b/thirdparty/assimp/code/Common/ScenePreprocessor.h index 3f4c8d7c3f..3f4c8d7c3f 100644 --- a/thirdparty/assimp/code/ScenePreprocessor.h +++ b/thirdparty/assimp/code/Common/ScenePreprocessor.h diff --git a/thirdparty/assimp/code/ScenePrivate.h b/thirdparty/assimp/code/Common/ScenePrivate.h index f336aafc9a..f336aafc9a 100644 --- a/thirdparty/assimp/code/ScenePrivate.h +++ b/thirdparty/assimp/code/Common/ScenePrivate.h diff --git a/thirdparty/assimp/code/SkeletonMeshBuilder.cpp b/thirdparty/assimp/code/Common/SkeletonMeshBuilder.cpp index 06cfe034e9..06cfe034e9 100644 --- a/thirdparty/assimp/code/SkeletonMeshBuilder.cpp +++ b/thirdparty/assimp/code/Common/SkeletonMeshBuilder.cpp diff --git a/thirdparty/assimp/code/SpatialSort.cpp b/thirdparty/assimp/code/Common/SpatialSort.cpp index a4f3a4e4b8..a4f3a4e4b8 100644 --- a/thirdparty/assimp/code/SpatialSort.cpp +++ b/thirdparty/assimp/code/Common/SpatialSort.cpp diff --git a/thirdparty/assimp/code/SplitByBoneCountProcess.cpp b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.cpp index 2ef66a9afc..2ef66a9afc 100644 --- a/thirdparty/assimp/code/SplitByBoneCountProcess.cpp +++ b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.cpp diff --git a/thirdparty/assimp/code/SplitByBoneCountProcess.h b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.h index 6c904a9df4..6c904a9df4 100644 --- a/thirdparty/assimp/code/SplitByBoneCountProcess.h +++ b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.h diff --git a/thirdparty/assimp/code/StandardShapes.cpp b/thirdparty/assimp/code/Common/StandardShapes.cpp index 2e5100130f..2e5100130f 100644 --- a/thirdparty/assimp/code/StandardShapes.cpp +++ b/thirdparty/assimp/code/Common/StandardShapes.cpp diff --git a/thirdparty/assimp/code/StdOStreamLogStream.h b/thirdparty/assimp/code/Common/StdOStreamLogStream.h index 893e261a2b..893e261a2b 100644 --- a/thirdparty/assimp/code/StdOStreamLogStream.h +++ b/thirdparty/assimp/code/Common/StdOStreamLogStream.h diff --git a/thirdparty/assimp/code/Subdivision.cpp b/thirdparty/assimp/code/Common/Subdivision.cpp index 19db223a55..60c54939f5 100644 --- a/thirdparty/assimp/code/Subdivision.cpp +++ b/thirdparty/assimp/code/Common/Subdivision.cpp @@ -43,9 +43,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/Subdivision.h> #include <assimp/SceneCombiner.h> #include <assimp/SpatialSort.h> -#include "ProcessHelper.h" #include <assimp/Vertex.h> #include <assimp/ai_assert.h> + +#include "PostProcessing/ProcessHelper.h" + #include <stdio.h> using namespace Assimp; @@ -56,8 +58,7 @@ void mydummy() {} * implementation is basing on recursive refinement. Directly evaluating the result is also * possible and much quicker, but it depends on lengthy matrix lookup tables. */ // ------------------------------------------------------------------------------------------------ -class CatmullClarkSubdivider : public Subdivider -{ +class CatmullClarkSubdivider : public Subdivider { public: void Subdivide (aiMesh* mesh, aiMesh*& out, unsigned int num, bool discard_input); void Subdivide (aiMesh** smesh, size_t nmesh, diff --git a/thirdparty/assimp/code/TargetAnimation.cpp b/thirdparty/assimp/code/Common/TargetAnimation.cpp index b8062499ff..b8062499ff 100644 --- a/thirdparty/assimp/code/TargetAnimation.cpp +++ b/thirdparty/assimp/code/Common/TargetAnimation.cpp diff --git a/thirdparty/assimp/code/TargetAnimation.h b/thirdparty/assimp/code/Common/TargetAnimation.h index 91634ab5aa..91634ab5aa 100644 --- a/thirdparty/assimp/code/TargetAnimation.h +++ b/thirdparty/assimp/code/Common/TargetAnimation.h diff --git a/thirdparty/assimp/code/Version.cpp b/thirdparty/assimp/code/Common/Version.cpp index 0381037ff1..cc94340ac8 100644 --- a/thirdparty/assimp/code/Version.cpp +++ b/thirdparty/assimp/code/Common/Version.cpp @@ -134,7 +134,7 @@ ASSIMP_API aiScene::aiScene() , mCameras(nullptr) , mMetaData(nullptr) , mPrivate(new Assimp::ScenePrivateData()) { - // empty + // empty } // ------------------------------------------------------------------------------------------------ diff --git a/thirdparty/assimp/code/VertexTriangleAdjacency.cpp b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.cpp index 7cfd1a3505..7cfd1a3505 100644 --- a/thirdparty/assimp/code/VertexTriangleAdjacency.cpp +++ b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.cpp diff --git a/thirdparty/assimp/code/VertexTriangleAdjacency.h b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.h index f3be47612d..f3be47612d 100644 --- a/thirdparty/assimp/code/VertexTriangleAdjacency.h +++ b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.h diff --git a/thirdparty/assimp/code/Win32DebugLogStream.h b/thirdparty/assimp/code/Common/Win32DebugLogStream.h index a6063a261e..a6063a261e 100644 --- a/thirdparty/assimp/code/Win32DebugLogStream.h +++ b/thirdparty/assimp/code/Common/Win32DebugLogStream.h diff --git a/thirdparty/assimp/code/Common/assbin_chunks.h b/thirdparty/assimp/code/Common/assbin_chunks.h new file mode 100644 index 0000000000..15e4af5e7d --- /dev/null +++ b/thirdparty/assimp/code/Common/assbin_chunks.h @@ -0,0 +1,196 @@ +#ifndef INCLUDED_ASSBIN_CHUNKS_H +#define INCLUDED_ASSBIN_CHUNKS_H + +#define ASSBIN_VERSION_MAJOR 1 +#define ASSBIN_VERSION_MINOR 0 + +/** +@page assfile .ASS File formats + +@section over Overview +Assimp provides its own interchange format, which is intended to applications which need +to serialize 3D-models and to reload them quickly. Assimp's file formats are designed to +be read by Assimp itself. They encode additional information needed by Assimp to optimize +its postprocessing pipeline. If you once apply specific steps to a scene, then save it +and reread it from an ASS format using the same post processing settings, they won't +be executed again. + +The format comes in two flavours: XML and binary - both of them hold a complete dump of +the 'aiScene' data structure returned by the APIs. The focus for the binary format +(<tt>.assbin</tt>) is fast loading. Optional deflate compression helps reduce file size. The XML +flavour, <tt>.assxml</tt> or simply .xml, is just a plain-to-xml conversion of aiScene. + +ASSBIN is Assimp's binary interchange format. assimp_cmd (<tt><root>/tools/assimp_cmd</tt>) is able to +write it and the core library provides a loader for it. + +@section assxml XML File format + +The format is pretty much self-explanatory due to its similarity to the in-memory aiScene structure. +With few exceptions, C structures are wrapped in XML elements. + +The DTD for ASSXML can be found in <tt><root>/doc/AssXML_Scheme.xml</tt>. Or have look +at the output files generated by assimp_cmd. + +@section assbin Binary file format + +The ASSBIN file format is composed of chunks to represent the hierarchical aiScene data structure. +This makes the format extensible and allows backward-compatibility with future data structure +versions. The <tt><root>/code/assbin_chunks.h</tt> header contains some magic constants +for use by stand-alone ASSBIN loaders. Also, Assimp's own file writer can be found +in <tt><root>/tools/assimp_cmd/WriteDumb.cpp</tt> (yes, the 'b' is no typo ...). + +@verbatim + +------------------------------------------------------------------------------- +1. File structure: +------------------------------------------------------------------------------- + +---------------------- +| Header (512 bytes) | +---------------------- +| Variable chunks | +---------------------- + +------------------------------------------------------------------------------- +2. Definitions: +------------------------------------------------------------------------------- + +integer is four bytes wide, stored in little-endian byte order. +short is two bytes wide, stored in little-endian byte order. +byte is a single byte. +string is an integer n followed by n UTF-8 characters, not terminated by zero +float is an IEEE 754 single-precision floating-point value +double is an IEEE 754 double-precision floating-point value +t[n] is an array of n elements of type t + +------------------------------------------------------------------------------- +2. Header: +------------------------------------------------------------------------------- + +byte[44] Magic identification string for ASSBIN files. + 'ASSIMP.binary' + +integer Major version of the Assimp library which wrote the file +integer Minor version of the Assimp library which wrote the file + match these against ASSBIN_VERSION_MAJOR and ASSBIN_VERSION_MINOR + +integer SVN revision of the Assimp library (intended for our internal + debugging - if you write Ass files from your own APPs, set this value to 0. +integer Assimp compile flags + +short 0 for normal files, 1 for shortened dumps for regression tests + these should have the file extension assbin.regress + +short 1 if the data after the header is compressed with the DEFLATE algorithm, + 0 for uncompressed files. + For compressed files, the first integer after the header is + always the uncompressed data size + +byte[256] Zero-terminated source file name, UTF-8 +byte[128] Zero-terminated command line parameters passed to assimp_cmd, UTF-8 + +byte[64] Reserved for future use +---> Total length: 512 bytes + +------------------------------------------------------------------------------- +3. Chunks: +------------------------------------------------------------------------------- + +integer Magic chunk ID (ASSBIN_CHUNK_XXX) +integer Chunk data length, in bytes + (unknown chunks are possible, a good reader skips over them) + (chunk-data-length does not include the first two integers) + +byte[n] chunk-data-length bytes of data, depending on the chunk type + +Chunks can contain nested chunks. Nested chunks are ALWAYS at the end of the chunk, +their size is included in chunk-data-length. + +The chunk layout for all ASSIMP data structures is derived from their C declarations. +The general 'rule' to get from Assimp headers to the serialized layout is: + + 1. POD members (i.e. aiMesh::mPrimitiveTypes, aiMesh::mNumVertices), + in order of declaration. + + 2. Array-members (aiMesh::mFaces, aiMesh::mVertices, aiBone::mWeights), + in order of declaration. + + 2. Object array members (i.e aiMesh::mBones, aiScene::mMeshes) are stored in + subchunks directly following the data written in 1.) and 2.) + + + Of course, there are some exceptions to this general order: + +[[aiScene]] + + - The root node holding the scene structure is naturally stored in + a ASSBIN_CHUNK_AINODE subchunk following 1.) and 2.) (which is + empty for aiScene). + +[[aiMesh]] + + - mTextureCoords and mNumUVComponents are serialized as follows: + + [number of used uv channels times] + integer mNumUVComponents[n] + float mTextureCoords[n][3] + + -> more than AI_MAX_TEXCOORD_CHANNELS can be stored. This allows Assimp + builds with different settings for AI_MAX_TEXCOORD_CHANNELS to exchange + data. + -> the on-disk format always uses 3 floats to write UV coordinates. + If mNumUVComponents[0] is 1, the corresponding mTextureCoords array + consists of 3 floats. + + - The array member block of aiMesh is prefixed with an integer that specifies + the kinds of vertex components actually present in the mesh. This is a + bitwise combination of the ASSBIN_MESH_HAS_xxx constants. + +[[aiFace]] + + - mNumIndices is stored as short + - mIndices are written as short, if aiMesh::mNumVertices<65536 + +[[aiNode]] + + - mParent is omitted + +[[aiLight]] + + - mAttenuationXXX not written if aiLight::mType == aiLightSource_DIRECTIONAL + - mAngleXXX not written if aiLight::mType != aiLightSource_SPOT + +[[aiMaterial]] + + - mNumAllocated is omitted, for obvious reasons :-) + + + @endverbatim*/ + + +#define ASSBIN_HEADER_LENGTH 512 + +// these are the magic chunk identifiers for the binary ASS file format +#define ASSBIN_CHUNK_AICAMERA 0x1234 +#define ASSBIN_CHUNK_AILIGHT 0x1235 +#define ASSBIN_CHUNK_AITEXTURE 0x1236 +#define ASSBIN_CHUNK_AIMESH 0x1237 +#define ASSBIN_CHUNK_AINODEANIM 0x1238 +#define ASSBIN_CHUNK_AISCENE 0x1239 +#define ASSBIN_CHUNK_AIBONE 0x123a +#define ASSBIN_CHUNK_AIANIMATION 0x123b +#define ASSBIN_CHUNK_AINODE 0x123c +#define ASSBIN_CHUNK_AIMATERIAL 0x123d +#define ASSBIN_CHUNK_AIMATERIALPROPERTY 0x123e + +#define ASSBIN_MESH_HAS_POSITIONS 0x1 +#define ASSBIN_MESH_HAS_NORMALS 0x2 +#define ASSBIN_MESH_HAS_TANGENTS_AND_BITANGENTS 0x4 +#define ASSBIN_MESH_HAS_TEXCOORD_BASE 0x100 +#define ASSBIN_MESH_HAS_COLOR_BASE 0x10000 + +#define ASSBIN_MESH_HAS_TEXCOORD(n) (ASSBIN_MESH_HAS_TEXCOORD_BASE << n) +#define ASSBIN_MESH_HAS_COLOR(n) (ASSBIN_MESH_HAS_COLOR_BASE << n) + + +#endif // INCLUDED_ASSBIN_CHUNKS_H diff --git a/thirdparty/assimp/code/scene.cpp b/thirdparty/assimp/code/Common/scene.cpp index 2acb348d81..2acb348d81 100644 --- a/thirdparty/assimp/code/scene.cpp +++ b/thirdparty/assimp/code/Common/scene.cpp diff --git a/thirdparty/assimp/code/simd.cpp b/thirdparty/assimp/code/Common/simd.cpp index 04615f408e..04615f408e 100644 --- a/thirdparty/assimp/code/simd.cpp +++ b/thirdparty/assimp/code/Common/simd.cpp diff --git a/thirdparty/assimp/code/simd.h b/thirdparty/assimp/code/Common/simd.h index 3eecdd4581..3eecdd4581 100644 --- a/thirdparty/assimp/code/simd.h +++ b/thirdparty/assimp/code/Common/simd.h diff --git a/thirdparty/assimp/code/FBXAnimation.cpp b/thirdparty/assimp/code/FBX/FBXAnimation.cpp index 874914431b..874914431b 100644 --- a/thirdparty/assimp/code/FBXAnimation.cpp +++ b/thirdparty/assimp/code/FBX/FBXAnimation.cpp diff --git a/thirdparty/assimp/code/FBXBinaryTokenizer.cpp b/thirdparty/assimp/code/FBX/FBXBinaryTokenizer.cpp index 7138df4315..a4a2bc8e79 100644 --- a/thirdparty/assimp/code/FBXBinaryTokenizer.cpp +++ b/thirdparty/assimp/code/FBX/FBXBinaryTokenizer.cpp @@ -98,7 +98,7 @@ namespace FBX { // return (flags & to_check) != 0; //} // ------------------------------------------------------------------------------------------------ -Token::Token(const char* sbegin, const char* send, TokenType type, unsigned int offset) +Token::Token(const char* sbegin, const char* send, TokenType type, size_t offset) : #ifdef DEBUG contents(sbegin, static_cast<size_t>(send-sbegin)), @@ -122,18 +122,18 @@ namespace { // ------------------------------------------------------------------------------------------------ // signal tokenization error, this is always unrecoverable. Throws DeadlyImportError. -AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int offset) AI_WONT_RETURN_SUFFIX; -AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int offset) +AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) { throw DeadlyImportError(Util::AddOffset("FBX-Tokenize",message,offset)); } // ------------------------------------------------------------------------------------------------ -uint32_t Offset(const char* begin, const char* cursor) { +size_t Offset(const char* begin, const char* cursor) { ai_assert(begin <= cursor); - return static_cast<unsigned int>(cursor - begin); + return cursor - begin; } // ------------------------------------------------------------------------------------------------ @@ -424,7 +424,7 @@ bool ReadScope(TokenList& output_tokens, const char* input, const char*& cursor, // ------------------------------------------------------------------------------------------------ // TODO: Test FBX Binary files newer than the 7500 version to check if the 64 bits address behaviour is consistent -void TokenizeBinary(TokenList& output_tokens, const char* input, unsigned int length) +void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) { ai_assert(input); diff --git a/thirdparty/assimp/code/FBXCommon.h b/thirdparty/assimp/code/FBX/FBXCommon.h index fcb20a5cad..e516449130 100644 --- a/thirdparty/assimp/code/FBXCommon.h +++ b/thirdparty/assimp/code/FBX/FBXCommon.h @@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_EXPORTER - +namespace Assimp { namespace FBX { const std::string NULL_RECORD = { // 13 null bytes @@ -80,7 +80,7 @@ namespace FBX TransformInheritance_MAX // end-of-enum sentinel }; } - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // AI_FBXCOMMON_H_INC diff --git a/thirdparty/assimp/code/FBXCompileConfig.h b/thirdparty/assimp/code/FBX/FBXCompileConfig.h index 3a3841fa5b..3a3841fa5b 100644 --- a/thirdparty/assimp/code/FBXCompileConfig.h +++ b/thirdparty/assimp/code/FBX/FBXCompileConfig.h diff --git a/thirdparty/assimp/code/FBXConverter.cpp b/thirdparty/assimp/code/FBX/FBXConverter.cpp index 09ae06a64f..9f940d3226 100644 --- a/thirdparty/assimp/code/FBXConverter.cpp +++ b/thirdparty/assimp/code/FBX/FBXConverter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <sstream> #include <iomanip> + namespace Assimp { namespace FBX { @@ -76,20 +77,21 @@ namespace Assimp { #define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000L - FBXConverter::FBXConverter(aiScene* out, const Document& doc) - : defaultMaterialIndex() - , lights() - , cameras() - , textures() - , materials_converted() - , textures_converted() - , meshes_converted() - , node_anim_chain_bits() - , mNodeNameInstances() - , mNodeNames() - , anim_fps() - , out(out) - , doc(doc) { + FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit ) + : defaultMaterialIndex() + , lights() + , cameras() + , textures() + , materials_converted() + , textures_converted() + , meshes_converted() + , node_anim_chain_bits() + , mNodeNames() + , anim_fps() + , out(out) + , doc(doc) + , mRemoveEmptyBones( removeEmptyBones ) + , mCurrentUnit(FbxUnit::cm) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -117,6 +119,7 @@ namespace Assimp { ConvertGlobalSettings(); TransferDataToScene(); + ConvertToUnitScale(unit); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE // to make sure the scene passes assimp's validation. FBX files @@ -138,12 +141,46 @@ namespace Assimp { void FBXConverter::ConvertRootNode() { out->mRootNode = new aiNode(); - out->mRootNode->mName.Set("RootNode"); + std::string unique_name; + GetUniqueName("RootNode", unique_name); + out->mRootNode->mName.Set(unique_name); // root has ID 0 ConvertNodes(0L, *out->mRootNode); } + static std::string getAncestorBaseName(const aiNode* node) + { + const char* nodeName = nullptr; + size_t length = 0; + while (node && (!nodeName || length == 0)) + { + nodeName = node->mName.C_Str(); + length = node->mName.length; + node = node->mParent; + } + + if (!nodeName || length == 0) + { + return {}; + } + // could be std::string_view if c++17 available + return std::string(nodeName, length); + } + + // Make unique name + std::string FBXConverter::MakeUniqueNodeName(const Model* const model, const aiNode& parent) + { + std::string original_name = FixNodeName(model->Name()); + if (original_name.empty()) + { + original_name = getAncestorBaseName(&parent); + } + std::string unique_name; + GetUniqueName(original_name, unique_name); + return unique_name; + } + void FBXConverter::ConvertNodes(uint64_t id, aiNode& parent, const aiMatrix4x4& parent_transform) { const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(id, "Model"); @@ -175,35 +212,18 @@ namespace Assimp { aiMatrix4x4 new_abs_transform = parent_transform; + std::string unique_name = MakeUniqueNodeName(model, parent); + // even though there is only a single input node, the design of // assimp (or rather: the complicated transformation chain that // is employed by fbx) means that we may need multiple aiNode's // to represent a fbx node's transformation. - GenerateTransformationNodeChain(*model, nodes_chain, post_nodes_chain); + const bool need_additional_node = GenerateTransformationNodeChain(*model, unique_name, nodes_chain, post_nodes_chain); ai_assert(nodes_chain.size()); - std::string original_name = FixNodeName(model->Name()); - - // check if any of the nodes in the chain has the name the fbx node - // is supposed to have. If there is none, add another node to - // preserve the name - people might have scripts etc. that rely - // on specific node names. - aiNode* name_carrier = NULL; - for (aiNode* prenode : nodes_chain) { - if (!strcmp(prenode->mName.C_Str(), original_name.c_str())) { - name_carrier = prenode; - break; - } - } - - if (!name_carrier) { - std::string old_original_name = original_name; - GetUniqueName(old_original_name, original_name); - nodes_chain.push_back(new aiNode(original_name)); - } - else { - original_name = nodes_chain.back()->mName.C_Str(); + if (need_additional_node) { + nodes_chain.push_back(new aiNode(unique_name)); } //setup metadata on newest node @@ -265,11 +285,11 @@ namespace Assimp { ConvertNodes(model->ID(), *last_parent, new_abs_transform); if (doc.Settings().readLights) { - ConvertLights(*model, original_name); + ConvertLights(*model, unique_name); } if (doc.Settings().readCameras) { - ConvertCameras(*model, original_name); + ConvertCameras(*model, unique_name); } nodes.push_back(nodes_chain.front()); @@ -387,6 +407,7 @@ namespace Assimp { break; default: ai_assert(false); + break; } } @@ -399,11 +420,6 @@ namespace Assimp { out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); - //cameras are defined along positive x direction - /*out_camera->mPosition = cam.Position(); - out_camera->mLookAt = (cam.InterestPosition() - out_camera->mPosition).Normalize(); - out_camera->mUp = cam.UpVector();*/ - out_camera->mPosition = aiVector3D(0.0f); out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); @@ -421,21 +437,16 @@ namespace Assimp { void FBXConverter::GetUniqueName(const std::string &name, std::string &uniqueName) { uniqueName = name; - int i = 0; - auto it = mNodeNameInstances.find(name); // duplicate node name instance count - if (it != mNodeNameInstances.end()) + auto it_pair = mNodeNames.insert({ name, 0 }); // duplicate node name instance count + unsigned int& i = it_pair.first->second; + while (!it_pair.second) { - i = it->second; - while (mNodeNames.find(uniqueName) != mNodeNames.end()) - { - i++; - std::stringstream ext; - ext << name << std::setfill('0') << std::setw(3) << i; - uniqueName = ext.str(); - } + i++; + std::ostringstream ext; + ext << name << std::setfill('0') << std::setw(3) << i; + uniqueName = ext.str(); + it_pair = mNodeNames.insert({ uniqueName, 0 }); } - mNodeNameInstances[name] = i; - mNodeNames.insert(uniqueName); } const char* FBXConverter::NameTransformationComp(TransformationComp comp) { @@ -651,8 +662,7 @@ namespace Assimp { if ((v - all_ones).SquareLength() > zero_epsilon) { return true; } - } - else if (ok) { + } else if (ok) { if (v.SquareLength() > zero_epsilon) { return true; } @@ -667,7 +677,7 @@ namespace Assimp { return name + std::string(MAGIC_NODE_TAG) + "_" + NameTransformationComp(comp); } - void FBXConverter::GenerateTransformationNodeChain(const Model& model, std::vector<aiNode*>& output_nodes, + bool FBXConverter::GenerateTransformationNodeChain(const Model& model, const std::string& name, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes) { const PropertyTable& props = model.Props(); const Model::RotOrder rot = model.RotationOrder(); @@ -782,8 +792,6 @@ namespace Assimp { // not be guaranteed. ai_assert(NeedsComplexTransformationChain(model) == is_complex); - std::string name = FixNodeName(model.Name()); - // now, if we have more than just Translation, Scaling and Rotation, // we need to generate a full node chain to accommodate for assimp's // lack to express pivots and offsets. @@ -825,20 +833,20 @@ namespace Assimp { } ai_assert(output_nodes.size()); - return; + return true; } // else, we can just multiply the matrices together aiNode* nd = new aiNode(); output_nodes.push_back(nd); - std::string uniqueName; - GetUniqueName(name, uniqueName); - nd->mName.Set(uniqueName); + // name passed to the method is already unique + nd->mName.Set(name); for (const auto &transform : chain) { nd->mTransformation = nd->mTransformation * transform; } + return false; } void FBXConverter::SetupNodeMetadata(const Model& model, aiNode& nd) @@ -977,7 +985,9 @@ namespace Assimp { unsigned int epcount = 0; for (unsigned i = 0; i < indices.size(); i++) { - if (indices[i] < 0) epcount++; + if (indices[i] < 0) { + epcount++; + } } unsigned int pcount = static_cast<unsigned int>( indices.size() ); unsigned int scount = out_mesh->mNumFaces = pcount - epcount; @@ -1237,10 +1247,10 @@ namespace Assimp { ai_assert(count_faces); ai_assert(count_vertices); - // mapping from output indices to DOM indexing, needed to resolve weights + // mapping from output indices to DOM indexing, needed to resolve weights or blendshapes std::vector<unsigned int> reverseMapping; - - if (process_weights) { + std::map<unsigned int, unsigned int> translateIndexMap; + if (process_weights || mesh.GetBlendShapes().size() > 0) { reverseMapping.resize(count_vertices); } @@ -1347,6 +1357,7 @@ namespace Assimp { if (reverseMapping.size()) { reverseMapping[cursor] = in_cursor; + translateIndexMap[in_cursor] = cursor; } out_mesh->mVertices[cursor] = vertices[in_cursor]; @@ -1378,6 +1389,50 @@ namespace Assimp { ConvertWeights(out_mesh, model, mesh, node_global_transform, index, &reverseMapping); } + std::vector<aiAnimMesh*> animMeshes; + for (const BlendShape* blendShape : mesh.GetBlendShapes()) { + for (const BlendShapeChannel* blendShapeChannel : blendShape->BlendShapeChannels()) { + const std::vector<const ShapeGeometry*>& shapeGeometries = blendShapeChannel->GetShapeGeometries(); + for (size_t i = 0; i < shapeGeometries.size(); i++) { + aiAnimMesh* animMesh = aiCreateAnimMesh(out_mesh); + const ShapeGeometry* shapeGeometry = shapeGeometries.at(i); + const std::vector<aiVector3D>& vertices = shapeGeometry->GetVertices(); + const std::vector<aiVector3D>& normals = shapeGeometry->GetNormals(); + const std::vector<unsigned int>& indices = shapeGeometry->GetIndices(); + animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name())); + for (size_t j = 0; j < indices.size(); j++) { + unsigned int index = indices.at(j); + aiVector3D vertex = vertices.at(j); + aiVector3D normal = normals.at(j); + unsigned int count = 0; + const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count); + for (unsigned int k = 0; k < count; k++) { + unsigned int outIndex = outIndices[k]; + if (translateIndexMap.find(outIndex) == translateIndexMap.end()) + continue; + unsigned int index = translateIndexMap[outIndex]; + animMesh->mVertices[index] += vertex; + if (animMesh->mNormals != nullptr) { + animMesh->mNormals[index] += normal; + animMesh->mNormals[index].NormalizeSafe(); + } + } + } + animMesh->mWeight = shapeGeometries.size() > 1 ? blendShapeChannel->DeformPercent() / 100.0f : 1.0f; + animMeshes.push_back(animMesh); + } + } + } + + const size_t numAnimMeshes = animMeshes.size(); + if (numAnimMeshes > 0) { + out_mesh->mNumAnimMeshes = static_cast<unsigned int>(numAnimMeshes); + out_mesh->mAnimMeshes = new aiAnimMesh*[numAnimMeshes]; + for (size_t i = 0; i < numAnimMeshes; i++) { + out_mesh->mAnimMeshes[i] = animMeshes.at(i); + } + } + return static_cast<unsigned int>(meshes.size() - 1); } @@ -1407,7 +1462,7 @@ namespace Assimp { const WeightIndexArray& indices = cluster->GetIndices(); - if (indices.empty()) { + if (indices.empty() && mRemoveEmptyBones ) { continue; } @@ -1439,13 +1494,11 @@ namespace Assimp { if (index_out_indices.back() == no_index_sentinel) { index_out_indices.back() = out_indices.size(); - } if (no_mat_check) { out_indices.push_back(out_idx[i]); - } - else { + } else { // this extra lookup is in O(logn), so the entire algorithm becomes O(nlogn) const std::vector<unsigned int>::iterator it = std::lower_bound( outputVertStartIndices->begin(), @@ -1461,11 +1514,11 @@ namespace Assimp { } } } - + // if we found at least one, generate the output bones // XXX this could be heavily simplified by collecting the bone // data in a single step. - if (ok) { + if (ok && mRemoveEmptyBones) { ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, count_out_indices, node_global_transform); } @@ -1596,6 +1649,13 @@ namespace Assimp { out_mat->AddProperty(&str, AI_MATKEY_NAME); } + // Set the shading mode as best we can: The FBX specification only mentions Lambert and Phong, and only Phong is mentioned in Assimp's aiShadingMode enum. + if (material.GetShadingModel() == "phong") + { + aiShadingMode shadingMode = aiShadingMode_Phong; + out_mat->AddProperty<aiShadingMode>(&shadingMode, 1, AI_MATKEY_SHADING_MODEL); + } + // shading stuff and colors SetShadingPropertiesCommon(out_mat, props); SetShadingPropertiesRaw( out_mat, props, material.Textures(), mesh ); @@ -1621,7 +1681,7 @@ namespace Assimp { out_tex->pcData = reinterpret_cast<aiTexel*>(const_cast<Video&>(video).RelinquishContent()); // try to extract a hint from the file extension - const std::string& filename = video.FileName().empty() ? video.RelativeFilename() : video.FileName(); + const std::string& filename = video.RelativeFilename().empty() ? video.FileName() : video.RelativeFilename(); std::string ext = BaseImporter::GetExtension(filename); if (ext == "jpeg") { @@ -1632,7 +1692,7 @@ namespace Assimp { memcpy(out_tex->achFormatHint, ext.c_str(), ext.size()); } - out_tex->mFilename.Set(video.FileName().c_str()); + out_tex->mFilename.Set(filename.c_str()); return static_cast<unsigned int>(textures.size() - 1); } @@ -1678,9 +1738,8 @@ namespace Assimp { } void FBXConverter::TrySetTextureProperties(aiMaterial* out_mat, const TextureMap& textures, - const std::string& propName, - aiTextureType target, const MeshGeometry* const mesh) - { + const std::string& propName, + aiTextureType target, const MeshGeometry* const mesh) { TextureMap::const_iterator it = textures.find(propName); if (it == textures.end()) { return; @@ -3407,8 +3466,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa na->mNumScalingKeys = static_cast<unsigned int>(keys.size()); na->mScalingKeys = new aiVectorKey[keys.size()]; - if (keys.size() > 0) + if (keys.size() > 0) { InterpolateKeys(na->mScalingKeys, keys, inputs, aiVector3D(1.0f, 1.0f, 1.0f), maxTime, minTime); + } } void FBXConverter::ConvertTranslationKeys(aiNodeAnim* na, const std::vector<const AnimationCurveNode*>& nodes, @@ -3472,6 +3532,46 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate()); } + void FBXConverter::ConvertToUnitScale( FbxUnit unit ) { + if (mCurrentUnit == unit) { + return; + } + + ai_real scale = 1.0; + if (mCurrentUnit == FbxUnit::cm) { + if (unit == FbxUnit::m) { + scale = (ai_real)0.01; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.00001; + } + } else if (mCurrentUnit == FbxUnit::m) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100.0; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.001; + } + } else if (mCurrentUnit == FbxUnit::km) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100000.0; + } else if (unit == FbxUnit::m) { + scale = (ai_real)1000.0; + } + } + + for (auto mesh : meshes) { + if (nullptr == mesh) { + continue; + } + + if (mesh->HasPositions()) { + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + aiVector3D &pos = mesh->mVertices[i]; + pos *= scale; + } + } + } + } + void FBXConverter::TransferDataToScene() { ai_assert(!out->mMeshes); @@ -3525,9 +3625,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa } // ------------------------------------------------------------------------------------------------ - void ConvertToAssimpScene(aiScene* out, const Document& doc) + void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit) { - FBXConverter converter(out, doc); + FBXConverter converter(out, doc, removeEmptyBones, unit); } } // !FBX diff --git a/thirdparty/assimp/code/FBXConverter.h b/thirdparty/assimp/code/FBX/FBXConverter.h index 50637468b9..17a7bc56b7 100644 --- a/thirdparty/assimp/code/FBXConverter.h +++ b/thirdparty/assimp/code/FBX/FBXConverter.h @@ -52,6 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXUtil.h" #include "FBXProperties.h" #include "FBXImporter.h" + #include <assimp/anim.h> #include <assimp/material.h> #include <assimp/light.h> @@ -76,12 +77,22 @@ namespace FBX { class Document; +enum class FbxUnit { + cm = 0, + m, + km, + NumUnits, + + Undefined +}; + /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated - * @param doc Parsed FBX document + * @param doc Parsed FBX document + * @param removeEmptyBones Will remove bones, which do not have any references to vertices. */ -void ConvertToAssimpScene(aiScene* out, const Document& doc); +void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); /** Dummy class to encapsulate the conversion process */ class FBXConverter { @@ -112,7 +123,7 @@ public: }; public: - FBXConverter(aiScene* out, const Document& doc); + FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); ~FBXConverter(); private: @@ -145,6 +156,11 @@ private: const char* NameTransformationComp(TransformationComp comp); // ------------------------------------------------------------------------------------------------ + // Returns an unique name for a node or traverses up a hierarchy until a non-empty name is found and + // then makes this name unique + std::string MakeUniqueNodeName(const Model* const model, const aiNode& parent); + + // ------------------------------------------------------------------------------------------------ // note: this returns the REAL fbx property names const char* NameTransformationCompProperty(TransformationComp comp); @@ -167,7 +183,7 @@ private: /** * note: memory for output_nodes will be managed by the caller */ - void GenerateTransformationNodeChain(const Model& model, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes); + bool GenerateTransformationNodeChain(const Model& model, const std::string& name, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes); // ------------------------------------------------------------------------------------------------ void SetupNodeMetadata(const Model& model, aiNode& nd); @@ -415,6 +431,10 @@ private: void ConvertGlobalSettings(); // ------------------------------------------------------------------------------------------------ + // Will perform the conversion from a given unit to the requested unit. + void ConvertToUnitScale(FbxUnit unit); + + // ------------------------------------------------------------------------------------------------ // copy generated meshes, animations, lights, cameras and textures to the output scene void TransferDataToScene(); @@ -443,16 +463,17 @@ private: NodeAnimBitMap node_anim_chain_bits; // number of nodes with the same name - using NodeAnimNameMap = std::unordered_map<std::string, unsigned int>; - NodeAnimNameMap mNodeNameInstances; - - using NodeNameCache = std::unordered_set<std::string>; + using NodeNameCache = std::unordered_map<std::string, unsigned int>; NodeNameCache mNodeNames; double anim_fps; aiScene* const out; const FBX::Document& doc; + + bool mRemoveEmptyBones; + + FbxUnit mCurrentUnit; }; } diff --git a/thirdparty/assimp/code/FBXDeformer.cpp b/thirdparty/assimp/code/FBX/FBXDeformer.cpp index 6927553450..6927553450 100644 --- a/thirdparty/assimp/code/FBXDeformer.cpp +++ b/thirdparty/assimp/code/FBX/FBXDeformer.cpp diff --git a/thirdparty/assimp/code/FBXDocument.cpp b/thirdparty/assimp/code/FBX/FBXDocument.cpp index 1af08fe6d8..1af08fe6d8 100644 --- a/thirdparty/assimp/code/FBXDocument.cpp +++ b/thirdparty/assimp/code/FBX/FBXDocument.cpp diff --git a/thirdparty/assimp/code/FBXDocument.h b/thirdparty/assimp/code/FBX/FBXDocument.h index c849defdcd..18e5c38f13 100644 --- a/thirdparty/assimp/code/FBXDocument.h +++ b/thirdparty/assimp/code/FBX/FBXDocument.h @@ -627,7 +627,7 @@ public: return content; } - uint32_t ContentLength() const { + uint64_t ContentLength() const { return contentLength; } @@ -643,7 +643,7 @@ private: std::string fileName; std::shared_ptr<const PropertyTable> props; - uint32_t contentLength; + uint64_t contentLength; uint8_t* content; }; diff --git a/thirdparty/assimp/code/FBXDocumentUtil.cpp b/thirdparty/assimp/code/FBX/FBXDocumentUtil.cpp index f84691479a..f84691479a 100644 --- a/thirdparty/assimp/code/FBXDocumentUtil.cpp +++ b/thirdparty/assimp/code/FBX/FBXDocumentUtil.cpp diff --git a/thirdparty/assimp/code/FBXDocumentUtil.h b/thirdparty/assimp/code/FBX/FBXDocumentUtil.h index 2450109e59..2450109e59 100644 --- a/thirdparty/assimp/code/FBXDocumentUtil.h +++ b/thirdparty/assimp/code/FBX/FBXDocumentUtil.h diff --git a/thirdparty/assimp/code/FBXExportNode.cpp b/thirdparty/assimp/code/FBX/FBXExportNode.cpp index e5215466a1..06c89cee46 100644 --- a/thirdparty/assimp/code/FBXExportNode.cpp +++ b/thirdparty/assimp/code/FBX/FBXExportNode.cpp @@ -54,6 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <sstream> // ostringstream #include <memory> // shared_ptr +namespace Assimp { // AddP70<type> helpers... there's no usable pattern here, // so all are defined as separate functions. // Even "animatable" properties are often completely different @@ -252,7 +253,8 @@ void FBX::Node::DumpChildren( } else { std::ostringstream ss; DumpChildrenAscii(ss, indent); - s.PutString(ss.str()); + if (ss.tellp() > 0) + s.PutString(ss.str()); } } @@ -266,7 +268,8 @@ void FBX::Node::End( } else { std::ostringstream ss; EndAscii(ss, indent, has_children); - s.PutString(ss.str()); + if (ss.tellp() > 0) + s.PutString(ss.str()); } } @@ -367,7 +370,7 @@ void FBX::Node::EndBinary( bool has_children ) { // if there were children, add a null record - if (has_children) { s.PutString(FBX::NULL_RECORD); } + if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD); } // now go back and write initial pos this->end_pos = s.Tell(); @@ -563,6 +566,6 @@ void FBX::Node::WritePropertyNode( FBX::Node::WritePropertyNodeAscii(name, v, s, indent); } } - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/FBXExportNode.h b/thirdparty/assimp/code/FBX/FBXExportNode.h index e1ebc36969..ef3bc781a4 100644 --- a/thirdparty/assimp/code/FBXExportNode.h +++ b/thirdparty/assimp/code/FBX/FBXExportNode.h @@ -54,16 +54,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <string> #include <vector> +namespace Assimp { namespace FBX { class Node; } -class FBX::Node -{ -public: // public data members +class FBX::Node { +public: // TODO: accessors std::string name; // node name - std::vector<FBX::Property> properties; // node properties + std::vector<FBX::FBXExportProperty> properties; // node properties std::vector<FBX::Node> children; // child nodes // some nodes always pretend they have children... @@ -214,7 +214,7 @@ public: // static member functions Assimp::StreamWriterLE& s, bool binary, int indent ) { - FBX::Property p(value); + FBX::FBXExportProperty p(value); FBX::Node node(name, p); node.Dump(s, binary, indent); } @@ -264,7 +264,7 @@ private: // static helper functions ); }; - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER diff --git a/thirdparty/assimp/code/FBXExportProperty.cpp b/thirdparty/assimp/code/FBX/FBXExportProperty.cpp index 9981d6b1c6..f8593e6295 100644 --- a/thirdparty/assimp/code/FBXExportProperty.cpp +++ b/thirdparty/assimp/code/FBX/FBXExportProperty.cpp @@ -52,187 +52,210 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <locale> #include <sstream> // ostringstream +namespace Assimp { +namespace FBX { // constructors for single element properties -FBX::Property::Property(bool v) - : type('C'), data(1) -{ - data = {uint8_t(v)}; +FBXExportProperty::FBXExportProperty(bool v) +: type('C') +, data(1) { + data = { + uint8_t(v) + }; } -FBX::Property::Property(int16_t v) : type('Y'), data(2) -{ +FBXExportProperty::FBXExportProperty(int16_t v) +: type('Y') +, data(2) { uint8_t* d = data.data(); (reinterpret_cast<int16_t*>(d))[0] = v; } -FBX::Property::Property(int32_t v) : type('I'), data(4) -{ +FBXExportProperty::FBXExportProperty(int32_t v) +: type('I') +, data(4) { uint8_t* d = data.data(); (reinterpret_cast<int32_t*>(d))[0] = v; } -FBX::Property::Property(float v) : type('F'), data(4) -{ +FBXExportProperty::FBXExportProperty(float v) +: type('F') +, data(4) { uint8_t* d = data.data(); (reinterpret_cast<float*>(d))[0] = v; } -FBX::Property::Property(double v) : type('D'), data(8) -{ +FBXExportProperty::FBXExportProperty(double v) +: type('D') +, data(8) { uint8_t* d = data.data(); (reinterpret_cast<double*>(d))[0] = v; } -FBX::Property::Property(int64_t v) : type('L'), data(8) -{ +FBXExportProperty::FBXExportProperty(int64_t v) +: type('L') +, data(8) { uint8_t* d = data.data(); (reinterpret_cast<int64_t*>(d))[0] = v; } - // constructors for array-type properties -FBX::Property::Property(const char* c, bool raw) - : Property(std::string(c), raw) -{} +FBXExportProperty::FBXExportProperty(const char* c, bool raw) +: FBXExportProperty(std::string(c), raw) { + // empty +} // strings can either be saved as "raw" (R) data, or "string" (S) data -FBX::Property::Property(const std::string& s, bool raw) - : type(raw ? 'R' : 'S'), data(s.size()) -{ +FBXExportProperty::FBXExportProperty(const std::string& s, bool raw) +: type(raw ? 'R' : 'S') +, data(s.size()) { for (size_t i = 0; i < s.size(); ++i) { data[i] = uint8_t(s[i]); } } -FBX::Property::Property(const std::vector<uint8_t>& r) - : type('R'), data(r) -{} +FBXExportProperty::FBXExportProperty(const std::vector<uint8_t>& r) +: type('R') +, data(r) { + // empty +} -FBX::Property::Property(const std::vector<int32_t>& va) - : type('i'), data(4*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<int32_t>& va) +: type('i') +, data(4 * va.size() ) { int32_t* d = reinterpret_cast<int32_t*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<int64_t>& va) - : type('l'), data(8*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<int64_t>& va) +: type('l') +, data(8 * va.size()) { int64_t* d = reinterpret_cast<int64_t*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<float>& va) - : type('f'), data(4*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<float>& va) +: type('f') +, data(4 * va.size()) { float* d = reinterpret_cast<float*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<double>& va) - : type('d'), data(8*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<double>& va) +: type('d') +, data(8 * va.size()) { double* d = reinterpret_cast<double*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const aiMatrix4x4& vm) - : type('d'), data(8*16) -{ +FBXExportProperty::FBXExportProperty(const aiMatrix4x4& vm) +: type('d') +, data(8 * 16) { double* d = reinterpret_cast<double*>(data.data()); for (unsigned int c = 0; c < 4; ++c) { for (unsigned int r = 0; r < 4; ++r) { - d[4*c+r] = vm[r][c]; + d[4 * c + r] = vm[r][c]; } } } // public member functions -size_t FBX::Property::size() -{ +size_t FBXExportProperty::size() { switch (type) { - case 'C': case 'Y': case 'I': case 'F': case 'D': case 'L': - return data.size() + 1; - case 'S': case 'R': - return data.size() + 5; - case 'i': case 'd': - return data.size() + 13; - default: - throw DeadlyExportError("Requested size on property of unknown type"); + case 'C': + case 'Y': + case 'I': + case 'F': + case 'D': + case 'L': + return data.size() + 1; + case 'S': + case 'R': + return data.size() + 5; + case 'i': + case 'd': + return data.size() + 13; + default: + throw DeadlyExportError("Requested size on property of unknown type"); } } -void FBX::Property::DumpBinary(Assimp::StreamWriterLE &s) -{ +void FBXExportProperty::DumpBinary(Assimp::StreamWriterLE& s) { s.PutU1(type); uint8_t* d = data.data(); size_t N; switch (type) { - case 'C': s.PutU1(*(reinterpret_cast<uint8_t*>(d))); return; - case 'Y': s.PutI2(*(reinterpret_cast<int16_t*>(d))); return; - case 'I': s.PutI4(*(reinterpret_cast<int32_t*>(d))); return; - case 'F': s.PutF4(*(reinterpret_cast<float*>(d))); return; - case 'D': s.PutF8(*(reinterpret_cast<double*>(d))); return; - case 'L': s.PutI8(*(reinterpret_cast<int64_t*>(d))); return; - case 'S': - case 'R': - s.PutU4(uint32_t(data.size())); - for (size_t i = 0; i < data.size(); ++i) { s.PutU1(data[i]); } - return; - case 'i': - N = data.size() / 4; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutI4((reinterpret_cast<int32_t*>(d))[i]); - } - return; - case 'l': - N = data.size() / 8; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutI8((reinterpret_cast<int64_t*>(d))[i]); - } - return; - case 'f': - N = data.size() / 4; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutF4((reinterpret_cast<float*>(d))[i]); - } - return; - case 'd': - N = data.size() / 8; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutF8((reinterpret_cast<double*>(d))[i]); - } - return; - default: - std::ostringstream err; - err << "Tried to dump property with invalid type '"; - err << type << "'!"; - throw DeadlyExportError(err.str()); + case 'C': s.PutU1(*(reinterpret_cast<uint8_t*>(d))); return; + case 'Y': s.PutI2(*(reinterpret_cast<int16_t*>(d))); return; + case 'I': s.PutI4(*(reinterpret_cast<int32_t*>(d))); return; + case 'F': s.PutF4(*(reinterpret_cast<float*>(d))); return; + case 'D': s.PutF8(*(reinterpret_cast<double*>(d))); return; + case 'L': s.PutI8(*(reinterpret_cast<int64_t*>(d))); return; + case 'S': + case 'R': + s.PutU4(uint32_t(data.size())); + for (size_t i = 0; i < data.size(); ++i) { s.PutU1(data[i]); } + return; + case 'i': + N = data.size() / 4; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutI4((reinterpret_cast<int32_t*>(d))[i]); + } + return; + case 'l': + N = data.size() / 8; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutI8((reinterpret_cast<int64_t*>(d))[i]); + } + return; + case 'f': + N = data.size() / 4; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutF4((reinterpret_cast<float*>(d))[i]); + } + return; + case 'd': + N = data.size() / 8; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutF8((reinterpret_cast<double*>(d))[i]); + } + return; + default: + std::ostringstream err; + err << "Tried to dump property with invalid type '"; + err << type << "'!"; + throw DeadlyExportError(err.str()); } } -void FBX::Property::DumpAscii(Assimp::StreamWriterLE &outstream, int indent) -{ +void FBXExportProperty::DumpAscii(Assimp::StreamWriterLE& outstream, int indent) { std::ostringstream ss; ss.imbue(std::locale::classic()); ss.precision(15); // this seems to match official FBX SDK exports @@ -240,8 +263,7 @@ void FBX::Property::DumpAscii(Assimp::StreamWriterLE &outstream, int indent) outstream.PutString(ss.str()); } -void FBX::Property::DumpAscii(std::ostream& s, int indent) -{ +void FBXExportProperty::DumpAscii(std::ostream& s, int indent) { // no writing type... or anything. just shove it into the stream. uint8_t* d = data.data(); size_t N; @@ -360,5 +382,8 @@ void FBX::Property::DumpAscii(std::ostream& s, int indent) } } +} // Namespace FBX +} // Namespace Assimp + #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/FBXExportProperty.h b/thirdparty/assimp/code/FBX/FBXExportProperty.h index 9c9d37c362..d692fe6ee3 100644 --- a/thirdparty/assimp/code/FBXExportProperty.h +++ b/thirdparty/assimp/code/FBX/FBXExportProperty.h @@ -47,7 +47,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_EXPORTER - #include <assimp/types.h> // aiMatrix4x4 #include <assimp/StreamWriter.h> // StreamWriterLE @@ -56,11 +55,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <ostream> #include <type_traits> // is_void +namespace Assimp { namespace FBX { - class Property; -} -/** FBX::Property +/** @brief FBX::Property * * Holds a value of any of FBX's recognized types, * each represented by a particular one-character code. @@ -78,35 +76,34 @@ namespace FBX { * S : string (array of 1-byte char) * R : raw data (array of bytes) */ -class FBX::Property -{ +class FBXExportProperty { public: // constructors for basic types. // all explicit to avoid accidental typecasting - explicit Property(bool v); + explicit FBXExportProperty(bool v); // TODO: determine if there is actually a byte type, // or if this always means <bool>. 'C' seems to imply <char>, // so possibly the above was intended to represent both. - explicit Property(int16_t v); - explicit Property(int32_t v); - explicit Property(float v); - explicit Property(double v); - explicit Property(int64_t v); + explicit FBXExportProperty(int16_t v); + explicit FBXExportProperty(int32_t v); + explicit FBXExportProperty(float v); + explicit FBXExportProperty(double v); + explicit FBXExportProperty(int64_t v); // strings can either be stored as 'R' (raw) or 'S' (string) type - explicit Property(const char* c, bool raw=false); - explicit Property(const std::string& s, bool raw=false); - explicit Property(const std::vector<uint8_t>& r); - explicit Property(const std::vector<int32_t>& va); - explicit Property(const std::vector<int64_t>& va); - explicit Property(const std::vector<double>& va); - explicit Property(const std::vector<float>& va); - explicit Property(const aiMatrix4x4& vm); + explicit FBXExportProperty(const char* c, bool raw = false); + explicit FBXExportProperty(const std::string& s, bool raw = false); + explicit FBXExportProperty(const std::vector<uint8_t>& r); + explicit FBXExportProperty(const std::vector<int32_t>& va); + explicit FBXExportProperty(const std::vector<int64_t>& va); + explicit FBXExportProperty(const std::vector<double>& va); + explicit FBXExportProperty(const std::vector<float>& va); + explicit FBXExportProperty(const aiMatrix4x4& vm); // this will catch any type not defined above, // so that we don't accidentally convert something we don't want. // for example (const char*) --> (bool)... seriously wtf C++ template <class T> - explicit Property(T v) : type('X') { + explicit FBXExportProperty(T v) : type('X') { static_assert(std::is_void<T>::value, "TRIED TO CREATE FBX PROPERTY WITH UNSUPPORTED TYPE, CHECK YOUR PROPERTY INSTANTIATION"); } // note: no line wrap so it appears verbatim on the compiler error @@ -114,9 +111,9 @@ public: size_t size(); // write this property node as binary data to the given stream - void DumpBinary(Assimp::StreamWriterLE &s); - void DumpAscii(Assimp::StreamWriterLE &s, int indent=0); - void DumpAscii(std::ostream &s, int indent=0); + void DumpBinary(Assimp::StreamWriterLE& s); + void DumpAscii(Assimp::StreamWriterLE& s, int indent = 0); + void DumpAscii(std::ostream& s, int indent = 0); // note: make sure the ostream is in classic "C" locale private: @@ -124,6 +121,9 @@ private: std::vector<uint8_t> data; }; +} // Namespace FBX +} // Namespace Assimp + #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // AI_FBXEXPORTPROPERTY_H_INC diff --git a/thirdparty/assimp/code/FBXExporter.cpp b/thirdparty/assimp/code/FBX/FBXExporter.cpp index acb1227144..153e676506 100644 --- a/thirdparty/assimp/code/FBXExporter.cpp +++ b/thirdparty/assimp/code/FBX/FBXExporter.cpp @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXExportNode.h" #include "FBXExportProperty.h" #include "FBXCommon.h" +#include "FBXUtil.h" #include <assimp/version.h> // aiGetVersion #include <assimp/IOSystem.hpp> @@ -73,7 +74,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. const ai_real DEG = ai_real( 57.29577951308232087679815481 ); // degrees per radian +using namespace Assimp; +using namespace Assimp::FBX; + // some constants that we'll use for writing metadata +namespace Assimp { namespace FBX { const std::string EXPORT_VERSION_STR = "7.4.0"; const uint32_t EXPORT_VERSION_INT = 7400; // 7.4 == 2014/2015 @@ -92,11 +97,6 @@ namespace FBX { ";------------------------------------------------------------------"; } -using namespace Assimp; -using namespace FBX; - -namespace Assimp { - // --------------------------------------------------------------------- // Worker function for exporting a scene to binary FBX. // Prototyped and registered in Exporter.cpp @@ -121,6 +121,7 @@ namespace Assimp { IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties + ){ // initialize the exporter FBXExporter exporter(pScene, pProperties); @@ -1218,6 +1219,16 @@ void FBXExporter::WriteObjects () layer.AddChild(le); layer.Dump(outstream, binary, indent); + for(unsigned int lr = 1; lr < m->GetNumUVChannels(); ++ lr) + { + FBX::Node layerExtra("Layer", int32_t(1)); + layerExtra.AddChild("Version", int32_t(100)); + FBX::Node leExtra("LayerElement"); + leExtra.AddChild("Type", "LayerElementUV"); + leExtra.AddChild("TypedIndex", int32_t(lr)); + layerExtra.AddChild(leExtra); + layerExtra.Dump(outstream, binary, indent); + } // finish the node record indent = 1; n.End(outstream, binary, indent, true); @@ -1393,10 +1404,6 @@ void FBXExporter::WriteObjects () // FbxVideo - stores images used by textures. for (const auto &it : uid_by_image) { - if (it.first.compare(0, 1, "*") == 0) { - // TODO: embedded textures - continue; - } FBX::Node n("Video"); const int64_t& uid = it.second; const std::string name = ""; // TODO: ... name??? @@ -1406,7 +1413,33 @@ void FBXExporter::WriteObjects () // TODO: get full path... relative path... etc... ugh... // for now just use the same path for everything, // and hopefully one of them will work out. - const std::string& path = it.first; + std::string path = it.first; + // try get embedded texture + const aiTexture* embedded_texture = mScene->GetEmbeddedTexture(it.first.c_str()); + if (embedded_texture != nullptr) { + // change the path (use original filename, if available. If name is empty, concatenate texture index with file extension) + std::stringstream newPath; + if (embedded_texture->mFilename.length > 0) { + newPath << embedded_texture->mFilename.C_Str(); + } else if (embedded_texture->achFormatHint[0]) { + int texture_index = std::stoi(path.substr(1, path.size() - 1)); + newPath << texture_index << "." << embedded_texture->achFormatHint; + } + path = newPath.str(); + // embed the texture + size_t texture_size = static_cast<size_t>(embedded_texture->mWidth * std::max(embedded_texture->mHeight, 1u)); + if (binary) { + // embed texture as binary data + std::vector<uint8_t> tex_data; + tex_data.resize(texture_size); + memcpy(&tex_data[0], (char*)embedded_texture->pcData, texture_size); + n.AddChild("Content", tex_data); + } else { + // embed texture in base64 encoding + std::string encoded_texture = FBX::Util::EncodeBase64((char*)embedded_texture->pcData, texture_size); + n.AddChild("Content", encoded_texture); + } + } p.AddP70("Path", "KString", "XRefUrl", "", path); n.AddChild(p); n.AddChild("UseMipMap", int32_t(0)); @@ -1419,17 +1452,17 @@ void FBXExporter::WriteObjects () // referenced by material_index/texture_type pairs. std::map<std::pair<size_t,size_t>,int64_t> texture_uids; const std::map<aiTextureType,std::string> prop_name_by_tt = { - {aiTextureType_DIFFUSE, "DiffuseColor"}, - {aiTextureType_SPECULAR, "SpecularColor"}, - {aiTextureType_AMBIENT, "AmbientColor"}, - {aiTextureType_EMISSIVE, "EmissiveColor"}, - {aiTextureType_HEIGHT, "Bump"}, - {aiTextureType_NORMALS, "NormalMap"}, - {aiTextureType_SHININESS, "ShininessExponent"}, - {aiTextureType_OPACITY, "TransparentColor"}, + {aiTextureType_DIFFUSE, "DiffuseColor"}, + {aiTextureType_SPECULAR, "SpecularColor"}, + {aiTextureType_AMBIENT, "AmbientColor"}, + {aiTextureType_EMISSIVE, "EmissiveColor"}, + {aiTextureType_HEIGHT, "Bump"}, + {aiTextureType_NORMALS, "NormalMap"}, + {aiTextureType_SHININESS, "ShininessExponent"}, + {aiTextureType_OPACITY, "TransparentColor"}, {aiTextureType_DISPLACEMENT, "DisplacementColor"}, //{aiTextureType_LIGHTMAP, "???"}, - {aiTextureType_REFLECTION, "ReflectionColor"} + {aiTextureType_REFLECTION, "ReflectionColor"} //{aiTextureType_UNKNOWN, ""} }; for (size_t i = 0; i < mScene->mNumMaterials; ++i) { @@ -1575,19 +1608,41 @@ void FBXExporter::WriteObjects () // one sticky point is that the number of vertices may not match, // because assimp splits vertices by normal, uv, etc. + // functor for aiNode sorting + struct SortNodeByName + { + bool operator()(const aiNode *lhs, const aiNode *rhs) const + { + return strcmp(lhs->mName.C_Str(), rhs->mName.C_Str()) < 0; + } + }; + // first we should mark the skeleton for each mesh. // the skeleton must include not only the aiBones, // but also all their parent nodes. // anything that affects the position of any bone node must be included. - std::vector<std::set<const aiNode*>> skeleton_by_mesh(mScene->mNumMeshes); + // Use SorNodeByName to make sure the exported result will be the same across all systems + // Otherwise the aiNodes of the skeleton would be sorted based on the pointer address, which isn't consistent + std::vector<std::set<const aiNode*, SortNodeByName>> skeleton_by_mesh(mScene->mNumMeshes); // at the same time we can build a list of all the skeleton nodes, // which will be used later to mark them as type "limbNode". std::unordered_set<const aiNode*> limbnodes; + + //actual bone nodes in fbx, without parenting-up + std::unordered_set<std::string> setAllBoneNamesInScene; + for(unsigned int m = 0; m < mScene->mNumMeshes; ++ m) + { + aiMesh* pMesh = mScene->mMeshes[m]; + for(unsigned int b = 0; b < pMesh->mNumBones; ++ b) + setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); + } + aiMatrix4x4 mxTransIdentity; + // and a map of nodes by bone name, as finding them is annoying. std::map<std::string,aiNode*> node_by_bone; for (size_t mi = 0; mi < mScene->mNumMeshes; ++mi) { const aiMesh* m = mScene->mMeshes[mi]; - std::set<const aiNode*> skeleton; + std::set<const aiNode*, SortNodeByName> skeleton; for (size_t bi =0; bi < m->mNumBones; ++bi) { const aiBone* b = m->mBones[bi]; const std::string name(b->mName.C_Str()); @@ -1626,6 +1681,11 @@ void FBXExporter::WriteObjects () if (node_name.find(MAGIC_NODE_TAG) != std::string::npos) { continue; } + //not a bone in scene && no effect in transform + if(setAllBoneNamesInScene.find(node_name)==setAllBoneNamesInScene.end() + && parent->mTransformation == mxTransIdentity) { + continue; + } // otherwise check if this is the root of the skeleton bool end = false; // is the mesh part of this node? @@ -1728,7 +1788,7 @@ void FBXExporter::WriteObjects () aiMatrix4x4 mesh_xform = get_world_transform(mesh_node, mScene); // now make a subdeformer for each bone in the skeleton - const std::set<const aiNode*> &skeleton = skeleton_by_mesh[mi]; + const std::set<const aiNode*, SortNodeByName> skeleton= skeleton_by_mesh[mi]; for (const aiNode* bone_node : skeleton) { // if there's a bone for this node, find it const aiBone* b = nullptr; @@ -1790,7 +1850,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); @@ -2237,8 +2300,8 @@ void FBXExporter::WriteModelNode( // not sure what these are for, // but they seem to be omnipresent - m.AddChild("Shading", Property(true)); - m.AddChild("Culling", Property("CullingOff")); + m.AddChild("Shading", FBXExportProperty(true)); + m.AddChild("Culling", FBXExportProperty("CullingOff")); m.Dump(outstream, binary, 1); } @@ -2351,7 +2414,7 @@ void FBXExporter::WriteModelNodes( na.AddProperties( node_attribute_uid, FBX::SEPARATOR + "NodeAttribute", "LimbNode" ); - na.AddChild("TypeFlags", Property("Skeleton")); + na.AddChild("TypeFlags", FBXExportProperty("Skeleton")); na.Dump(outstream, binary, 1); // and connect them connections.emplace_back("C", "OO", node_attribute_uid, node_uid); diff --git a/thirdparty/assimp/code/FBXExporter.h b/thirdparty/assimp/code/FBX/FBXExporter.h index 71fb55c57f..71fb55c57f 100644 --- a/thirdparty/assimp/code/FBXExporter.h +++ b/thirdparty/assimp/code/FBX/FBXExporter.h diff --git a/thirdparty/assimp/code/FBXImportSettings.h b/thirdparty/assimp/code/FBX/FBXImportSettings.h index d5e1c20608..1a4c80f8b2 100644 --- a/thirdparty/assimp/code/FBXImportSettings.h +++ b/thirdparty/assimp/code/FBX/FBXImportSettings.h @@ -53,19 +53,22 @@ namespace FBX { struct ImportSettings { ImportSettings() - : strictMode(true) - , readAllLayers(true) - , readAllMaterials(false) - , readMaterials(true) - , readTextures(true) - , readCameras(true) - , readLights(true) - , readAnimations(true) - , readWeights(true) - , preservePivots(true) - , optimizeEmptyAnimationCurves(true) - , useLegacyEmbeddedTextureNaming(false) - {} + : strictMode(true) + , readAllLayers(true) + , readAllMaterials(false) + , readMaterials(true) + , readTextures(true) + , readCameras(true) + , readLights(true) + , readAnimations(true) + , readWeights(true) + , preservePivots(true) + , optimizeEmptyAnimationCurves(true) + , useLegacyEmbeddedTextureNaming(false) + , removeEmptyBones( true ) + , convertToMeters( false ) { + // empty + } /** enable strict mode: @@ -141,8 +144,16 @@ struct ImportSettings bool optimizeEmptyAnimationCurves; /** use legacy naming for embedded textures eg: (*0, *1, *2) - **/ + */ bool useLegacyEmbeddedTextureNaming; + + /** Empty bones shall be removed + */ + bool removeEmptyBones; + + /** Set to true to perform a conversion from cm to meter after the import + */ + bool convertToMeters; }; diff --git a/thirdparty/assimp/code/FBXImporter.cpp b/thirdparty/assimp/code/FBX/FBXImporter.cpp index 2cc8bffc29..ec8bbd2b47 100644 --- a/thirdparty/assimp/code/FBXImporter.cpp +++ b/thirdparty/assimp/code/FBX/FBXImporter.cpp @@ -140,6 +140,8 @@ void FBXImporter::SetupProperties(const Importer* pImp) settings.preservePivots = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, true); settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true); settings.useLegacyEmbeddedTextureNaming = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING, false); + settings.removeEmptyBones = pImp->GetPropertyBool(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true); + settings.convertToMeters = pImp->GetPropertyBool(AI_CONFIG_FBX_CONVERT_TO_M, false); } // ------------------------------------------------------------------------------------------------ @@ -170,7 +172,7 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS bool is_binary = false; if (!strncmp(begin,"Kaydara FBX Binary",18)) { is_binary = true; - TokenizeBinary(tokens,begin,static_cast<unsigned int>(contents.size())); + TokenizeBinary(tokens,begin,contents.size()); } else { Tokenize(tokens,begin); @@ -183,8 +185,12 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // take the raw parse-tree and convert it to a FBX DOM Document doc(parser,settings); + FbxUnit unit(FbxUnit::cm); + if (settings.convertToMeters) { + unit = FbxUnit::m; + } // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene,doc); + ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun<Token>()); } diff --git a/thirdparty/assimp/code/FBXImporter.h b/thirdparty/assimp/code/FBX/FBXImporter.h index c365b2cddf..c365b2cddf 100644 --- a/thirdparty/assimp/code/FBXImporter.h +++ b/thirdparty/assimp/code/FBX/FBXImporter.h diff --git a/thirdparty/assimp/code/FBXMaterial.cpp b/thirdparty/assimp/code/FBX/FBXMaterial.cpp index f16f134404..f43a8b84b0 100644 --- a/thirdparty/assimp/code/FBXMaterial.cpp +++ b/thirdparty/assimp/code/FBX/FBXMaterial.cpp @@ -316,7 +316,7 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std relativeFileName = ParseTokenAsString(GetRequiredToken(*RelativeFilename,0)); } - if(Content) { + if(Content && !Content->Tokens().empty()) { //this field is omitted when the embedded texture is already loaded, let's ignore if it's not found try { const Token& token = GetRequiredToken(*Content, 0); @@ -326,16 +326,40 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std DOMError("embedded content is not surrounded by quotation marks", &element); } else { - const char* encodedData = data + 1; - size_t encodedDataLen = static_cast<size_t>(token.end() - token.begin()); - // search for last quotation mark - while (encodedDataLen > 1 && encodedData[encodedDataLen] != '"') - encodedDataLen--; - if (encodedDataLen % 4 != 0) { - DOMError("embedded content is invalid, needs to be in base64", &element); + size_t targetLength = 0; + auto numTokens = Content->Tokens().size(); + // First time compute size (it could be large like 64Gb and it is good to allocate it once) + for (uint32_t tokenIdx = 0; tokenIdx < numTokens; ++tokenIdx) + { + const Token& dataToken = GetRequiredToken(*Content, tokenIdx); + size_t tokenLength = dataToken.end() - dataToken.begin() - 2; // ignore double quotes + const char* base64data = dataToken.begin() + 1; + const size_t outLength = Util::ComputeDecodedSizeBase64(base64data, tokenLength); + if (outLength == 0) + { + DOMError("Corrupted embedded content found", &element); + } + targetLength += outLength; } - else { - contentLength = Util::DecodeBase64(encodedData, encodedDataLen, content); + if (targetLength == 0) + { + DOMError("Corrupted embedded content found", &element); + } + content = new uint8_t[targetLength]; + contentLength = static_cast<uint64_t>(targetLength); + size_t dst_offset = 0; + for (uint32_t tokenIdx = 0; tokenIdx < numTokens; ++tokenIdx) + { + const Token& dataToken = GetRequiredToken(*Content, tokenIdx); + size_t tokenLength = dataToken.end() - dataToken.begin() - 2; // ignore double quotes + const char* base64data = dataToken.begin() + 1; + dst_offset += Util::DecodeBase64(base64data, tokenLength, content + dst_offset, targetLength - dst_offset); + } + if (targetLength != dst_offset) + { + delete[] content; + contentLength = 0; + DOMError("Corrupted embedded content found", &element); } } } diff --git a/thirdparty/assimp/code/FBXMeshGeometry.cpp b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp index d75476b826..44a0264ca0 100644 --- a/thirdparty/assimp/code/FBXMeshGeometry.cpp +++ b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp @@ -568,15 +568,15 @@ void MeshGeometry::ReadVertexDataColors(std::vector<aiColor4D>& colors_out, cons } // ------------------------------------------------------------------------------------------------ -static const std::string TangentIndexToken = "TangentIndex"; -static const std::string TangentsIndexToken = "TangentsIndex"; +static const char *TangentIndexToken = "TangentIndex"; +static const char *TangentsIndexToken = "TangentsIndex"; void MeshGeometry::ReadVertexDataTangents(std::vector<aiVector3D>& tangents_out, const Scope& source, const std::string& MappingInformationType, const std::string& ReferenceInformationType) { const char * str = source.Elements().count( "Tangents" ) > 0 ? "Tangents" : "Tangent"; - const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken.c_str() : TangentIndexToken.c_str(); + const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken : TangentIndexToken; ResolveVertexDataArray(tangents_out,source,MappingInformationType,ReferenceInformationType, str, strIdx, @@ -630,10 +630,11 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector<int>& materials_out, cons materials_out.clear(); } - m_materials.assign(m_vertices.size(),materials_out[0]); + materials_out.resize(m_vertices.size()); + std::fill(materials_out.begin(), materials_out.end(), materials_out.at(0)); } else if (MappingInformationType == "ByPolygon" && ReferenceInformationType == "IndexToDirect") { - m_materials.resize(face_count); + materials_out.resize(face_count); if(materials_out.size() != face_count) { FBXImporter::LogError(Formatter::format("length of input data unexpected for ByPolygon mapping: ") diff --git a/thirdparty/assimp/code/FBXMeshGeometry.h b/thirdparty/assimp/code/FBX/FBXMeshGeometry.h index d6d4512177..d6d4512177 100644 --- a/thirdparty/assimp/code/FBXMeshGeometry.h +++ b/thirdparty/assimp/code/FBX/FBXMeshGeometry.h diff --git a/thirdparty/assimp/code/FBXModel.cpp b/thirdparty/assimp/code/FBX/FBXModel.cpp index 589af36ac7..589af36ac7 100644 --- a/thirdparty/assimp/code/FBXModel.cpp +++ b/thirdparty/assimp/code/FBX/FBXModel.cpp diff --git a/thirdparty/assimp/code/FBXNodeAttribute.cpp b/thirdparty/assimp/code/FBX/FBXNodeAttribute.cpp index b72e5637ee..b72e5637ee 100644 --- a/thirdparty/assimp/code/FBXNodeAttribute.cpp +++ b/thirdparty/assimp/code/FBX/FBXNodeAttribute.cpp diff --git a/thirdparty/assimp/code/FBXParser.cpp b/thirdparty/assimp/code/FBX/FBXParser.cpp index b255c47347..4a9346040d 100644 --- a/thirdparty/assimp/code/FBXParser.cpp +++ b/thirdparty/assimp/code/FBX/FBXParser.cpp @@ -117,7 +117,7 @@ namespace FBX { Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { - TokenPtr n = NULL; + TokenPtr n = nullptr; do { n = parser.AdvanceToNextToken(); if(!n) { @@ -643,9 +643,9 @@ void ParseVectorDataArray(std::vector<aiVector3D>& out, const Element& el) if (type == 'd') { const double* d = reinterpret_cast<const double*>(&buff[0]); for (unsigned int i = 0; i < count3; ++i, d += 3) { - out.push_back(aiVector3D(static_cast<float>(d[0]), - static_cast<float>(d[1]), - static_cast<float>(d[2]))); + out.push_back(aiVector3D(static_cast<ai_real>(d[0]), + static_cast<ai_real>(d[1]), + static_cast<ai_real>(d[2]))); } // for debugging /*for ( size_t i = 0; i < out.size(); i++ ) { @@ -963,7 +963,6 @@ void ParseVectorDataArray(std::vector<float>& out, const Element& el) } } - // ------------------------------------------------------------------------------------------------ // read an array of uints void ParseVectorDataArray(std::vector<unsigned int>& out, const Element& el) @@ -1280,7 +1279,6 @@ float ParseTokenAsFloat(const Token& t) return i; } - // ------------------------------------------------------------------------------------------------ // wrapper around ParseTokenAsInt() with ParseError handling int ParseTokenAsInt(const Token& t) @@ -1293,8 +1291,6 @@ int ParseTokenAsInt(const Token& t) return i; } - - // ------------------------------------------------------------------------------------------------ // wrapper around ParseTokenAsInt64() with ParseError handling int64_t ParseTokenAsInt64(const Token& t) diff --git a/thirdparty/assimp/code/FBXParser.h b/thirdparty/assimp/code/FBX/FBXParser.h index 7b0cf72039..7b0cf72039 100644 --- a/thirdparty/assimp/code/FBXParser.h +++ b/thirdparty/assimp/code/FBX/FBXParser.h diff --git a/thirdparty/assimp/code/FBXProperties.cpp b/thirdparty/assimp/code/FBX/FBXProperties.cpp index 8d7036b6a9..8d7036b6a9 100644 --- a/thirdparty/assimp/code/FBXProperties.cpp +++ b/thirdparty/assimp/code/FBX/FBXProperties.cpp diff --git a/thirdparty/assimp/code/FBXProperties.h b/thirdparty/assimp/code/FBX/FBXProperties.h index 58755542fc..58755542fc 100644 --- a/thirdparty/assimp/code/FBXProperties.h +++ b/thirdparty/assimp/code/FBX/FBXProperties.h diff --git a/thirdparty/assimp/code/FBXTokenizer.cpp b/thirdparty/assimp/code/FBX/FBXTokenizer.cpp index 252cce3557..252cce3557 100644 --- a/thirdparty/assimp/code/FBXTokenizer.cpp +++ b/thirdparty/assimp/code/FBX/FBXTokenizer.cpp diff --git a/thirdparty/assimp/code/FBXTokenizer.h b/thirdparty/assimp/code/FBX/FBXTokenizer.h index 2af29743f4..afa588a470 100644 --- a/thirdparty/assimp/code/FBXTokenizer.h +++ b/thirdparty/assimp/code/FBX/FBXTokenizer.h @@ -93,7 +93,7 @@ public: Token(const char* sbegin, const char* send, TokenType type, unsigned int line, unsigned int column); /** construct a binary token */ - Token(const char* sbegin, const char* send, TokenType type, unsigned int offset); + Token(const char* sbegin, const char* send, TokenType type, size_t offset); ~Token(); @@ -118,14 +118,14 @@ public: return type; } - unsigned int Offset() const { + size_t Offset() const { ai_assert(IsBinary()); return offset; } unsigned int Line() const { ai_assert(!IsBinary()); - return line; + return static_cast<unsigned int>(line); } unsigned int Column() const { @@ -147,8 +147,8 @@ private: const TokenType type; union { - const unsigned int line; - unsigned int offset; + size_t line; + size_t offset; }; const unsigned int column; }; @@ -178,7 +178,7 @@ void Tokenize(TokenList& output_tokens, const char* input); * @param input_buffer Binary input buffer to be processed. * @param length Length of input buffer, in bytes. There is no 0-terminal. * @throw DeadlyImportError if something goes wrong */ -void TokenizeBinary(TokenList& output_tokens, const char* input, unsigned int length); +void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length); } // ! FBX diff --git a/thirdparty/assimp/code/FBXUtil.cpp b/thirdparty/assimp/code/FBX/FBXUtil.cpp index fb483161b2..c10e057c8c 100644 --- a/thirdparty/assimp/code/FBXUtil.cpp +++ b/thirdparty/assimp/code/FBX/FBXUtil.cpp @@ -86,7 +86,7 @@ const char* TokenTypeString(TokenType t) // ------------------------------------------------------------------------------------------------ -std::string AddOffset(const std::string& prefix, const std::string& text, unsigned int offset) +std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset) { return static_cast<std::string>( (Formatter::format() << prefix << " (offset 0x" << std::hex << offset << ") " << text) ); } @@ -114,47 +114,126 @@ std::string AddTokenText(const std::string& prefix, const std::string& text, con text) ); } +// Generated by this formula: T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; static const uint8_t base64DecodeTable[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255, + 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, + 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255 }; uint8_t DecodeBase64(char ch) { - return base64DecodeTable[size_t(ch)]; + const auto idx = static_cast<uint8_t>(ch); + if (idx > 127) + return 255; + return base64DecodeTable[idx]; } -size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) +size_t ComputeDecodedSizeBase64(const char* in, size_t inLength) { - if (inLength < 4) { - out = 0; + if (inLength < 2) + { + return 0; + } + const size_t equals = size_t(in[inLength - 1] == '=') + size_t(in[inLength - 2] == '='); + const size_t full_length = (inLength * 3) >> 2; // div by 4 + if (full_length < equals) + { + return 0; + } + return full_length - equals; +} + +size_t DecodeBase64(const char* in, size_t inLength, uint8_t* out, size_t maxOutLength) +{ + if (maxOutLength == 0 || inLength < 2) { return 0; } + const size_t realLength = inLength - size_t(in[inLength - 1] == '=') - size_t(in[inLength - 2] == '='); + size_t dst_offset = 0; + int val = 0, valb = -8; + for (size_t src_offset = 0; src_offset < realLength; ++src_offset) + { + const uint8_t table_value = Util::DecodeBase64(in[src_offset]); + if (table_value == 255) + { + return 0; + } + val = (val << 6) + table_value; + valb += 6; + if (valb >= 0) + { + out[dst_offset++] = static_cast<uint8_t>((val >> valb) & 0xFF); + valb -= 8; + val &= 0xFFF; + } + } + return dst_offset; +} - const size_t outLength = (inLength * 3) / 4; - out = new uint8_t[outLength]; - memset(out, 0, outLength); +static const char to_base64_string[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +char EncodeBase64(char byte) +{ + return to_base64_string[(size_t)byte]; +} - size_t i = 0; - size_t j = 0; - for (i = 0; i < inLength - 4; i += 4) +/** Encodes a block of 4 bytes to base64 encoding +* +* @param bytes Bytes to encode. +* @param out_string String to write encoded values to. +* @param string_pos Position in out_string.*/ +void EncodeByteBlock(const char* bytes, std::string& out_string, size_t string_pos) +{ + char b0 = (bytes[0] & 0xFC) >> 2; + char b1 = (bytes[0] & 0x03) << 4 | ((bytes[1] & 0xF0) >> 4); + char b2 = (bytes[1] & 0x0F) << 2 | ((bytes[2] & 0xC0) >> 6); + char b3 = (bytes[2] & 0x3F); + + out_string[string_pos + 0] = EncodeBase64(b0); + out_string[string_pos + 1] = EncodeBase64(b1); + out_string[string_pos + 2] = EncodeBase64(b2); + out_string[string_pos + 3] = EncodeBase64(b3); +} + +std::string EncodeBase64(const char* data, size_t length) +{ + // calculate extra bytes needed to get a multiple of 3 + size_t extraBytes = 3 - length % 3; + + // number of base64 bytes + size_t encodedBytes = 4 * (length + extraBytes) / 3; + + std::string encoded_string(encodedBytes, '='); + + // read blocks of 3 bytes + for (size_t ib3 = 0; ib3 < length / 3; ib3++) { - uint8_t b0 = Util::DecodeBase64(in[i]); - uint8_t b1 = Util::DecodeBase64(in[i + 1]); - uint8_t b2 = Util::DecodeBase64(in[i + 2]); - uint8_t b3 = Util::DecodeBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - out[j++] = (uint8_t)((b2 << 6) | b3); + const size_t iByte = ib3 * 3; + const size_t iEncodedByte = ib3 * 4; + const char* currData = &data[iByte]; + + EncodeByteBlock(currData, encoded_string, iEncodedByte); + } + + // if size of data is not a multiple of 3, also encode the final bytes (and add zeros where needed) + if (extraBytes > 0) + { + char finalBytes[4] = { 0,0,0,0 }; + memcpy(&finalBytes[0], &data[length - length % 3], length % 3); + + const size_t iEncodedByte = encodedBytes - 4; + EncodeByteBlock(&finalBytes[0], encoded_string, iEncodedByte); + + // add '=' at the end + for (size_t i = 0; i < 4 * extraBytes / 3; i++) + encoded_string[encodedBytes - i - 1] = '='; } - return outLength; + return encoded_string; } } // !Util diff --git a/thirdparty/assimp/code/FBXUtil.h b/thirdparty/assimp/code/FBX/FBXUtil.h index 6890e015ba..b634418858 100644 --- a/thirdparty/assimp/code/FBXUtil.h +++ b/thirdparty/assimp/code/FBX/FBXUtil.h @@ -78,7 +78,7 @@ const char* TokenTypeString(TokenType t); * @param line Line index, 1-based * @param column Column index, 1-based * @return A string of the following format: {prefix} (offset 0x{offset}) {text}*/ -std::string AddOffset(const std::string& prefix, const std::string& text, unsigned int offset); +std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset); /** Format log/error messages using a given line location in the source file. @@ -105,13 +105,30 @@ std::string AddTokenText(const std::string& prefix, const std::string& text, con * @return decoded byte value*/ uint8_t DecodeBase64(char ch); +/** Compute decoded size of a Base64-encoded string +* +* @param in Characters to decode. +* @param inLength Number of characters to decode. +* @return size of the decoded data (number of bytes)*/ +size_t ComputeDecodedSizeBase64(const char* in, size_t inLength); + /** Decode a Base64-encoded string * * @param in Characters to decode. * @param inLength Number of characters to decode. -* @param out Reference to pointer where we will store the decoded data. +* @param out Pointer where we will store the decoded data. +* @param maxOutLength Size of output buffer. * @return size of the decoded data (number of bytes)*/ -size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); +size_t DecodeBase64(const char* in, size_t inLength, uint8_t* out, size_t maxOutLength); + +char EncodeBase64(char byte); + +/** Encode bytes in base64-encoding +* +* @param data Binary data to encode. +* @param inLength Number of bytes to encode. +* @return base64-encoded string*/ +std::string EncodeBase64(const char* data, size_t length); } } diff --git a/thirdparty/assimp/code/FIReader.cpp b/thirdparty/assimp/code/FIReader.cpp deleted file mode 100644 index 2116316ca3..0000000000 --- a/thirdparty/assimp/code/FIReader.cpp +++ /dev/null @@ -1,1834 +0,0 @@ -/* -Open Asset Import Library (assimp) ----------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the -following conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ----------------------------------------------------------------------- -*/ -/// \file FIReader.cpp -/// \brief Reader for Fast Infoset encoded binary XML files. -/// \date 2017 -/// \author Patrick Daehne - -#ifndef ASSIMP_BUILD_NO_X3D_IMPORTER - -#include "FIReader.hpp" -#include <assimp/StringUtils.h> - -// Workaround for issue #1361 -// https://github.com/assimp/assimp/issues/1361 -#ifdef __ANDROID__ -# define _GLIBCXX_USE_C99 1 -#endif - -#include <assimp/Exceptional.h> -#include <assimp/IOStream.hpp> -#include <assimp/types.h> -#include <assimp/MemoryIOWrapper.h> -#include <assimp/irrXMLWrapper.h> -#include "../contrib/utf8cpp/source/utf8.h" -#include <assimp/fast_atof.h> -#include <stack> -#include <map> -#include <iostream> -#include <sstream> -#include <iomanip> - -namespace Assimp { - -static const std::string parseErrorMessage = "Fast Infoset parse error"; - -static const char *xmlDeclarations[] = { - "<?xml encoding='finf'?>", - "<?xml encoding='finf' standalone='yes'?>", - "<?xml encoding='finf' standalone='no'?>", - "<?xml version='1.0' encoding='finf'?>", - "<?xml version='1.0' encoding='finf' standalone='yes'?>", - "<?xml version='1.0' encoding='finf' standalone='no'?>", - "<?xml version='1.1' encoding='finf'?>", - "<?xml version='1.1' encoding='finf' standalone='yes'?>", - "<?xml version='1.1' encoding='finf' standalone='no'?>" -}; - -static size_t parseMagic(const uint8_t *data, const uint8_t *dataEnd) { - if (dataEnd - data < 4) { - return 0; - } - uint32_t magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - switch (magic) { - case 0xe0000001: - return 4; - case 0x3c3f786d: // "<?xm" - { - size_t xmlDeclarationsLength = sizeof(xmlDeclarations) / sizeof(xmlDeclarations[0]); - for (size_t i = 0; i < xmlDeclarationsLength; ++i) { - auto xmlDeclaration = xmlDeclarations[i]; - ptrdiff_t xmlDeclarationLength = strlen(xmlDeclaration); - if ((dataEnd - data >= xmlDeclarationLength) && (memcmp(xmlDeclaration, data, xmlDeclarationLength) == 0)) { - data += xmlDeclarationLength; - if (dataEnd - data < 4) { - return 0; - } - magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - return magic == 0xe0000001 ? xmlDeclarationLength + 4 : 0; - } - } - return 0; - } - default: - return 0; - } -} - -static std::string parseUTF8String(const uint8_t *data, size_t len) { - return std::string((char*)data, len); -} - -static std::string parseUTF16String(const uint8_t *data, size_t len) { - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t numShorts = len / 2; - std::vector<short> utf16; - utf16.reserve(numShorts); - for (size_t i = 0; i < numShorts; ++i) { - short v = (data[0] << 8) | data[1]; - utf16.push_back(v); - data += 2; - } - std::string result; - utf8::utf16to8(utf16.begin(), utf16.end(), back_inserter(result)); - return result; -} - -struct FIStringValueImpl: public FIStringValue { - inline FIStringValueImpl(std::string &&value_) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { return value; } -}; - -std::shared_ptr<FIStringValue> FIStringValue::create(std::string &&value) { - return std::make_shared<FIStringValueImpl>(std::move(value)); -} - -struct FIHexValueImpl: public FIHexValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIHexValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::hex << std::uppercase << std::setfill('0'); - std::for_each(value.begin(), value.end(), [&](uint8_t c) { os << std::setw(2) << static_cast<int>(c); }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIHexValue> FIHexValue::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIHexValueImpl>(std::move(value)); -} - -struct FIBase64ValueImpl: public FIBase64Value { - mutable std::string strValue; - mutable bool strValueValid; - inline FIBase64ValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - uint8_t c1 = 0, c2; - int imod3 = 0; - std::vector<uint8_t>::size_type valueSize = value.size(); - for (std::vector<uint8_t>::size_type i = 0; i < valueSize; ++i) { - c2 = value[i]; - switch (imod3) { - case 0: - os << basis_64[c2 >> 2]; - imod3 = 1; - break; - case 1: - os << basis_64[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)]; - imod3 = 2; - break; - case 2: - os << basis_64[((c1 & 0x0f) << 2) | ((c2 & 0xc0) >> 6)] << basis_64[c2 & 0x3f]; - imod3 = 0; - break; - } - c1 = c2; - } - switch (imod3) { - case 1: - os << basis_64[(c1 & 0x03) << 4] << "=="; - break; - case 2: - os << basis_64[(c1 & 0x0f) << 2] << '='; - break; - } - strValue = os.str(); - } - return strValue; - }; - static const char basis_64[]; -}; - -const char FIBase64ValueImpl::basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -std::shared_ptr<FIBase64Value> FIBase64Value::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIBase64ValueImpl>(std::move(value)); -} - -struct FIShortValueImpl: public FIShortValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIShortValueImpl(std::vector<int16_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int16_t s) { if (++n > 1) os << ' '; os << s; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIShortValue> FIShortValue::create(std::vector<int16_t> &&value) { - return std::make_shared<FIShortValueImpl>(std::move(value)); -} - -struct FIIntValueImpl: public FIIntValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIIntValueImpl(std::vector<int32_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int32_t i) { if (++n > 1) os << ' '; os << i; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIIntValue> FIIntValue::create(std::vector<int32_t> &&value) { - return std::make_shared<FIIntValueImpl>(std::move(value)); -} - -struct FILongValueImpl: public FILongValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FILongValueImpl(std::vector<int64_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int64_t l) { if (++n > 1) os << ' '; os << l; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FILongValue> FILongValue::create(std::vector<int64_t> &&value) { - return std::make_shared<FILongValueImpl>(std::move(value)); -} - -struct FIBoolValueImpl: public FIBoolValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIBoolValueImpl(std::vector<bool> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::boolalpha; - int n = 0; - std::for_each(value.begin(), value.end(), [&](bool b) { if (++n > 1) os << ' '; os << b; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIBoolValue> FIBoolValue::create(std::vector<bool> &&value) { - return std::make_shared<FIBoolValueImpl>(std::move(value)); -} - -struct FIFloatValueImpl: public FIFloatValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIFloatValueImpl(std::vector<float> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](float f) { if (++n > 1) os << ' '; os << f; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIFloatValue> FIFloatValue::create(std::vector<float> &&value) { - return std::make_shared<FIFloatValueImpl>(std::move(value)); -} - -struct FIDoubleValueImpl: public FIDoubleValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIDoubleValueImpl(std::vector<double> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](double d) { if (++n > 1) os << ' '; os << d; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIDoubleValue> FIDoubleValue::create(std::vector<double> &&value) { - return std::make_shared<FIDoubleValueImpl>(std::move(value)); -} - -struct FIUUIDValueImpl: public FIUUIDValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIUUIDValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::hex << std::uppercase << std::setfill('0'); - std::vector<uint8_t>::size_type valueSize = value.size(); - for (std::vector<uint8_t>::size_type i = 0; i < valueSize; ++i) { - switch (i & 15) { - case 0: - if (i > 0) { - os << ' '; - } - os << std::setw(2) << static_cast<int>(value[i]); - break; - case 4: - case 6: - case 8: - case 10: - os << '-'; - // intentionally fall through! - case 1: - case 2: - case 3: - case 5: - case 7: - case 9: - case 11: - case 12: - case 13: - case 14: - case 15: - os << std::setw(2) << static_cast<int>(value[i]); - break; - } - } - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIUUIDValue> FIUUIDValue::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIUUIDValueImpl>(std::move(value)); -} - -struct FICDATAValueImpl: public FICDATAValue { - inline FICDATAValueImpl(std::string &&value_) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { return value; } -}; - -std::shared_ptr<FICDATAValue> FICDATAValue::create(std::string &&value) { - return std::make_shared<FICDATAValueImpl>(std::move(value)); -} - -struct FIHexDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FIHexValue::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FIBase64Decoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FIBase64Value::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FIShortDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int16_t> value; - size_t numShorts = len / 2; - value.reserve(numShorts); - for (size_t i = 0; i < numShorts; ++i) { - int16_t v = (data[0] << 8) | data[1]; - value.push_back(v); - data += 2; - } - return FIShortValue::create(std::move(value)); - } -}; - -struct FIIntDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 3) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int32_t> value; - size_t numInts = len / 4; - value.reserve(numInts); - for (size_t i = 0; i < numInts; ++i) { - int32_t v = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - value.push_back(v); - data += 4; - } - return FIIntValue::create(std::move(value)); - } -}; - -struct FILongDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 7) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int64_t> value; - size_t numLongs = len / 8; - value.reserve(numLongs); - for (size_t i = 0; i < numLongs; ++i) { - int64_t b0 = data[0], b1 = data[1], b2 = data[2], b3 = data[3], b4 = data[4], b5 = data[5], b6 = data[6], b7 = data[7]; - int64_t v = (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) | (b4 << 24) | (b5 << 16) | (b6 << 8) | b7; - value.push_back(v); - data += 8; - } - return FILongValue::create(std::move(value)); - } -}; - -struct FIBoolDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<bool> value; - uint8_t b = *data++; - size_t unusedBits = b >> 4; - size_t numBools = (len * 8) - 4 - unusedBits; - value.reserve(numBools); - uint8_t mask = 1 << 3; - for (size_t i = 0; i < numBools; ++i) { - if (!mask) { - mask = 1 << 7; - b = *data++; - } - value.push_back((b & mask) != 0); - } - return FIBoolValue::create(std::move(value)); - } -}; - -struct FIFloatDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 3) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<float> value; - size_t numFloats = len / 4; - value.reserve(numFloats); - for (size_t i = 0; i < numFloats; ++i) { - int v = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - float f; - memcpy(&f, &v, 4); - value.push_back(f); - data += 4; - } - return FIFloatValue::create(std::move(value)); - } -}; - -struct FIDoubleDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 7) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<double> value; - size_t numDoubles = len / 8; - value.reserve(numDoubles); - for (size_t i = 0; i < numDoubles; ++i) { - long long b0 = data[0], b1 = data[1], b2 = data[2], b3 = data[3], b4 = data[4], b5 = data[5], b6 = data[6], b7 = data[7]; - long long v = (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) | (b4 << 24) | (b5 << 16) | (b6 << 8) | b7; - double f; - memcpy(&f, &v, 8); - value.push_back(f); - data += 8; - } - return FIDoubleValue::create(std::move(value)); - } -}; - -struct FIUUIDDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 15) { - throw DeadlyImportError(parseErrorMessage); - } - return FIUUIDValue::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FICDATADecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FICDATAValue::create(parseUTF8String(data, len)); - } -}; - -class CFIReaderImpl: public FIReader { -public: - - CFIReaderImpl(std::unique_ptr<uint8_t[]> data_, size_t size): - data(std::move(data_)), dataP(data.get()), dataEnd(data.get() + size), currentNodeType(irr::io::EXN_NONE), - emptyElement(false), headerPending(true), terminatorPending(false) - {} - - virtual ~CFIReaderImpl() {} - - virtual bool read() /*override*/ { - if (headerPending) { - headerPending = false; - parseHeader(); - } - if (terminatorPending) { - terminatorPending = false; - if (elementStack.empty()) { - return false; - } - else { - nodeName = elementStack.top(); - elementStack.pop(); - currentNodeType = nodeName.empty() ? irr::io::EXN_UNKNOWN : irr::io::EXN_ELEMENT_END; - return true; - } - } - if (dataP >= dataEnd) { - return false; - } - uint8_t b = *dataP; - if (b < 0x80) { // Element (C.2.11.2, C.3.7.2) - // C.3 - parseElement(); - return true; - } - else if (b < 0xc0) { // Characters (C.3.7.5) - // C.7 - auto chars = parseNonIdentifyingStringOrIndex3(vocabulary.charactersTable); - nodeName = chars->toString(); - currentNodeType = irr::io::EXN_TEXT; - return true; - } - else if (b < 0xe0) { - if ((b & 0xfc) == 0xc4) { // DTD (C.2.11.5) - // C.9 - ++dataP; - if (b & 0x02) { - /*const std::string &systemID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b & 0x01) { - /*const std::string &publicID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - elementStack.push(EmptyString); - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - else if ((b & 0xfc) == 0xc8) { // Unexpanded entity reference (C.3.7.4) - // C.6 - ++dataP; - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (b & 0x02) { - /*const std::string &systemID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b & 0x01) { - /*const std::string &publicID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - } - else if (b < 0xf0) { - if (b == 0xe1) { // Processing instruction (C.2.11.3, C.3.7.3) - // C.5 - ++dataP; - /*const std::string &target =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::shared_ptr<const FIValue> data =*/ parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - else if (b == 0xe2) { // Comment (C.2.11.4, C.3.7.6) - // C.8 - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::shared_ptr<const FIValue> comment = parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - nodeName = comment->toString(); - currentNodeType = irr::io::EXN_COMMENT; - return true; - } - } - else { // Terminator (C.2.12, C.3.8) - ++dataP; - if (b == 0xff) { - terminatorPending = true; - } - if (elementStack.empty()) { - return false; - } - else { - nodeName = elementStack.top(); - elementStack.pop(); - currentNodeType = nodeName.empty() ? irr::io::EXN_UNKNOWN : irr::io::EXN_ELEMENT_END; - return true; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - virtual irr::io::EXML_NODE getNodeType() const /*override*/ { - return currentNodeType; - } - - virtual int getAttributeCount() const /*override*/ { - return static_cast<int>(attributes.size()); - } - - virtual const char* getAttributeName(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].name.c_str(); - } - - virtual const char* getAttributeValue(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].value->toString().c_str(); - } - - virtual const char* getAttributeValue(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return nullptr; - } - return attr->value->toString().c_str(); - } - - virtual const char* getAttributeValueSafe(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return EmptyString.c_str(); - } - return attr->value->toString().c_str(); - } - - virtual int getAttributeValueAsInt(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return 0; - } - std::shared_ptr<const FIIntValue> intValue = std::dynamic_pointer_cast<const FIIntValue>(attr->value); - if (intValue) { - return intValue->value.size() == 1 ? intValue->value.front() : 0; - } - return atoi(attr->value->toString().c_str()); - } - - virtual int getAttributeValueAsInt(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return 0; - } - std::shared_ptr<const FIIntValue> intValue = std::dynamic_pointer_cast<const FIIntValue>(attributes[idx].value); - if (intValue) { - return intValue->value.size() == 1 ? intValue->value.front() : 0; - } - return atoi(attributes[idx].value->toString().c_str()); - } - - virtual float getAttributeValueAsFloat(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return 0; - } - std::shared_ptr<const FIFloatValue> floatValue = std::dynamic_pointer_cast<const FIFloatValue>(attr->value); - if (floatValue) { - return floatValue->value.size() == 1 ? floatValue->value.front() : 0; - } - - return fast_atof(attr->value->toString().c_str()); - } - - virtual float getAttributeValueAsFloat(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return 0; - } - std::shared_ptr<const FIFloatValue> floatValue = std::dynamic_pointer_cast<const FIFloatValue>(attributes[idx].value); - if (floatValue) { - return floatValue->value.size() == 1 ? floatValue->value.front() : 0; - } - return fast_atof(attributes[idx].value->toString().c_str()); - } - - virtual const char* getNodeName() const /*override*/ { - return nodeName.c_str(); - } - - virtual const char* getNodeData() const /*override*/ { - return nodeName.c_str(); - } - - virtual bool isEmptyElement() const /*override*/ { - return emptyElement; - } - - virtual irr::io::ETEXT_FORMAT getSourceFormat() const /*override*/ { - return irr::io::ETF_UTF8; - } - - virtual irr::io::ETEXT_FORMAT getParserFormat() const /*override*/ { - return irr::io::ETF_UTF8; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].value; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return nullptr; - } - return attr->value; - } - - virtual void registerDecoder(const std::string &algorithmUri, std::unique_ptr<FIDecoder> decoder) /*override*/ { - decoderMap[algorithmUri] = std::move(decoder); - } - - virtual void registerVocabulary(const std::string &vocabularyUri, const FIVocabulary *vocabulary) /*override*/ { - vocabularyMap[vocabularyUri] = vocabulary; - } - -private: - - struct QName { - std::string prefix; - std::string uri; - std::string name; - inline QName() {} - inline QName(const FIQName &qname): prefix(qname.prefix ? qname.prefix : ""), uri(qname.uri ? qname.uri : ""), name(qname.name) {} - }; - - struct Attribute { - QName qname; - std::string name; - std::shared_ptr<const FIValue> value; - }; - - struct Vocabulary { - std::vector<std::string> restrictedAlphabetTable; - std::vector<std::string> encodingAlgorithmTable; - std::vector<std::string> prefixTable; - std::vector<std::string> namespaceNameTable; - std::vector<std::string> localNameTable; - std::vector<std::string> otherNCNameTable; - std::vector<std::string> otherURITable; - std::vector<std::shared_ptr<const FIValue>> attributeValueTable; - std::vector<std::shared_ptr<const FIValue>> charactersTable; - std::vector<std::shared_ptr<const FIValue>> otherStringTable; - std::vector<QName> elementNameTable; - std::vector<QName> attributeNameTable; - Vocabulary() { - prefixTable.push_back("xml"); - namespaceNameTable.push_back("http://www.w3.org/XML/1998/namespace"); - } - }; - - const Attribute* getAttributeByName(const char* name) const { - if (!name) { - return 0; - } - std::string n = name; - for (int i=0; i<(int)attributes.size(); ++i) { - if (attributes[i].name == n) { - return &attributes[i]; - } - } - return 0; - } - - size_t parseInt2() { // C.25 - uint8_t b = *dataP++; - if (!(b & 0x40)) { // x0...... (C.25.2) - return b & 0x3f; - } - else if ((b & 0x60) == 0x40) { // x10..... ........ (C.25.3) - if (dataEnd - dataP > 0) { - return (((b & 0x1f) << 8) | *dataP++) + 0x40; - } - } - else if ((b & 0x70) == 0x60) { // x110.... ........ ........ (C.25.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x0f) << 16) | (dataP[0] << 8) | dataP[1]) + 0x2040; - dataP += 2; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseInt3() { // C.27 - uint8_t b = *dataP++; - if (!(b & 0x20)) { // xx0..... (C.27.2) - return b & 0x1f; - } - else if ((b & 0x38) == 0x20) { // xx100... ........ (C.27.3) - if (dataEnd - dataP > 0) { - return (((b & 0x07) << 8) | *dataP++) + 0x20; - } - } - else if ((b & 0x38) == 0x28) { // xx101... ........ ........ (C.27.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x07) << 16) | (dataP[0] << 8) | dataP[1]) + 0x820; - dataP += 2; - return result; - } - } - else if ((b & 0x3f) == 0x30) { // xx110000 0000.... ........ ........ (C.27.5) - if ((dataEnd - dataP > 2) && !(dataP[0] & 0xf0)) { - size_t result = (((dataP[0] & 0x0f) << 16) | (dataP[1] << 8) | dataP[2]) + 0x80820; - dataP += 3; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseInt4() { // C.28 - uint8_t b = *dataP++; - if (!(b & 0x10)) { // xxx0.... (C.28.2) - return b & 0x0f; - } - else if ((b & 0x1c) == 0x10) { // xxx100.. ........ (C.28.3) - if (dataEnd - dataP > 0) { - return (((b & 0x03) << 8) | *dataP++) + 0x10; - } - } - else if ((b & 0x1c) == 0x14) { // xxx101.. ........ ........ (C.28.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x03) << 16) | (dataP[0] << 8) | dataP[1]) + 0x410; - dataP += 2; - return result; - } - } - else if ((b & 0x1f) == 0x18) { // xxx11000 0000.... ........ ........ (C.28.5) - if ((dataEnd - dataP > 2) && !(dataP[0] & 0xf0)) { - size_t result = (((dataP[0] & 0x0f) << 16) | (dataP[1] << 8) | dataP[2]) + 0x40410; - dataP += 3; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseSequenceLen() { // C.21 - if (dataEnd - dataP > 0) { - uint8_t b = *dataP++; - if (b < 0x80) { // 0....... (C.21.2) - return b; - } - else if ((b & 0xf0) == 0x80) { // 1000.... ........ ........ (C.21.3) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x0f) << 16) | (dataP[0] << 8) | dataP[1]) + 0x80; - dataP += 2; - return result; - } - } - } - throw DeadlyImportError(parseErrorMessage); - } - - std::string parseNonEmptyOctetString2() { // C.22 - // Parse the length of the string - uint8_t b = *dataP++ & 0x7f; - size_t len; - if (!(b & 0x40)) { // x0...... (C.22.3.1) - len = b + 1; - } - else if (b == 0x40) { // x1000000 ........ (C.22.3.2) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - len = *dataP++ + 0x41; - } - else if (b == 0x60) { // x1100000 ........ ........ ........ ........ (C.22.3.3) - if (dataEnd - dataP < 4) { - throw DeadlyImportError(parseErrorMessage); - } - len = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x141; - dataP += 4; - } - else { - throw DeadlyImportError(parseErrorMessage); - } - - // Parse the string (C.22.4) - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - std::string s = parseUTF8String(dataP, len); - dataP += len; - - return s; - } - - size_t parseNonEmptyOctetString5Length() { // C.23 - // Parse the length of the string - size_t b = *dataP++ & 0x0f; - if (!(b & 0x08)) { // xxxx0... (C.23.3.1) - return b + 1; - } - else if (b == 0x08) { // xxxx1000 ........ (C.23.3.2) - if (dataEnd - dataP > 0) { - return *dataP++ + 0x09; - } - } - else if (b == 0x0c) { // xxxx1100 ........ ........ ........ ........ (C.23.3.3) - if (dataEnd - dataP > 3) { - size_t result = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x109; - dataP += 4; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseNonEmptyOctetString7Length() { // C.24 - // Parse the length of the string - size_t b = *dataP++ & 0x03; - if (!(b & 0x02)) { // xxxxxx0. (C.24.3.1) - return b + 1; - } - else if (b == 0x02) { // xxxxxx10 ........ (C.24.3.2) - if (dataEnd - dataP > 0) { - return *dataP++ + 0x3; - } - } - else if (b == 0x03) { // xxxxxx11 ........ ........ ........ ........ (C.24.3.3) - if (dataEnd - dataP > 3) { - size_t result = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x103; - dataP += 4; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - std::shared_ptr<const FIValue> parseEncodedData(size_t index, size_t len) { - if (index < 32) { - FIDecoder *decoder = defaultDecoder[index]; - if (!decoder) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); - } - return decoder->decode(dataP, len); - } - else { - if (index - 32 >= vocabulary.encodingAlgorithmTable.size()) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); - } - std::string uri = vocabulary.encodingAlgorithmTable[index - 32]; - auto it = decoderMap.find(uri); - if (it == decoderMap.end()) { - throw DeadlyImportError("Unsupported encoding algorithm " + uri); - } - else { - return it->second->decode(dataP, len); - } - } - } - - std::shared_ptr<const FIValue> parseRestrictedAlphabet(size_t index, size_t len) { - std::string alphabet; - if (index < 16) { - switch (index) { - case 0: // numeric - alphabet = "0123456789-+.e "; - break; - case 1: // date and time - alphabet = "0123456789-:TZ "; - break; - default: - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); - } - } - else { - if (index - 16 >= vocabulary.restrictedAlphabetTable.size()) { - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); - } - alphabet = vocabulary.restrictedAlphabetTable[index - 16]; - } - std::vector<uint32_t> alphabetUTF32; - utf8::utf8to32(alphabet.begin(), alphabet.end(), back_inserter(alphabetUTF32)); - std::string::size_type alphabetLength = alphabetUTF32.size(); - if (alphabetLength < 2) { - throw DeadlyImportError("Invalid restricted alphabet length " + to_string(alphabetLength)); - } - std::string::size_type bitsPerCharacter = 1; - while ((1ull << bitsPerCharacter) <= alphabetLength) { - ++bitsPerCharacter; - } - size_t bitsAvail = 0; - uint8_t mask = (1 << bitsPerCharacter) - 1; - uint32_t bits = 0; - std::string s; - for (size_t i = 0; i < len; ++i) { - bits = (bits << 8) | dataP[i]; - bitsAvail += 8; - while (bitsAvail >= bitsPerCharacter) { - bitsAvail -= bitsPerCharacter; - size_t charIndex = (bits >> bitsAvail) & mask; - if (charIndex < alphabetLength) { - s.push_back(alphabetUTF32[charIndex]); - } - else if (charIndex != mask) { - throw DeadlyImportError(parseErrorMessage); - } - } - } - return FIStringValue::create(std::move(s)); - } - - std::shared_ptr<const FIValue> parseEncodedCharacterString3() { // C.19 - std::shared_ptr<const FIValue> result; - size_t len; - uint8_t b = *dataP; - if (b & 0x20) { - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t index = ((b & 0x0f) << 4) | ((*dataP & 0xf0) >> 4); // C.29 - len = parseNonEmptyOctetString5Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x10) { - // encoding algorithm (C.19.3.4) - result = parseEncodedData(index, len); - } - else { - // Restricted alphabet (C.19.3.3) - result = parseRestrictedAlphabet(index, len); - } - } - else { - len = parseNonEmptyOctetString5Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x10) { - // UTF-16 (C.19.3.2) - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - result = FIStringValue::create(parseUTF16String(dataP, len)); - } - else { - // UTF-8 (C.19.3.1) - result = FIStringValue::create(parseUTF8String(dataP, len)); - } - } - dataP += len; - return result; - } - - std::shared_ptr<const FIValue> parseEncodedCharacterString5() { // C.20 - std::shared_ptr<const FIValue> result; - size_t len; - uint8_t b = *dataP; - if (b & 0x08) { - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t index = ((b & 0x03) << 6) | ((*dataP & 0xfc) >> 2); /* C.29 */ - len = parseNonEmptyOctetString7Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x04) { - // encoding algorithm (C.20.3.4) - result = parseEncodedData(index, len); - } - else { - // Restricted alphabet (C.20.3.3) - result = parseRestrictedAlphabet(index, len); - } - } - else { - len = parseNonEmptyOctetString7Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x04) { - // UTF-16 (C.20.3.2) - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - result = FIStringValue::create(parseUTF16String(dataP, len)); - } - else { - // UTF-8 (C.20.3.1) - result = FIStringValue::create(parseUTF8String(dataP, len)); - } - } - dataP += len; - return result; - } - - const std::string &parseIdentifyingStringOrIndex(std::vector<std::string> &stringTable) { // C.13 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP; - if (b & 0x80) { - // We have an index (C.13.4) - size_t index = parseInt2(); - if (index >= stringTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return stringTable[index]; - } - else { - // We have a string (C.13.3) - stringTable.push_back(parseNonEmptyOctetString2()); - return stringTable.back(); - } - } - - QName parseNameSurrogate() { // C.16 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP++; - if (b & 0xfc) { // Padding '000000' C.2.5.5 - throw DeadlyImportError(parseErrorMessage); - } - QName result; - size_t index; - if (b & 0x02) { // prefix (C.16.3) - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.prefixTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.prefix = vocabulary.prefixTable[index]; - } - if (b & 0x01) { // namespace-name (C.16.4) - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.namespaceNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.uri = vocabulary.namespaceNameTable[index]; - } - // local-name - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.localNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.name = vocabulary.localNameTable[index]; - return result; - } - - const QName &parseQualifiedNameOrIndex2(std::vector<QName> &qNameTable) { // C.17 - uint8_t b = *dataP; - if ((b & 0x7c) == 0x78) { // x11110.. - // We have a literal (C.17.3) - ++dataP; - QName result; - // prefix (C.17.3.1) - result.prefix = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - // namespace-name (C.17.3.1) - result.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - // local-name - result.name = parseIdentifyingStringOrIndex(vocabulary.localNameTable); - qNameTable.push_back(result); - return qNameTable.back(); - } - else { - // We have an index (C.17.4) - size_t index = parseInt2(); - if (index >= qNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return qNameTable[index]; - } - } - - const QName &parseQualifiedNameOrIndex3(std::vector<QName> &qNameTable) { // C.18 - uint8_t b = *dataP; - if ((b & 0x3c) == 0x3c) { // xx1111.. - // We have a literal (C.18.3) - ++dataP; - QName result; - // prefix (C.18.3.1) - result.prefix = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - // namespace-name (C.18.3.1) - result.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - // local-name - result.name = parseIdentifyingStringOrIndex(vocabulary.localNameTable); - qNameTable.push_back(result); - return qNameTable.back(); - } - else { - // We have an index (C.18.4) - size_t index = parseInt3(); - if (index >= qNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return qNameTable[index]; - } - } - - std::shared_ptr<const FIValue> parseNonIdentifyingStringOrIndex1(std::vector<std::shared_ptr<const FIValue>> &valueTable) { // C.14 - uint8_t b = *dataP; - if (b == 0xff) { // C.26.2 - // empty string - ++dataP; - return EmptyFIString; - } - else if (b & 0x80) { // C.14.4 - // We have an index - size_t index = parseInt2(); - if (index >= valueTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return valueTable[index]; - } - else { // C.14.3 - // We have a literal - std::shared_ptr<const FIValue> result = parseEncodedCharacterString3(); - if (b & 0x40) { // C.14.3.1 - valueTable.push_back(result); - } - return result; - } - } - - std::shared_ptr<const FIValue> parseNonIdentifyingStringOrIndex3(std::vector<std::shared_ptr<const FIValue>> &valueTable) { // C.15 - uint8_t b = *dataP; - if (b & 0x20) { // C.15.4 - // We have an index - size_t index = parseInt4(); - if (index >= valueTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return valueTable[index]; - } - else { // C.15.3 - // We have a literal - std::shared_ptr<const FIValue> result = parseEncodedCharacterString5(); - if (b & 0x10) { // C.15.3.1 - valueTable.push_back(result); - } - return result; - } - } - - void parseElement() { - // C.3 - - attributes.clear(); - - uint8_t b = *dataP; - bool hasAttributes = (b & 0x40) != 0; // C.3.3 - if ((b & 0x3f) == 0x38) { // C.3.4.1 - // Parse namespaces - ++dataP; - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP++; - if (b == 0xf0) { // C.3.4.3 - break; - } - if ((b & 0xfc) != 0xcc) { // C.3.4.2 - throw DeadlyImportError(parseErrorMessage); - } - // C.12 - Attribute attr; - attr.qname.prefix = "xmlns"; - attr.qname.name = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - attr.qname.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - attr.name = attr.qname.name.empty() ? "xmlns" : "xmlns:" + attr.qname.name; - attr.value = FIStringValue::create(std::string(attr.qname.uri)); - attributes.push_back(attr); - } - if ((dataEnd - dataP < 1) || (*dataP & 0xc0)) { - throw DeadlyImportError(parseErrorMessage); - } - } - - // Parse Element name (C.3.5) - const QName &elemName = parseQualifiedNameOrIndex3(vocabulary.elementNameTable); - nodeName = elemName.prefix.empty() ? elemName.name : elemName.prefix + ':' + elemName.name; - - if (hasAttributes) { - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP; - if (b < 0x80) { // C.3.6.1 - // C.4 - Attribute attr; - attr.qname = parseQualifiedNameOrIndex2(vocabulary.attributeNameTable); - attr.name = attr.qname.prefix.empty() ? attr.qname.name : attr.qname.prefix + ':' + attr.qname.name; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - attr.value = parseNonIdentifyingStringOrIndex1(vocabulary.attributeValueTable); - attributes.push_back(attr); - } - else { - if ((b & 0xf0) != 0xf0) { // C.3.6.2 - throw DeadlyImportError(parseErrorMessage); - } - emptyElement = b == 0xff; // C.3.6.2, C.3.8 - ++dataP; - break; - } - } - } - else { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP; - switch (b) { - case 0xff: - terminatorPending = true; - // Intentionally fall through - case 0xf0: - emptyElement = true; - ++dataP; - break; - default: - emptyElement = false; - } - } - if (!emptyElement) { - elementStack.push(nodeName); - } - - currentNodeType = irr::io::EXN_ELEMENT; - } - - void parseHeader() { - // Parse header (C.1.3) - size_t magicSize = parseMagic(dataP, dataEnd); - if (!magicSize) { - throw DeadlyImportError(parseErrorMessage); - } - dataP += magicSize; - // C.2.3 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP++; - if (b & 0x40) { - // Parse additional data (C.2.4) - size_t len = parseSequenceLen(); - for (size_t i = 0; i < len; ++i) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string id =*/ parseNonEmptyOctetString2(); - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string data =*/ parseNonEmptyOctetString2(); - } - } - if (b & 0x20) { - // Parse initial vocabulary (C.2.5) - if (dataEnd - dataP < 2) { - throw DeadlyImportError(parseErrorMessage); - } - uint16_t b1 = (dataP[0] << 8) | dataP[1]; - dataP += 2; - if (b1 & 0x1000) { - // External vocabulary (C.2.5.2) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::string uri = parseNonEmptyOctetString2(); - auto it = vocabularyMap.find(uri); - if (it == vocabularyMap.end()) { - throw DeadlyImportError("Unknown vocabulary " + uri); - } - const FIVocabulary *externalVocabulary = it->second; - if (externalVocabulary->restrictedAlphabetTable) { - std::copy(externalVocabulary->restrictedAlphabetTable, externalVocabulary->restrictedAlphabetTable + externalVocabulary->restrictedAlphabetTableSize, std::back_inserter(vocabulary.restrictedAlphabetTable)); - } - if (externalVocabulary->encodingAlgorithmTable) { - std::copy(externalVocabulary->encodingAlgorithmTable, externalVocabulary->encodingAlgorithmTable + externalVocabulary->encodingAlgorithmTableSize, std::back_inserter(vocabulary.encodingAlgorithmTable)); - } - if (externalVocabulary->prefixTable) { - std::copy(externalVocabulary->prefixTable, externalVocabulary->prefixTable + externalVocabulary->prefixTableSize, std::back_inserter(vocabulary.prefixTable)); - } - if (externalVocabulary->namespaceNameTable) { - std::copy(externalVocabulary->namespaceNameTable, externalVocabulary->namespaceNameTable + externalVocabulary->namespaceNameTableSize, std::back_inserter(vocabulary.namespaceNameTable)); - } - if (externalVocabulary->localNameTable) { - std::copy(externalVocabulary->localNameTable, externalVocabulary->localNameTable + externalVocabulary->localNameTableSize, std::back_inserter(vocabulary.localNameTable)); - } - if (externalVocabulary->otherNCNameTable) { - std::copy(externalVocabulary->otherNCNameTable, externalVocabulary->otherNCNameTable + externalVocabulary->otherNCNameTableSize, std::back_inserter(vocabulary.otherNCNameTable)); - } - if (externalVocabulary->otherURITable) { - std::copy(externalVocabulary->otherURITable, externalVocabulary->otherURITable + externalVocabulary->otherURITableSize, std::back_inserter(vocabulary.otherURITable)); - } - if (externalVocabulary->attributeValueTable) { - std::copy(externalVocabulary->attributeValueTable, externalVocabulary->attributeValueTable + externalVocabulary->attributeValueTableSize, std::back_inserter(vocabulary.attributeValueTable)); - } - if (externalVocabulary->charactersTable) { - std::copy(externalVocabulary->charactersTable, externalVocabulary->charactersTable + externalVocabulary->charactersTableSize, std::back_inserter(vocabulary.charactersTable)); - } - if (externalVocabulary->otherStringTable) { - std::copy(externalVocabulary->otherStringTable, externalVocabulary->otherStringTable + externalVocabulary->otherStringTableSize, std::back_inserter(vocabulary.otherStringTable)); - } - if (externalVocabulary->elementNameTable) { - std::copy(externalVocabulary->elementNameTable, externalVocabulary->elementNameTable + externalVocabulary->elementNameTableSize, std::back_inserter(vocabulary.elementNameTable)); - } - if (externalVocabulary->attributeNameTable) { - std::copy(externalVocabulary->attributeNameTable, externalVocabulary->attributeNameTable + externalVocabulary->attributeNameTableSize, std::back_inserter(vocabulary.attributeNameTable)); - } - } - if (b1 & 0x0800) { - // Parse restricted alphabets (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.restrictedAlphabetTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0400) { - // Parse encoding algorithms (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.encodingAlgorithmTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0200) { - // Parse prefixes (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.prefixTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0100) { - // Parse namespace names (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.namespaceNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0080) { - // Parse local names (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.localNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0040) { - // Parse other ncnames (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherNCNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0020) { - // Parse other uris (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherURITable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0010) { - // Parse attribute values (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.attributeValueTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0008) { - // Parse content character chunks (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.charactersTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0004) { - // Parse other strings (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherStringTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0002) { - // Parse element name surrogates (C.2.5.5) - for (size_t len = parseSequenceLen(); len > 0; --len) { - vocabulary.elementNameTable.push_back(parseNameSurrogate()); - } - } - if (b1 & 0x0001) { - // Parse attribute name surrogates (C.2.5.5) - for (size_t len = parseSequenceLen(); len > 0; --len) { - vocabulary.attributeNameTable.push_back(parseNameSurrogate()); - } - } - } - if (b & 0x10) { - // Parse notations (C.2.6) - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 == 0xf0) { - break; - } - if ((b1 & 0xfc) != 0xc0) { - throw DeadlyImportError(parseErrorMessage); - } - /* C.11 */ - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (b1 & 0x02) { - /*const std::string &systemId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b1 & 0x01) { - /*const std::string &publicId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - } - } - if (b & 0x08) { - // Parse unparsed entities (C.2.7) - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 == 0xf0) { - break; - } - if ((b1 & 0xfe) != 0xd0) { - throw DeadlyImportError(parseErrorMessage); - } - /* C.10 */ - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - /*const std::string &systemId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - if (b1 & 0x01) { - /*const std::string &publicId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - /*const std::string ¬ationName =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - } - } - if (b & 0x04) { - // Parse character encoding scheme (C.2.8) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string characterEncodingScheme =*/ parseNonEmptyOctetString2(); - } - if (b & 0x02) { - // Parse standalone flag (C.2.9) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 & 0xfe) { - throw DeadlyImportError(parseErrorMessage); - } - //bool standalone = b1 & 0x01; - } - if (b & 0x01) { - // Parse version (C.2.10) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::shared_ptr<const FIValue> version =*/ parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - } - } - - std::unique_ptr<uint8_t[]> data; - uint8_t *dataP, *dataEnd; - irr::io::EXML_NODE currentNodeType; - bool emptyElement; - bool headerPending; - bool terminatorPending; - Vocabulary vocabulary; - std::vector<Attribute> attributes; - std::stack<std::string> elementStack; - std::string nodeName; - std::map<std::string, std::unique_ptr<FIDecoder>> decoderMap; - std::map<std::string, const FIVocabulary*> vocabularyMap; - - static const std::string EmptyString; - static std::shared_ptr<const FIValue> EmptyFIString; - - static FIHexDecoder hexDecoder; - static FIBase64Decoder base64Decoder; - static FIShortDecoder shortDecoder; - static FIIntDecoder intDecoder; - static FILongDecoder longDecoder; - static FIBoolDecoder boolDecoder; - static FIFloatDecoder floatDecoder; - static FIDoubleDecoder doubleDecoder; - static FIUUIDDecoder uuidDecoder; - static FICDATADecoder cdataDecoder; - static FIDecoder *defaultDecoder[32]; -}; - -const std::string CFIReaderImpl::EmptyString; -std::shared_ptr<const FIValue> CFIReaderImpl::EmptyFIString = FIStringValue::create(std::string()); - -FIHexDecoder CFIReaderImpl::hexDecoder; -FIBase64Decoder CFIReaderImpl::base64Decoder; -FIShortDecoder CFIReaderImpl::shortDecoder; -FIIntDecoder CFIReaderImpl::intDecoder; -FILongDecoder CFIReaderImpl::longDecoder; -FIBoolDecoder CFIReaderImpl::boolDecoder; -FIFloatDecoder CFIReaderImpl::floatDecoder; -FIDoubleDecoder CFIReaderImpl::doubleDecoder; -FIUUIDDecoder CFIReaderImpl::uuidDecoder; -FICDATADecoder CFIReaderImpl::cdataDecoder; - -FIDecoder *CFIReaderImpl::defaultDecoder[32] = { - &hexDecoder, - &base64Decoder, - &shortDecoder, - &intDecoder, - &longDecoder, - &boolDecoder, - &floatDecoder, - &doubleDecoder, - &uuidDecoder, - &cdataDecoder -}; - -class CXMLReaderImpl : public FIReader -{ -public: - - //! Constructor - CXMLReaderImpl(std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>> reader_) - : reader(std::move(reader_)) - {} - - virtual ~CXMLReaderImpl() {} - - virtual bool read() /*override*/ { - return reader->read(); - } - - virtual irr::io::EXML_NODE getNodeType() const /*override*/ { - return reader->getNodeType(); - } - - virtual int getAttributeCount() const /*override*/ { - return reader->getAttributeCount(); - } - - virtual const char* getAttributeName(int idx) const /*override*/ { - return reader->getAttributeName(idx); - } - - virtual const char* getAttributeValue(int idx) const /*override*/ { - return reader->getAttributeValue(idx); - } - - virtual const char* getAttributeValue(const char* name) const /*override*/ { - return reader->getAttributeValue(name); - } - - virtual const char* getAttributeValueSafe(const char* name) const /*override*/ { - return reader->getAttributeValueSafe(name); - } - - virtual int getAttributeValueAsInt(const char* name) const /*override*/ { - return reader->getAttributeValueAsInt(name); - } - - virtual int getAttributeValueAsInt(int idx) const /*override*/ { - return reader->getAttributeValueAsInt(idx); - } - - virtual float getAttributeValueAsFloat(const char* name) const /*override*/ { - return reader->getAttributeValueAsFloat(name); - } - - virtual float getAttributeValueAsFloat(int idx) const /*override*/ { - return reader->getAttributeValueAsFloat(idx); - } - - virtual const char* getNodeName() const /*override*/ { - return reader->getNodeName(); - } - - virtual const char* getNodeData() const /*override*/ { - return reader->getNodeData(); - } - - virtual bool isEmptyElement() const /*override*/ { - return reader->isEmptyElement(); - } - - virtual irr::io::ETEXT_FORMAT getSourceFormat() const /*override*/ { - return reader->getSourceFormat(); - } - - virtual irr::io::ETEXT_FORMAT getParserFormat() const /*override*/ { - return reader->getParserFormat(); - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(int /*idx*/) const /*override*/ { - return nullptr; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(const char* /*name*/) const /*override*/ { - return nullptr; - } - - virtual void registerDecoder(const std::string & /*algorithmUri*/, std::unique_ptr<FIDecoder> /*decoder*/) /*override*/ {} - - - virtual void registerVocabulary(const std::string &/*vocabularyUri*/, const FIVocabulary * /*vocabulary*/) /*override*/ {} - -private: - - std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>> reader; -}; - -static std::unique_ptr<uint8_t[]> readFile(IOStream *stream, size_t &size, bool &isFI) { - size = stream->FileSize(); - std::unique_ptr<uint8_t[]> data = std::unique_ptr<uint8_t[]>(new uint8_t[size]); - if (stream->Read(data.get(), size, 1) != 1) { - size = 0; - data.reset(); - } - isFI = parseMagic(data.get(), data.get() + size) > 0; - return data; -} - -std::unique_ptr<FIReader> FIReader::create(IOStream *stream) -{ - size_t size; - bool isFI; - auto data = readFile(stream, size, isFI); - if (isFI) { - return std::unique_ptr<FIReader>(new CFIReaderImpl(std::move(data), size)); - } - else { - auto memios = std::unique_ptr<MemoryIOStream>(new MemoryIOStream(data.release(), size, true)); - auto callback = std::unique_ptr<CIrrXML_IOStreamReader>(new CIrrXML_IOStreamReader(memios.get())); - return std::unique_ptr<FIReader>(new CXMLReaderImpl(std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>>(createIrrXMLReader(callback.get())))); - } -} - -}// namespace Assimp - -#endif // !ASSIMP_BUILD_NO_X3D_IMPORTER diff --git a/thirdparty/assimp/code/MMDCpp14.h b/thirdparty/assimp/code/MMD/MMDCpp14.h index 638b0bfd2f..638b0bfd2f 100644 --- a/thirdparty/assimp/code/MMDCpp14.h +++ b/thirdparty/assimp/code/MMD/MMDCpp14.h diff --git a/thirdparty/assimp/code/MMDImporter.cpp b/thirdparty/assimp/code/MMD/MMDImporter.cpp index 84b9e35a6b..e7744e4cd0 100644 --- a/thirdparty/assimp/code/MMDImporter.cpp +++ b/thirdparty/assimp/code/MMD/MMDImporter.cpp @@ -41,15 +41,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_MMD_IMPORTER -#include "MMDImporter.h" -#include "MMDPmdParser.h" -#include "MMDPmxParser.h" -#include "MMDVmdParser.h" -#include "ConvertToLHProcess.h" +#include "MMD/MMDImporter.h" +#include "MMD/MMDPmdParser.h" +#include "MMD/MMDPmxParser.h" +#include "MMD/MMDVmdParser.h" +#include "PostProcessing/ConvertToLHProcess.h" + #include <assimp/DefaultIOSystem.h> #include <assimp/Importer.hpp> #include <assimp/ai_assert.h> #include <assimp/scene.h> + #include <fstream> #include <iomanip> #include <memory> diff --git a/thirdparty/assimp/code/MMDImporter.h b/thirdparty/assimp/code/MMD/MMDImporter.h index 4ee94eeb00..4ee94eeb00 100644 --- a/thirdparty/assimp/code/MMDImporter.h +++ b/thirdparty/assimp/code/MMD/MMDImporter.h diff --git a/thirdparty/assimp/code/MMDPmdParser.h b/thirdparty/assimp/code/MMD/MMDPmdParser.h index d2f2224aa1..d2f2224aa1 100644 --- a/thirdparty/assimp/code/MMDPmdParser.h +++ b/thirdparty/assimp/code/MMD/MMDPmdParser.h diff --git a/thirdparty/assimp/code/MMDPmxParser.cpp b/thirdparty/assimp/code/MMD/MMDPmxParser.cpp index 7425ceac22..80f0986dd7 100644 --- a/thirdparty/assimp/code/MMDPmxParser.cpp +++ b/thirdparty/assimp/code/MMD/MMDPmxParser.cpp @@ -42,7 +42,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <utility> #include "MMDPmxParser.h" #include <assimp/StringUtils.h> -#include "../contrib/utf8cpp/source/utf8.h" +#ifdef ASSIMP_USE_HUNTER +# include <utf8/utf8.h> +#else +# include "../contrib/utf8cpp/source/utf8.h" +#endif #include <assimp/Exceptional.h> namespace pmx diff --git a/thirdparty/assimp/code/MMDPmxParser.h b/thirdparty/assimp/code/MMD/MMDPmxParser.h index cf523a1298..cf523a1298 100644 --- a/thirdparty/assimp/code/MMDPmxParser.h +++ b/thirdparty/assimp/code/MMD/MMDPmxParser.h diff --git a/thirdparty/assimp/code/MMDVmdParser.h b/thirdparty/assimp/code/MMD/MMDVmdParser.h index 947c3a2422..947c3a2422 100644 --- a/thirdparty/assimp/code/MMDVmdParser.h +++ b/thirdparty/assimp/code/MMD/MMDVmdParser.h diff --git a/thirdparty/assimp/code/MaterialSystem.cpp b/thirdparty/assimp/code/Material/MaterialSystem.cpp index 03d5a18a34..d0b39093b6 100644 --- a/thirdparty/assimp/code/MaterialSystem.cpp +++ b/thirdparty/assimp/code/Material/MaterialSystem.cpp @@ -96,12 +96,12 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, ai_real* pOut, unsigned int* pMax) { - ai_assert( pOut != NULL ); - ai_assert( pMat != NULL ); + ai_assert( pOut != nullptr ); + ai_assert( pMat != nullptr ); const aiMaterialProperty* prop; aiGetMaterialProperty(pMat,pKey,type,index, (const aiMaterialProperty**) &prop); - if (!prop) { + if ( nullptr == prop) { return AI_FAILURE; } @@ -112,9 +112,11 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, if (pMax) { iWrite = std::min(*pMax,iWrite); ; } - for (unsigned int a = 0; a < iWrite;++a) { - pOut[a] = static_cast<ai_real> ( reinterpret_cast<float*>(prop->mData)[a] ); + + for (unsigned int a = 0; a < iWrite; ++a) { + pOut[ a ] = static_cast<ai_real> ( reinterpret_cast<float*>(prop->mData)[a] ); } + if (pMax) { *pMax = iWrite; } diff --git a/thirdparty/assimp/code/MaterialSystem.h b/thirdparty/assimp/code/Material/MaterialSystem.h index 67d53578cb..67d53578cb 100644 --- a/thirdparty/assimp/code/MaterialSystem.h +++ b/thirdparty/assimp/code/Material/MaterialSystem.h diff --git a/thirdparty/assimp/code/CalcTangentsProcess.cpp b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp index b30f39c274..b30f39c274 100644 --- a/thirdparty/assimp/code/CalcTangentsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp diff --git a/thirdparty/assimp/code/CalcTangentsProcess.h b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.h index 18775abcc7..3568a624f8 100644 --- a/thirdparty/assimp/code/CalcTangentsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.h @@ -42,11 +42,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Defines a post processing step to calculate tangents and - bitangents on all imported meshes.*/ + bi-tangents on all imported meshes.*/ #ifndef AI_CALCTANGENTSPROCESS_H_INC #define AI_CALCTANGENTSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; diff --git a/thirdparty/assimp/code/ComputeUVMappingProcess.cpp b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.cpp index bb571a551b..bb571a551b 100644 --- a/thirdparty/assimp/code/ComputeUVMappingProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.cpp diff --git a/thirdparty/assimp/code/ComputeUVMappingProcess.h b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.h index 24f6bb7218..a6d36e06ea 100644 --- a/thirdparty/assimp/code/ComputeUVMappingProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_COMPUTEUVMAPPING_H_INC #define AI_COMPUTEUVMAPPING_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> #include <assimp/material.h> #include <assimp/types.h> diff --git a/thirdparty/assimp/code/ConvertToLHProcess.cpp b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.cpp index b7cd4f0bc6..b7cd4f0bc6 100644 --- a/thirdparty/assimp/code/ConvertToLHProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.cpp diff --git a/thirdparty/assimp/code/ConvertToLHProcess.h b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.h index 63351568d0..f32b91fc39 100644 --- a/thirdparty/assimp/code/ConvertToLHProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.h @@ -52,7 +52,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_CONVERTTOLHPROCESS_H_INC #include <assimp/types.h> -#include "BaseProcess.h" + +#include "Common/BaseProcess.h" struct aiMesh; struct aiNodeAnim; diff --git a/thirdparty/assimp/code/DeboneProcess.cpp b/thirdparty/assimp/code/PostProcessing/DeboneProcess.cpp index 83b8336bc9..83b8336bc9 100644 --- a/thirdparty/assimp/code/DeboneProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/DeboneProcess.cpp diff --git a/thirdparty/assimp/code/DeboneProcess.h b/thirdparty/assimp/code/PostProcessing/DeboneProcess.h index ba77aba70e..8b64c2acc6 100644 --- a/thirdparty/assimp/code/DeboneProcess.h +++ b/thirdparty/assimp/code/PostProcessing/DeboneProcess.h @@ -44,17 +44,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_DEBONEPROCESS_H_INC #define AI_DEBONEPROCESS_H_INC -#include <vector> -#include <utility> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> #include <assimp/scene.h> +#include <vector> +#include <utility> + +#// Forward declarations class DeboneTest; -namespace Assimp -{ +namespace Assimp { #if (!defined AI_DEBONE_THRESHOLD) # define AI_DEBONE_THRESHOLD 1.0f @@ -66,14 +67,11 @@ namespace Assimp * the bone are split from the mesh. The split off (new) mesh is boneless. At any * point in time, bones without affect upon a given mesh are to be removed. */ -class DeboneProcess : public BaseProcess -{ +class DeboneProcess : public BaseProcess { public: - DeboneProcess(); ~DeboneProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -91,7 +89,6 @@ public: void SetupProperties(const Importer* pImp); protected: - // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. diff --git a/thirdparty/assimp/code/DropFaceNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.cpp index b11615bb82..b11615bb82 100644 --- a/thirdparty/assimp/code/DropFaceNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.cpp diff --git a/thirdparty/assimp/code/DropFaceNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.h index 0d116663b7..c710c5a5ee 100644 --- a/thirdparty/assimp/code/DropFaceNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.h @@ -44,23 +44,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_DROPFACENORMALPROCESS_H_INC #define AI_DROPFACENORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- /** The DropFaceNormalsProcess computes face normals for all faces of all meshes */ -class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess -{ +class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess { public: - DropFaceNormalsProcess(); ~DropFaceNormalsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise diff --git a/thirdparty/assimp/code/EmbedTexturesProcess.cpp b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.cpp index 739382a057..739382a057 100644 --- a/thirdparty/assimp/code/EmbedTexturesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.cpp diff --git a/thirdparty/assimp/code/EmbedTexturesProcess.h b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.h index cdf40bef74..3c4b2eab4e 100644 --- a/thirdparty/assimp/code/EmbedTexturesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.h @@ -42,7 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #pragma once -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <string> diff --git a/thirdparty/assimp/code/FindDegenerates.cpp b/thirdparty/assimp/code/PostProcessing/FindDegenerates.cpp index 365f5d7447..50fac46dba 100644 --- a/thirdparty/assimp/code/FindDegenerates.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindDegenerates.cpp @@ -228,6 +228,7 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { if ( area < 1e-6 ) { if ( mConfigRemoveDegenerates ) { remove_me[ a ] = true; + ++deg; goto evil_jump_outside; } diff --git a/thirdparty/assimp/code/FindDegenerates.h b/thirdparty/assimp/code/PostProcessing/FindDegenerates.h index 880f5f16a2..7a15e77cf1 100644 --- a/thirdparty/assimp/code/FindDegenerates.h +++ b/thirdparty/assimp/code/PostProcessing/FindDegenerates.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDDEGENERATESPROCESS_H_INC #define AI_FINDDEGENERATESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> class FindDegeneratesProcessTest; diff --git a/thirdparty/assimp/code/FindInstancesProcess.cpp b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.cpp index be1138116e..64907458a1 100644 --- a/thirdparty/assimp/code/FindInstancesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.cpp @@ -137,6 +137,11 @@ void FindInstancesProcess::Execute( aiScene* pScene) aiMesh* inst = pScene->mMeshes[i]; hashes[i] = GetMeshHash(inst); + // Find an appropriate epsilon + // to compare position differences against + float epsilon = ComputePositionEpsilon(inst); + epsilon *= epsilon; + for (int a = i-1; a >= 0; --a) { if (hashes[i] == hashes[a]) { @@ -154,12 +159,7 @@ void FindInstancesProcess::Execute( aiScene* pScene) orig->mPrimitiveTypes != inst->mPrimitiveTypes) continue; - // up to now the meshes are equal. find an appropriate - // epsilon to compare position differences against - float epsilon = ComputePositionEpsilon(inst); - epsilon *= epsilon; - - // now compare vertex positions, normals, + // up to now the meshes are equal. Now compare vertex positions, normals, // tangents and bitangents using this epsilon. if (orig->HasPositions()) { if(!CompareArrays(orig->mVertices,inst->mVertices,orig->mNumVertices,epsilon)) diff --git a/thirdparty/assimp/code/FindInstancesProcess.h b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.h index ab4a371c71..64b838d7cc 100644 --- a/thirdparty/assimp/code/FindInstancesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.h @@ -46,8 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDINSTANCES_H_INC #define AI_FINDINSTANCES_H_INC -#include "BaseProcess.h" -#include "ProcessHelper.h" +#include "Common/BaseProcess.h" +#include "PostProcessing/ProcessHelper.h" class FindInstancesProcessTest; namespace Assimp { diff --git a/thirdparty/assimp/code/FindInvalidDataProcess.cpp b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.cpp index 433f042448..433f042448 100644 --- a/thirdparty/assimp/code/FindInvalidDataProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.cpp diff --git a/thirdparty/assimp/code/FindInvalidDataProcess.h b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.h index 8504fb7b1f..ce7375f34f 100644 --- a/thirdparty/assimp/code/FindInvalidDataProcess.h +++ b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.h @@ -46,7 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDINVALIDDATA_H_INC #define AI_FINDINVALIDDATA_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> #include <assimp/anim.h> diff --git a/thirdparty/assimp/code/FixNormalsStep.cpp b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.cpp index bbbe6899b4..bbbe6899b4 100644 --- a/thirdparty/assimp/code/FixNormalsStep.cpp +++ b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.cpp diff --git a/thirdparty/assimp/code/FixNormalsStep.h b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.h index 6be27faef6..f60ce596a4 100644 --- a/thirdparty/assimp/code/FixNormalsStep.h +++ b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.h @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FIXNORMALSPROCESS_H_INC #define AI_FIXNORMALSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; diff --git a/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp new file mode 100644 index 0000000000..c013454fc3 --- /dev/null +++ b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp @@ -0,0 +1,115 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#include "PostProcessing/GenBoundingBoxesProcess.h" + +#include <assimp/postprocess.h> +#include <assimp/scene.h> + +namespace Assimp { + +GenBoundingBoxesProcess::GenBoundingBoxesProcess() +: BaseProcess() { + +} + +GenBoundingBoxesProcess::~GenBoundingBoxesProcess() { + // empty +} + +bool GenBoundingBoxesProcess::IsActive(unsigned int pFlags) const { + return 0 != ( pFlags & aiProcess_GenBoundingBoxes ); +} + +void checkMesh(aiMesh* mesh, aiVector3D& min, aiVector3D& max) { + ai_assert(nullptr != mesh); + + if (0 == mesh->mNumVertices) { + return; + } + + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + const aiVector3D &pos = mesh->mVertices[i]; + if (pos.x < min.x) { + min.x = pos.x; + } + if (pos.y < min.y) { + min.y = pos.y; + } + if (pos.z < min.z) { + min.z = pos.z; + } + + if (pos.x > max.x) { + max.x = pos.x; + } + if (pos.y > max.y) { + max.y = pos.y; + } + if (pos.z > max.z) { + max.z = pos.z; + } + } +} + +void GenBoundingBoxesProcess::Execute(aiScene* pScene) { + if (nullptr == pScene) { + return; + } + + for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { + aiMesh* mesh = pScene->mMeshes[i]; + if (nullptr == mesh) { + continue; + } + + aiVector3D min(999999, 999999, 999999), max(-999999, -999999, -999999); + checkMesh(mesh, min, max); + mesh->mAABB.mMin = min; + mesh->mAABB.mMax = max; + } +} + +} // Namespace Assimp + +#endif // ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS diff --git a/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h new file mode 100644 index 0000000000..4b43c82a42 --- /dev/null +++ b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h @@ -0,0 +1,76 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file Defines a post-processing step to generate Axis-aligned bounding + * volumes for all meshes. + */ + +#pragma once + +#ifndef AI_GENBOUNDINGBOXESPROCESS_H_INC +#define AI_GENBOUNDINGBOXESPROCESS_H_INC + +#ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#include "Common/BaseProcess.h" + +namespace Assimp { + +/** Post-processing process to find axis-aligned bounding volumes for amm meshes + * used in a scene + */ +class ASSIMP_API GenBoundingBoxesProcess : public BaseProcess { +public: + /// The class constructor. + GenBoundingBoxesProcess(); + /// The class destructor. + ~GenBoundingBoxesProcess(); + /// Will return true, if aiProcess_GenBoundingBoxes is defined. + bool IsActive(unsigned int pFlags) const override; + /// The execution callback. + void Execute(aiScene* pScene) override; +}; + +} // Namespace Assimp + +#endif // #ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#endif // AI_GENBOUNDINGBOXESPROCESS_H_INC diff --git a/thirdparty/assimp/code/GenFaceNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.cpp index 028334dec7..028334dec7 100644 --- a/thirdparty/assimp/code/GenFaceNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.cpp diff --git a/thirdparty/assimp/code/GenFaceNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.h index c80ec9fddc..c641fd6353 100644 --- a/thirdparty/assimp/code/GenFaceNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.h @@ -44,7 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GENFACENORMALPROCESS_H_INC #define AI_GENFACENORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> namespace Assimp diff --git a/thirdparty/assimp/code/GenVertexNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.cpp index 3f6c2f86bd..3f6c2f86bd 100644 --- a/thirdparty/assimp/code/GenVertexNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.cpp diff --git a/thirdparty/assimp/code/GenVertexNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.h index 9142ad26f5..2ceee17e85 100644 --- a/thirdparty/assimp/code/GenVertexNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.h @@ -45,24 +45,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GENVERTEXNORMALPROCESS_H_INC #define AI_GENVERTEXNORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/assbin_chunks.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> +// Forward declarations class GenNormalsTest; namespace Assimp { // --------------------------------------------------------------------------- -/** The GenFaceNormalsProcess computes vertex normals for all vertizes +/** The GenFaceNormalsProcess computes vertex normals for all vertices */ -class ASSIMP_API GenVertexNormalsProcess : public BaseProcess -{ +class ASSIMP_API GenVertexNormalsProcess : public BaseProcess { public: - GenVertexNormalsProcess(); ~GenVertexNormalsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -88,13 +88,10 @@ public: // setter for configMaxAngle - inline void SetMaxSmoothAngle(ai_real f) - { + inline void SetMaxSmoothAngle(ai_real f) { configMaxAngle =f; } -public: - // ------------------------------------------------------------------- /** Computes normals for a specific mesh * @param pcMesh Mesh @@ -104,7 +101,6 @@ public: bool GenMeshVertexNormals (aiMesh* pcMesh, unsigned int meshIndex); private: - /** Configuration option: maximum smoothing angle, in radians*/ ai_real configMaxAngle; mutable bool force_ = false; diff --git a/thirdparty/assimp/code/ImproveCacheLocality.cpp b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.cpp index ace9d95ff8..d0a016fa42 100644 --- a/thirdparty/assimp/code/ImproveCacheLocality.cpp +++ b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.cpp @@ -45,14 +45,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * <br> * The algorithm is roughly basing on this paper: * http://www.cs.princeton.edu/gfx/pubs/Sander_2007_%3ETR/tipsy.pdf - * .. although overdraw rduction isn't implemented yet ... + * .. although overdraw reduction isn't implemented yet ... */ - - // internal headers -#include "ImproveCacheLocality.h" -#include "VertexTriangleAdjacency.h" +#include "PostProcessing/ImproveCacheLocality.h" +#include "Common/VertexTriangleAdjacency.h" + #include <assimp/StringUtils.h> #include <assimp/postprocess.h> #include <assimp/scene.h> @@ -64,36 +63,33 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -ImproveCacheLocalityProcess::ImproveCacheLocalityProcess() { - configCacheDepth = PP_ICL_PTCACHE_SIZE; +ImproveCacheLocalityProcess::ImproveCacheLocalityProcess() +: mConfigCacheDepth(PP_ICL_PTCACHE_SIZE) { + // empty } // ------------------------------------------------------------------------------------------------ // Destructor, private as well -ImproveCacheLocalityProcess::~ImproveCacheLocalityProcess() -{ +ImproveCacheLocalityProcess::~ImproveCacheLocalityProcess() { // nothing to do here } // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ImproveCacheLocalityProcess::IsActive( unsigned int pFlags) const -{ +bool ImproveCacheLocalityProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_ImproveCacheLocality) != 0; } // ------------------------------------------------------------------------------------------------ // Setup configuration -void ImproveCacheLocalityProcess::SetupProperties(const Importer* pImp) -{ +void ImproveCacheLocalityProcess::SetupProperties(const Importer* pImp) { // AI_CONFIG_PP_ICL_PTCACHE_SIZE controls the target cache size for the optimizer - configCacheDepth = pImp->GetPropertyInteger(AI_CONFIG_PP_ICL_PTCACHE_SIZE,PP_ICL_PTCACHE_SIZE); + mConfigCacheDepth = pImp->GetPropertyInteger(AI_CONFIG_PP_ICL_PTCACHE_SIZE,PP_ICL_PTCACHE_SIZE); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void ImproveCacheLocalityProcess::Execute( aiScene* pScene) -{ +void ImproveCacheLocalityProcess::Execute( aiScene* pScene) { if (!pScene->mNumMeshes) { ASSIMP_LOG_DEBUG("ImproveCacheLocalityProcess skipped; there are no meshes"); return; @@ -103,7 +99,7 @@ void ImproveCacheLocalityProcess::Execute( aiScene* pScene) float out = 0.f; unsigned int numf = 0, numm = 0; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++){ + for( unsigned int a = 0; a < pScene->mNumMeshes; ++a ){ const float res = ProcessMesh( pScene->mMeshes[a],a); if (res) { numf += pScene->mMeshes[a]->mNumFaces; @@ -121,44 +117,41 @@ void ImproveCacheLocalityProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Improves the cache coherency of a specific mesh -float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshNum) -{ +ai_real ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshNum) { // TODO: rewrite this to use std::vector or boost::shared_array - ai_assert(NULL != pMesh); + ai_assert(nullptr != pMesh); // Check whether the input data is valid // - there must be vertices and faces // - all faces must be triangulated or we can't operate on them if (!pMesh->HasFaces() || !pMesh->HasPositions()) - return 0.f; + return static_cast<ai_real>(0.f); if (pMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE) { ASSIMP_LOG_ERROR("This algorithm works on triangle meshes only"); - return 0.f; + return static_cast<ai_real>(0.f); } - if(pMesh->mNumVertices <= configCacheDepth) { - return 0.f; + if(pMesh->mNumVertices <= mConfigCacheDepth) { + return static_cast<ai_real>(0.f); } - float fACMR = 3.f; + ai_real fACMR = 3.f; const aiFace* const pcEnd = pMesh->mFaces+pMesh->mNumFaces; // Input ACMR is for logging purposes only if (!DefaultLogger::isNullLogger()) { - unsigned int* piFIFOStack = new unsigned int[configCacheDepth]; - memset(piFIFOStack,0xff,configCacheDepth*sizeof(unsigned int)); + unsigned int* piFIFOStack = new unsigned int[mConfigCacheDepth]; + memset(piFIFOStack,0xff,mConfigCacheDepth*sizeof(unsigned int)); unsigned int* piCur = piFIFOStack; - const unsigned int* const piCurEnd = piFIFOStack + configCacheDepth; + const unsigned int* const piCurEnd = piFIFOStack + mConfigCacheDepth; // count the number of cache misses unsigned int iCacheMisses = 0; for (const aiFace* pcFace = pMesh->mFaces;pcFace != pcEnd;++pcFace) { - for (unsigned int qq = 0; qq < 3;++qq) { bool bInCache = false; - for (unsigned int* pp = piFIFOStack;pp < piCurEnd;++pp) { if (*pp == pcFace->mIndices[qq]) { // the vertex is in cache @@ -176,7 +169,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh } } delete[] piFIFOStack; - fACMR = (float)iCacheMisses / pMesh->mNumFaces; + fACMR = (ai_real) iCacheMisses / pMesh->mNumFaces; if (3.0 == fACMR) { char szBuff[128]; // should be sufficiently large in every case @@ -185,7 +178,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh // smaller than 3.0 ... ai_snprintf(szBuff,128,"Mesh %u: Not suitable for vcache optimization",meshNum); ASSIMP_LOG_WARN(szBuff); - return 0.f; + return static_cast<ai_real>(0.f); } } @@ -258,7 +251,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh int ivdx = 0; int ics = 1; - int iStampCnt = configCacheDepth+1; + int iStampCnt = mConfigCacheDepth+1; while (ivdx >= 0) { unsigned int icnt = piNumTriPtrNoModify[ivdx]; @@ -294,7 +287,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh *piCSIter++ = dp; // if the vertex is not yet in cache, set its cache count - if (iStampCnt-piCachingStamps[dp] > configCacheDepth) { + if (iStampCnt-piCachingStamps[dp] > mConfigCacheDepth) { piCachingStamps[dp] = iStampCnt++; ++iCacheMisses; } @@ -319,7 +312,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh // will the vertex be in cache, even after fanning occurs? unsigned int tmp; - if ((tmp = iStampCnt-piCachingStamps[dp]) + 2*piNumTriPtr[dp] <= configCacheDepth) { + if ((tmp = iStampCnt-piCachingStamps[dp]) + 2*piNumTriPtr[dp] <= mConfigCacheDepth) { priority = tmp; } @@ -356,7 +349,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh } } } - float fACMR2 = 0.0f; + ai_real fACMR2 = 0.0f; if (!DefaultLogger::isNullLogger()) { fACMR2 = (float)iCacheMisses / pMesh->mNumFaces; diff --git a/thirdparty/assimp/code/ImproveCacheLocality.h b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.h index 1b29ee0d6e..de25ecd9fb 100644 --- a/thirdparty/assimp/code/ImproveCacheLocality.h +++ b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_IMPROVECACHELOCALITY_H_INC #define AI_IMPROVECACHELOCALITY_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> struct aiMesh; @@ -87,12 +88,12 @@ protected: * @param pMesh The mesh to process. * @param meshNum Index of the mesh to process */ - float ProcessMesh( aiMesh* pMesh, unsigned int meshNum); + ai_real ProcessMesh( aiMesh* pMesh, unsigned int meshNum); private: //! Configuration parameter: specifies the size of the cache to //! optimize the vertex data for. - unsigned int configCacheDepth; + unsigned int mConfigCacheDepth; }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/JoinVerticesProcess.cpp b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.cpp index 914ec05b46..914ec05b46 100644 --- a/thirdparty/assimp/code/JoinVerticesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.cpp diff --git a/thirdparty/assimp/code/JoinVerticesProcess.h b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.h index 66fa362de2..e017ae62db 100644 --- a/thirdparty/assimp/code/JoinVerticesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_JOINVERTICESPROCESS_H_INC #define AI_JOINVERTICESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> struct aiMesh; @@ -61,13 +62,11 @@ namespace Assimp * erases all but one of the copies. This usually reduces the number of vertices * in a mesh by a serious amount and is the standard form to render a mesh. */ -class ASSIMP_API JoinVerticesProcess : public BaseProcess -{ +class ASSIMP_API JoinVerticesProcess : public BaseProcess { public: JoinVerticesProcess(); ~JoinVerticesProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise @@ -83,15 +82,12 @@ public: */ void Execute( aiScene* pScene); -public: // ------------------------------------------------------------------- /** Unites identical vertices in the given mesh. * @param pMesh The mesh to process. * @param meshIndex Index of the mesh to process */ int ProcessMesh( aiMesh* pMesh, unsigned int meshIndex); - -private: }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/LimitBoneWeightsProcess.cpp b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.cpp index d560f19287..d560f19287 100644 --- a/thirdparty/assimp/code/LimitBoneWeightsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.cpp diff --git a/thirdparty/assimp/code/LimitBoneWeightsProcess.h b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.h index 3602fd8edf..73c2a68d53 100644 --- a/thirdparty/assimp/code/LimitBoneWeightsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.h @@ -44,14 +44,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_LIMITBONEWEIGHTSPROCESS_H_INC #define AI_LIMITBONEWEIGHTSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" +// Forward declarations struct aiMesh; class LimitBoneWeightsTest; -namespace Assimp -{ +namespace Assimp { // NOTE: If you change these limits, don't forget to change the // corresponding values in all Assimp ports @@ -72,14 +72,11 @@ namespace Assimp * The other weights on this bone are then renormalized to assure the sum weight * to be 1. */ -class ASSIMP_API LimitBoneWeightsProcess : public BaseProcess -{ +class ASSIMP_API LimitBoneWeightsProcess : public BaseProcess { public: - LimitBoneWeightsProcess(); ~LimitBoneWeightsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -96,8 +93,6 @@ public: */ void SetupProperties(const Importer* pImp); -public: - // ------------------------------------------------------------------- /** Limits the bone weight count for all vertices in the given mesh. * @param pMesh The mesh to process. @@ -111,34 +106,29 @@ public: */ void Execute( aiScene* pScene); - -public: - // ------------------------------------------------------------------- /** Describes a bone weight on a vertex */ - struct Weight - { + struct Weight { unsigned int mBone; ///< Index of the bone float mWeight; ///< Weight of that bone on this vertex Weight() AI_NO_EXCEPT : mBone(0) - , mWeight(0.0f) - { } + , mWeight(0.0f) { + // empty + } Weight( unsigned int pBone, float pWeight) - { - mBone = pBone; - mWeight = pWeight; + : mBone(pBone) + , mWeight(pWeight) { + // empty } /** Comparison operator to sort bone weights by descending weight */ - bool operator < (const Weight& pWeight) const - { + bool operator < (const Weight& pWeight) const { return mWeight > pWeight.mWeight; } }; -public: /** Maximum number of bones influencing any single vertex. */ unsigned int mMaxWeights; }; diff --git a/thirdparty/assimp/code/MakeVerboseFormat.cpp b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.cpp index 50ff5ed93d..50ff5ed93d 100644 --- a/thirdparty/assimp/code/MakeVerboseFormat.cpp +++ b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.cpp diff --git a/thirdparty/assimp/code/MakeVerboseFormat.h b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.h index d12db63ae1..1adf8e2f69 100644 --- a/thirdparty/assimp/code/MakeVerboseFormat.h +++ b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.h @@ -46,7 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MAKEVERBOSEFORMAT_H_INC #define AI_MAKEVERBOSEFORMAT_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + struct aiMesh; namespace Assimp { diff --git a/thirdparty/assimp/code/OptimizeGraph.cpp b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.cpp index add9ab79e1..5db51f58b6 100644 --- a/thirdparty/assimp/code/OptimizeGraph.cpp +++ b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/thirdparty/assimp/code/OptimizeGraph.h b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.h index e5bbed7679..82cc5db3fe 100644 --- a/thirdparty/assimp/code/OptimizeGraph.h +++ b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.h @@ -46,13 +46,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_OPTIMIZEGRAPHPROCESS_H_INC #define AI_OPTIMIZEGRAPHPROCESS_H_INC -#include "BaseProcess.h" -#include "ProcessHelper.h" +#include "Common/BaseProcess.h" +#include "PostProcessing/ProcessHelper.h" + #include <assimp/types.h> + #include <set> +// Forward declarations struct aiMesh; + class OptimizeGraphProcessTest; + namespace Assimp { // ----------------------------------------------------------------------------- @@ -64,14 +69,11 @@ namespace Assimp { * @see aiProcess_OptimizeGraph for a detailed description of the * algorithm being applied. */ -class OptimizeGraphProcess : public BaseProcess -{ +class OptimizeGraphProcess : public BaseProcess { public: - OptimizeGraphProcess(); ~OptimizeGraphProcess(); -public: // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; @@ -81,14 +83,12 @@ public: // ------------------------------------------------------------------- void SetupProperties(const Importer* pImp); - // ------------------------------------------------------------------- /** @brief Add a list of node names to be locked and not modified. * @param in List of nodes. See #AI_CONFIG_PP_OG_EXCLUDE_LIST for * format explanations. */ - inline void AddLockedNodeList(std::string& in) - { + inline void AddLockedNodeList(std::string& in) { ConvertListToStrings (in,locked_nodes); } @@ -96,8 +96,7 @@ public: /** @brief Add another node to be locked and not modified. * @param name Name to be locked */ - inline void AddLockedNode(std::string& name) - { + inline void AddLockedNode(std::string& name) { locked_nodes.push_back(name); } @@ -105,25 +104,21 @@ public: /** @brief Remove a node from the list of locked nodes. * @param name Name to be unlocked */ - inline void RemoveLockedNode(std::string& name) - { + inline void RemoveLockedNode(std::string& name) { locked_nodes.remove(name); } protected: - void CollectNewChildren(aiNode* nd, std::list<aiNode*>& nodes); void FindInstancedMeshes (aiNode* pNode); private: - #ifdef AI_OG_USE_HASHING typedef std::set<unsigned int> LockedSetType; #else typedef std::set<std::string> LockedSetType; #endif - //! Scene we're working with aiScene* mScene; diff --git a/thirdparty/assimp/code/OptimizeMeshes.cpp b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.cpp index 3f6765f6ca..3f6765f6ca 100644 --- a/thirdparty/assimp/code/OptimizeMeshes.cpp +++ b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.cpp diff --git a/thirdparty/assimp/code/OptimizeMeshes.h b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.h index 9f46f349b4..dec4ab52de 100644 --- a/thirdparty/assimp/code/OptimizeMeshes.h +++ b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.h @@ -46,8 +46,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_OPTIMIZEMESHESPROCESS_H_INC #define AI_OPTIMIZEMESHESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> + #include <vector> struct aiMesh; @@ -64,16 +66,14 @@ namespace Assimp { * * @note Instanced meshes are currently not processed. */ -class OptimizeMeshesProcess : public BaseProcess -{ +class OptimizeMeshesProcess : public BaseProcess { public: /// @brief The class constructor. OptimizeMeshesProcess(); - /// @brief The class destcructor, + /// @brief The class destructor. ~OptimizeMeshesProcess(); - /** @brief Internal utility to store additional mesh info */ struct MeshInfo { diff --git a/thirdparty/assimp/code/PretransformVertices.cpp b/thirdparty/assimp/code/PostProcessing/PretransformVertices.cpp index 52001a0578..52001a0578 100644 --- a/thirdparty/assimp/code/PretransformVertices.cpp +++ b/thirdparty/assimp/code/PostProcessing/PretransformVertices.cpp diff --git a/thirdparty/assimp/code/PretransformVertices.h b/thirdparty/assimp/code/PostProcessing/PretransformVertices.h index b7329af130..b2982951e0 100644 --- a/thirdparty/assimp/code/PretransformVertices.h +++ b/thirdparty/assimp/code/PostProcessing/PretransformVertices.h @@ -47,13 +47,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_PRETRANSFORMVERTICES_H_INC #define AI_PRETRANSFORMVERTICES_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> + #include <list> #include <vector> +// Forward declarations struct aiNode; + class PretransformVerticesTest; + namespace Assimp { // --------------------------------------------------------------------------- @@ -80,10 +85,10 @@ public: // ------------------------------------------------------------------- /** @brief Toggle the 'keep hierarchy' option - * @param d hm ... difficult to guess what this means, hu!? + * @param keep true for keep configuration. */ - void KeepHierarchy(bool d) { - configKeepHierarchy = d; + void KeepHierarchy(bool keep) { + configKeepHierarchy = keep; } // ------------------------------------------------------------------- @@ -148,8 +153,6 @@ private: // Build reference counters for all meshes void BuildMeshRefCountArray(aiNode* nd, unsigned int * refs); - - //! Configuration option: keep scene hierarchy as long as possible bool configKeepHierarchy; bool configNormalize; diff --git a/thirdparty/assimp/code/ProcessHelper.cpp b/thirdparty/assimp/code/PostProcessing/ProcessHelper.cpp index 59869fdff7..59869fdff7 100644 --- a/thirdparty/assimp/code/ProcessHelper.cpp +++ b/thirdparty/assimp/code/PostProcessing/ProcessHelper.cpp diff --git a/thirdparty/assimp/code/ProcessHelper.h b/thirdparty/assimp/code/PostProcessing/ProcessHelper.h index c59f3217bf..0afcc41420 100644 --- a/thirdparty/assimp/code/ProcessHelper.h +++ b/thirdparty/assimp/code/PostProcessing/ProcessHelper.h @@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/scene.h> #include <assimp/SpatialSort.h> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/ParsingUtils.h> #include <list> diff --git a/thirdparty/assimp/code/RemoveRedundantMaterials.cpp b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.cpp index 632bdca3fe..49ec8f5c47 100644 --- a/thirdparty/assimp/code/RemoveRedundantMaterials.cpp +++ b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -49,7 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "RemoveRedundantMaterials.h" #include <assimp/ParsingUtils.h> #include "ProcessHelper.h" -#include "MaterialSystem.h" +#include "Material/MaterialSystem.h" #include <stdio.h> using namespace Assimp; @@ -57,7 +57,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() -: configFixedMaterials() { +: mConfigFixedMaterials() { // nothing to do here } @@ -80,7 +80,7 @@ bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) { // Get value of AI_CONFIG_PP_RRM_EXCLUDE_LIST - configFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); + mConfigFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); } // ------------------------------------------------------------------------------------------------ @@ -100,10 +100,10 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // If a list of materials to be excluded was given, match the list with // our imported materials and 'salt' all positive matches to ensure that // we get unique hashes later. - if (configFixedMaterials.length()) { + if (mConfigFixedMaterials.length()) { std::list<std::string> strings; - ConvertListToStrings(configFixedMaterials,strings); + ConvertListToStrings(mConfigFixedMaterials,strings); for (unsigned int i = 0; i < pScene->mNumMaterials;++i) { aiMaterial* mat = pScene->mMaterials[i]; diff --git a/thirdparty/assimp/code/RemoveRedundantMaterials.h b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.h index dbd4d44cc0..1f32a0abfb 100644 --- a/thirdparty/assimp/code/RemoveRedundantMaterials.h +++ b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_REMOVEREDUNDANTMATERIALS_H_INC #define AI_REMOVEREDUNDANTMATERIALS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> class RemoveRedundantMatsTest; @@ -57,8 +57,7 @@ namespace Assimp { /** RemoveRedundantMatsProcess: Post-processing step to remove redundant * materials from the imported scene. */ -class ASSIMP_API RemoveRedundantMatsProcess : public BaseProcess -{ +class ASSIMP_API RemoveRedundantMatsProcess : public BaseProcess { public: /// The default class constructor. RemoveRedundantMatsProcess(); @@ -66,7 +65,6 @@ public: /// The class destructor. ~RemoveRedundantMatsProcess(); -public: // ------------------------------------------------------------------- // Check whether step is active bool IsActive( unsigned int pFlags) const; @@ -79,27 +77,25 @@ public: // Setup import settings void SetupProperties(const Importer* pImp); - // ------------------------------------------------------------------- - /** @brief Set list of fixed (unmutable) materials + /** @brief Set list of fixed (inmutable) materials * @param fixed See #AI_CONFIG_PP_RRM_EXCLUDE_LIST */ void SetFixedMaterialsString(const std::string& fixed = "") { - configFixedMaterials = fixed; + mConfigFixedMaterials = fixed; } // ------------------------------------------------------------------- - /** @brief Get list of fixed (unmutable) materials + /** @brief Get list of fixed (inmutable) materials * @return See #AI_CONFIG_PP_RRM_EXCLUDE_LIST */ const std::string& GetFixedMaterialsString() const { - return configFixedMaterials; + return mConfigFixedMaterials; } private: - //! Configuration option: list of all fixed materials - std::string configFixedMaterials; + std::string mConfigFixedMaterials; }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/RemoveVCProcess.cpp b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.cpp index 99fd47a3aa..99fd47a3aa 100644 --- a/thirdparty/assimp/code/RemoveVCProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.cpp diff --git a/thirdparty/assimp/code/RemoveVCProcess.h b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.h index 617d7b9b20..7bb21a8330 100644 --- a/thirdparty/assimp/code/RemoveVCProcess.h +++ b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.h @@ -44,7 +44,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_REMOVEVCPROCESS_H_INCLUDED #define AI_REMOVEVCPROCESS_H_INCLUDED -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> class RemoveVCProcessTest; diff --git a/thirdparty/assimp/code/ScaleProcess.cpp b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp index 6d458c4b11..6d458c4b11 100644 --- a/thirdparty/assimp/code/ScaleProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp diff --git a/thirdparty/assimp/code/ScaleProcess.h b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h index 55146ae064..2567378759 100644 --- a/thirdparty/assimp/code/ScaleProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h @@ -41,7 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiNode; diff --git a/thirdparty/assimp/code/SortByPTypeProcess.cpp b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.cpp index 2e0cc54004..be8405a17b 100644 --- a/thirdparty/assimp/code/SortByPTypeProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.cpp @@ -57,8 +57,8 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer SortByPTypeProcess::SortByPTypeProcess() -{ - configRemoveMeshes = 0; +: mConfigRemoveMeshes( 0 ) { + // empty } // ------------------------------------------------------------------------------------------------ @@ -78,7 +78,7 @@ bool SortByPTypeProcess::IsActive( unsigned int pFlags) const // ------------------------------------------------------------------------------------------------ void SortByPTypeProcess::SetupProperties(const Importer* pImp) { - configRemoveMeshes = pImp->GetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE,0); + mConfigRemoveMeshes = pImp->GetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE,0); } // ------------------------------------------------------------------------------------------------ @@ -172,7 +172,7 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { } if (1 == num) { - if (!(configRemoveMeshes & mesh->mPrimitiveTypes)) { + if (!(mConfigRemoveMeshes & mesh->mPrimitiveTypes)) { *meshIdx = static_cast<unsigned int>( outMeshes.size() ); outMeshes.push_back(mesh); } else { @@ -206,7 +206,7 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { VertexWeightTable* avw = ComputeVertexBoneWeightTable(mesh); for (unsigned int real = 0; real < 4; ++real,++meshIdx) { - if ( !aiNumPerPType[real] || configRemoveMeshes & (1u << real)) + if ( !aiNumPerPType[real] || mConfigRemoveMeshes & (1u << real)) { continue; } @@ -392,10 +392,10 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { { char buffer[1024]; ::ai_snprintf(buffer,1024,"Points: %u%s, Lines: %u%s, Triangles: %u%s, Polygons: %u%s (Meshes, X = removed)", - aiNumMeshesPerPType[0], ((configRemoveMeshes & aiPrimitiveType_POINT) ? "X" : ""), - aiNumMeshesPerPType[1], ((configRemoveMeshes & aiPrimitiveType_LINE) ? "X" : ""), - aiNumMeshesPerPType[2], ((configRemoveMeshes & aiPrimitiveType_TRIANGLE) ? "X" : ""), - aiNumMeshesPerPType[3], ((configRemoveMeshes & aiPrimitiveType_POLYGON) ? "X" : "")); + aiNumMeshesPerPType[0], ((mConfigRemoveMeshes & aiPrimitiveType_POINT) ? "X" : ""), + aiNumMeshesPerPType[1], ((mConfigRemoveMeshes & aiPrimitiveType_LINE) ? "X" : ""), + aiNumMeshesPerPType[2], ((mConfigRemoveMeshes & aiPrimitiveType_TRIANGLE) ? "X" : ""), + aiNumMeshesPerPType[3], ((mConfigRemoveMeshes & aiPrimitiveType_POLYGON) ? "X" : "")); ASSIMP_LOG_INFO(buffer); ASSIMP_LOG_DEBUG("SortByPTypeProcess finished"); } diff --git a/thirdparty/assimp/code/SortByPTypeProcess.h b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.h index c9d9924d8f..1d7ccfc152 100644 --- a/thirdparty/assimp/code/SortByPTypeProcess.h +++ b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.h @@ -45,10 +45,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_SORTBYPTYPEPROCESS_H_INC #define AI_SORTBYPTYPEPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> class SortByPTypeProcessTest; + namespace Assimp { @@ -57,14 +58,11 @@ namespace Assimp { * A mesh with 5 lines, 3 points and 145 triangles would be split in 3 * submeshes. */ -class ASSIMP_API SortByPTypeProcess : public BaseProcess -{ +class ASSIMP_API SortByPTypeProcess : public BaseProcess { public: - SortByPTypeProcess(); ~SortByPTypeProcess(); -public: // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; @@ -75,8 +73,7 @@ public: void SetupProperties(const Importer* pImp); private: - - int configRemoveMeshes; + int mConfigRemoveMeshes; }; diff --git a/thirdparty/assimp/code/SplitLargeMeshes.cpp b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.cpp index 1797b28d5a..1797b28d5a 100644 --- a/thirdparty/assimp/code/SplitLargeMeshes.cpp +++ b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.cpp diff --git a/thirdparty/assimp/code/SplitLargeMeshes.h b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.h index 77f089ce7e..3f90576ea9 100644 --- a/thirdparty/assimp/code/SplitLargeMeshes.h +++ b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -40,21 +39,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Defines a post processing step to split large meshes into submeshes +/** @file Defines a post processing step to split large meshes into sub-meshes */ #ifndef AI_SPLITLARGEMESHES_H_INC #define AI_SPLITLARGEMESHES_H_INC #include <vector> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> #include <assimp/scene.h> +// Forward declarations class SplitLargeMeshesTest; -namespace Assimp -{ +namespace Assimp { class SplitLargeMeshesProcess_Triangle; class SplitLargeMeshesProcess_Vertex; diff --git a/thirdparty/assimp/code/TextureTransform.cpp b/thirdparty/assimp/code/PostProcessing/TextureTransform.cpp index 8ae2ba7218..8ae2ba7218 100644 --- a/thirdparty/assimp/code/TextureTransform.cpp +++ b/thirdparty/assimp/code/PostProcessing/TextureTransform.cpp diff --git a/thirdparty/assimp/code/TextureTransform.h b/thirdparty/assimp/code/PostProcessing/TextureTransform.h index c556ff5d8c..2a5d623d7f 100644 --- a/thirdparty/assimp/code/TextureTransform.h +++ b/thirdparty/assimp/code/PostProcessing/TextureTransform.h @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_TEXTURE_TRANSFORM_H_INCLUDED #include <assimp/BaseImporter.h> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/material.h> #include <list> diff --git a/thirdparty/assimp/code/TriangulateProcess.cpp b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.cpp index 0f68f47ddb..1040836bbe 100644 --- a/thirdparty/assimp/code/TriangulateProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -60,9 +58,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * a file */ #ifndef ASSIMP_BUILD_NO_TRIANGULATE_PROCESS -#include "TriangulateProcess.h" -#include "ProcessHelper.h" -#include "PolyTools.h" + +#include "PostProcessing/TriangulateProcess.h" +#include "PostProcessing/ProcessHelper.h" +#include "Common/PolyTools.h" + #include <memory> //#define AI_BUILD_TRIANGULATE_COLOR_FACE_WINDING diff --git a/thirdparty/assimp/code/TriangulateProcess.h b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.h index 47bd2115ad..916b5103dd 100644 --- a/thirdparty/assimp/code/TriangulateProcess.h +++ b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_TRIANGULATEPROCESS_H_INC #define AI_TRIANGULATEPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; @@ -59,14 +59,11 @@ namespace Assimp { * into triangles. You usually want this to happen because the graphics cards * need their data as triangles. */ -class ASSIMP_API TriangulateProcess : public BaseProcess -{ +class ASSIMP_API TriangulateProcess : public BaseProcess { public: - TriangulateProcess(); ~TriangulateProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise @@ -82,7 +79,6 @@ public: */ void Execute( aiScene* pScene); -public: // ------------------------------------------------------------------- /** Triangulates the given mesh. * @param pMesh The mesh to triangulate. diff --git a/thirdparty/assimp/code/ValidateDataStructure.cpp b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.cpp index 657b0361b7..712fd6943d 100644 --- a/thirdparty/assimp/code/ValidateDataStructure.cpp +++ b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.cpp @@ -46,8 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * the data structure returned by Assimp. */ - - // internal headers #include "ValidateDataStructure.h" #include <assimp/BaseImporter.h> @@ -110,8 +108,8 @@ void ValidateDSProcess::ReportWarning(const char* msg,...) } // ------------------------------------------------------------------------------------------------ -inline int HasNameMatch(const aiString& in, aiNode* node) -{ +inline +int HasNameMatch(const aiString& in, aiNode* node) { int result = (node->mName == in ? 1 : 0 ); for (unsigned int i = 0; i < node->mNumChildren;++i) { result += HasNameMatch(in,node->mChildren[i]); @@ -121,9 +119,8 @@ inline int HasNameMatch(const aiString& in, aiNode* node) // ------------------------------------------------------------------------------------------------ template <typename T> -inline void ValidateDSProcess::DoValidation(T** parray, unsigned int size, - const char* firstName, const char* secondName) -{ +inline +void ValidateDSProcess::DoValidation(T** parray, unsigned int size, const char* firstName, const char* secondName) { // validate all entries if (size) { @@ -181,7 +178,8 @@ inline void ValidateDSProcess::DoValidationEx(T** parray, unsigned int size, // ------------------------------------------------------------------------------------------------ template <typename T> inline -void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, const char* secondName) { +void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, + const char* secondName) { // validate all entries DoValidationEx(array,size,firstName,secondName); @@ -201,9 +199,8 @@ void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void ValidateDSProcess::Execute( aiScene* pScene) -{ - this->mScene = pScene; +void ValidateDSProcess::Execute( aiScene* pScene) { + mScene = pScene; ASSIMP_LOG_DEBUG("ValidateDataStructureProcess begin"); // validate the node graph of the scene @@ -516,13 +513,11 @@ void ValidateDSProcess::Validate( const aiMesh* pMesh) } // ------------------------------------------------------------------------------------------------ -void ValidateDSProcess::Validate( const aiMesh* pMesh, - const aiBone* pBone,float* afSum) -{ +void ValidateDSProcess::Validate( const aiMesh* pMesh, const aiBone* pBone,float* afSum) { this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - ReportError("aiBone::mNumWeights is zero"); + //ReportError("aiBone::mNumWeights is zero"); } // check whether all vertices affected by this bone are valid @@ -563,9 +558,6 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation) else { ReportError("aiAnimation::mNumChannels is 0. At least one node animation channel must be there."); } - - // Animation duration is allowed to be zero in cases where the anim contains only a single key frame. - // if (!pAnimation->mDuration)this->ReportError("aiAnimation::mDuration is zero"); } // ------------------------------------------------------------------------------------------------ @@ -746,8 +738,9 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) "AI_MATKEY_SHININESS_STRENGTH key is 0.0"); } break; - default: ; - }; + default: + break; + } } if (AI_SUCCESS == aiGetMaterialFloat( pMaterial,AI_MATKEY_OPACITY,&fTemp) && (!fTemp || fTemp > 1.01)) { diff --git a/thirdparty/assimp/code/ValidateDataStructure.h b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.h index bd21e88545..0b891ef414 100644 --- a/thirdparty/assimp/code/ValidateDataStructure.h +++ b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.h @@ -48,7 +48,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/types.h> #include <assimp/material.h> -#include "BaseProcess.h" + +#include "Common/BaseProcess.h" struct aiBone; struct aiMesh; diff --git a/thirdparty/assimp/code/RawLoader.cpp b/thirdparty/assimp/code/RawLoader.cpp deleted file mode 100644 index d0da247e47..0000000000 --- a/thirdparty/assimp/code/RawLoader.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -/** @file RawLoader.cpp - * @brief Implementation of the RAW importer class - */ - - -#ifndef ASSIMP_BUILD_NO_RAW_IMPORTER - -// internal headers -#include "RawLoader.h" -#include <assimp/ParsingUtils.h> -#include <assimp/fast_atof.h> -#include <memory> -#include <assimp/IOSystem.hpp> -#include <assimp/DefaultLogger.hpp> -#include <assimp/scene.h> -#include <assimp/importerdesc.h> - -using namespace Assimp; - -static const aiImporterDesc desc = { - "Raw Importer", - "", - "", - "", - aiImporterFlags_SupportTextFlavour, - 0, - 0, - 0, - 0, - "raw" -}; - -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -RAWImporter::RAWImporter() -{} - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -RAWImporter::~RAWImporter() -{} - -// ------------------------------------------------------------------------------------------------ -// Returns whether the class can handle the format of the given file. -bool RAWImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const -{ - return SimpleExtensionCheck(pFile,"raw"); -} - -// ------------------------------------------------------------------------------------------------ -const aiImporterDesc* RAWImporter::GetInfo () const -{ - return &desc; -} - -// ------------------------------------------------------------------------------------------------ -// Imports the given file into the given scene structure. -void RAWImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ - std::unique_ptr<IOStream> file( pIOHandler->Open( pFile, "rb")); - - // Check whether we can read from the file - if( file.get() == NULL) { - throw DeadlyImportError( "Failed to open RAW file " + pFile + "."); - } - - // allocate storage and copy the contents of the file to a memory buffer - // (terminate it with zero) - std::vector<char> mBuffer2; - TextFileToBuffer(file.get(),mBuffer2); - const char* buffer = &mBuffer2[0]; - - // list of groups loaded from the file - std::vector< GroupInformation > outGroups(1,GroupInformation("<default>")); - std::vector< GroupInformation >::iterator curGroup = outGroups.begin(); - - // now read all lines - char line[4096]; - while (GetNextLine(buffer,line)) - { - // if the line starts with a non-numeric identifier, it marks - // the beginning of a new group - const char* sz = line;SkipSpaces(&sz); - if (IsLineEnd(*sz))continue; - if (!IsNumeric(*sz)) - { - const char* sz2 = sz; - while (!IsSpaceOrNewLine(*sz2))++sz2; - const unsigned int length = (unsigned int)(sz2-sz); - - // find an existing group with this name - for (std::vector< GroupInformation >::iterator it = outGroups.begin(), end = outGroups.end(); - it != end;++it) - { - if (length == (*it).name.length() && !::strcmp(sz,(*it).name.c_str())) - { - curGroup = it;sz2 = NULL; - break; - } - } - if (sz2) - { - outGroups.push_back(GroupInformation(std::string(sz,length))); - curGroup = outGroups.end()-1; - } - } - else - { - // there can be maximally 12 floats plus an extra texture file name - float data[12]; - unsigned int num; - for (num = 0; num < 12;++num) - { - if(!SkipSpaces(&sz) || !IsNumeric(*sz))break; - sz = fast_atoreal_move<float>(sz,data[num]); - } - if (num != 12 && num != 9) - { - ASSIMP_LOG_ERROR("A line may have either 9 or 12 floats and an optional texture"); - continue; - } - - MeshInformation* output = NULL; - - const char* sz2 = sz; - unsigned int length; - if (!IsLineEnd(*sz)) - { - while (!IsSpaceOrNewLine(*sz2))++sz2; - length = (unsigned int)(sz2-sz); - } - else if (9 == num) - { - sz = "%default%"; - length = 9; - } - else - { - sz = ""; - length = 0; - } - - // search in the list of meshes whether we have one with this texture - for (auto &mesh : (*curGroup).meshes) - { - if (length == mesh.name.length() && (length ? !::strcmp(sz, mesh.name.c_str()) : true)) - { - output = &mesh; - break; - } - } - // if we don't have the mesh, create it - if (!output) - { - (*curGroup).meshes.push_back(MeshInformation(std::string(sz,length))); - output = &((*curGroup).meshes.back()); - } - if (12 == num) - { - aiColor4D v(data[0],data[1],data[2],1.0f); - output->colors.push_back(v); - output->colors.push_back(v); - output->colors.push_back(v); - - output->vertices.push_back(aiVector3D(data[3],data[4],data[5])); - output->vertices.push_back(aiVector3D(data[6],data[7],data[8])); - output->vertices.push_back(aiVector3D(data[9],data[10],data[11])); - } - else - { - output->vertices.push_back(aiVector3D(data[0],data[1],data[2])); - output->vertices.push_back(aiVector3D(data[3],data[4],data[5])); - output->vertices.push_back(aiVector3D(data[6],data[7],data[8])); - } - } - } - - pScene->mRootNode = new aiNode(); - pScene->mRootNode->mName.Set("<RawRoot>"); - - // count the number of valid groups - // (meshes can't be empty) - for (auto & outGroup : outGroups) - { - if (!outGroup.meshes.empty()) - { - ++pScene->mRootNode->mNumChildren; - pScene->mNumMeshes += (unsigned int) outGroup.meshes.size(); - } - } - - if (!pScene->mNumMeshes) - { - throw DeadlyImportError("RAW: No meshes loaded. The file seems to be corrupt or empty."); - } - - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; - aiNode** cc; - if (1 == pScene->mRootNode->mNumChildren) - { - cc = &pScene->mRootNode; - pScene->mRootNode->mNumChildren = 0; - } else { - cc = new aiNode*[pScene->mRootNode->mNumChildren]; - memset(cc, 0, sizeof(aiNode*) * pScene->mRootNode->mNumChildren); - pScene->mRootNode->mChildren = cc; - } - - pScene->mNumMaterials = pScene->mNumMeshes; - aiMaterial** mats = pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; - - unsigned int meshIdx = 0; - for (auto & outGroup : outGroups) - { - if (outGroup.meshes.empty())continue; - - aiNode* node; - if (pScene->mRootNode->mNumChildren) - { - node = *cc = new aiNode(); - node->mParent = pScene->mRootNode; - } - else node = *cc; - node->mName.Set(outGroup.name); - - // add all meshes - node->mNumMeshes = (unsigned int) outGroup.meshes.size(); - unsigned int* pi = node->mMeshes = new unsigned int[ node->mNumMeshes ]; - for (std::vector< MeshInformation >::iterator it2 = outGroup.meshes.begin(), - end2 = outGroup.meshes.end(); it2 != end2; ++it2) - { - ai_assert(!(*it2).vertices.empty()); - - // allocate the mesh - *pi++ = meshIdx; - aiMesh* mesh = pScene->mMeshes[meshIdx] = new aiMesh(); - mesh->mMaterialIndex = meshIdx++; - - mesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; - - // allocate storage for the vertex components and copy them - mesh->mNumVertices = (unsigned int)(*it2).vertices.size(); - mesh->mVertices = new aiVector3D[ mesh->mNumVertices ]; - ::memcpy(mesh->mVertices,&(*it2).vertices[0],sizeof(aiVector3D)*mesh->mNumVertices); - - if ((*it2).colors.size()) - { - ai_assert((*it2).colors.size() == mesh->mNumVertices); - - mesh->mColors[0] = new aiColor4D[ mesh->mNumVertices ]; - ::memcpy(mesh->mColors[0],&(*it2).colors[0],sizeof(aiColor4D)*mesh->mNumVertices); - } - - // generate triangles - ai_assert(0 == mesh->mNumVertices % 3); - aiFace* fc = mesh->mFaces = new aiFace[ mesh->mNumFaces = mesh->mNumVertices/3 ]; - aiFace* const fcEnd = fc + mesh->mNumFaces; - unsigned int n = 0; - while (fc != fcEnd) - { - aiFace& f = *fc++; - f.mIndices = new unsigned int[f.mNumIndices = 3]; - for (unsigned int m = 0; m < 3;++m) - f.mIndices[m] = n++; - } - - // generate a material for the mesh - aiMaterial* mat = new aiMaterial(); - - aiColor4D clr(1.0f,1.0f,1.0f,1.0f); - if ("%default%" == (*it2).name) // a gray default material - { - clr.r = clr.g = clr.b = 0.6f; - } - else if ((*it2).name.length() > 0) // a texture - { - aiString s; - s.Set((*it2).name); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(0)); - } - mat->AddProperty<aiColor4D>(&clr,1,AI_MATKEY_COLOR_DIFFUSE); - *mats++ = mat; - } - } -} - -#endif // !! ASSIMP_BUILD_NO_RAW_IMPORTER diff --git a/thirdparty/assimp/include/assimp/Exporter.hpp b/thirdparty/assimp/include/assimp/Exporter.hpp index bf0096e7e9..ea0303e804 100644 --- a/thirdparty/assimp/include/assimp/Exporter.hpp +++ b/thirdparty/assimp/include/assimp/Exporter.hpp @@ -190,7 +190,7 @@ public: * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ const aiExportDataBlob* ExportToBlob(const aiScene* pScene, const char* pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* = nullptr); + unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); diff --git a/thirdparty/assimp/include/assimp/ParsingUtils.h b/thirdparty/assimp/include/assimp/ParsingUtils.h index ca30ce13b0..6b9574fc67 100644 --- a/thirdparty/assimp/include/assimp/ParsingUtils.h +++ b/thirdparty/assimp/include/assimp/ParsingUtils.h @@ -196,8 +196,7 @@ bool GetNextLine( const char_t*& buffer, char_t out[ BufferSize ] ) { // --------------------------------------------------------------------------------- template <class char_t> -AI_FORCE_INLINE bool IsNumeric( char_t in) -{ +AI_FORCE_INLINE bool IsNumeric( char_t in) { return ( in >= '0' && in <= '9' ) || '-' == in || '+' == in; } diff --git a/thirdparty/assimp/include/assimp/aabb.h b/thirdparty/assimp/include/assimp/aabb.h new file mode 100644 index 0000000000..a20f317424 --- /dev/null +++ b/thirdparty/assimp/include/assimp/aabb.h @@ -0,0 +1,76 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#pragma once +#ifndef AI_AABB_H_INC +#define AI_AABB_H_INC + +#include <assimp/vector3.h> + +struct aiAABB { + C_STRUCT aiVector3D mMin; + C_STRUCT aiVector3D mMax; + +#ifdef __cplusplus + + aiAABB() + : mMin() + , mMax() { + // empty + } + + aiAABB(const aiVector3D &min, const aiVector3D &max ) + : mMin(min) + , mMax(max) { + // empty + } + + ~aiAABB() { + // empty + } + +#endif +}; + + +#endif diff --git a/thirdparty/assimp/include/assimp/camera.h b/thirdparty/assimp/include/assimp/camera.h index 99daf69934..e573eea5d1 100644 --- a/thirdparty/assimp/include/assimp/camera.h +++ b/thirdparty/assimp/include/assimp/camera.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -60,7 +58,7 @@ extern "C" { * * Cameras have a representation in the node graph and can be animated. * An important aspect is that the camera itself is also part of the - * scenegraph. This means, any values such as the look-at vector are not + * scene-graph. This means, any values such as the look-at vector are not * *absolute*, they're <b>relative</b> to the coordinate system defined * by the node which corresponds to the camera. This allows for camera * animations. For static cameras parameters like the 'look-at' or 'up' vectors @@ -162,7 +160,6 @@ struct aiCamera */ float mClipPlaneFar; - /** Screen aspect ratio. * * This is the ration between the width and the height of the diff --git a/thirdparty/assimp/include/assimp/color4.inl b/thirdparty/assimp/include/assimp/color4.inl index 3192d55f39..afa53dcb5b 100644 --- a/thirdparty/assimp/include/assimp/color4.inl +++ b/thirdparty/assimp/include/assimp/color4.inl @@ -85,6 +85,8 @@ AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const { return g; case 2: return b; + case 3: + return a; default: break; } @@ -100,6 +102,8 @@ AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) { return g; case 2: return b; + case 3: + return a; default: break; } diff --git a/thirdparty/assimp/include/assimp/config.h.in b/thirdparty/assimp/include/assimp/config.h.in index a37ff0b8c8..d08b929a10 100644 --- a/thirdparty/assimp/include/assimp/config.h.in +++ b/thirdparty/assimp/include/assimp/config.h.in @@ -142,7 +142,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @brief Specifies the maximum angle that may be between two vertex tangents * that their tangents and bi-tangents are smoothed. * - * This applies to the CalcTangentSpace-Step. The angle is specified + * This applies to the CalcTangentSpace-Step. TFvhe angle is specified * in degrees. The maximum value is 175. * Property type: float. Default value: 45 degrees */ @@ -651,13 +651,28 @@ enum aiComponent // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will use the legacy embedded texture naming. -* -* The default value is false (0) -* Property type: bool -*/ + * + * The default value is false (0) + * Property type: bool + */ #define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \ "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" - + +// --------------------------------------------------------------------------- +/** @brief Set wether the importer shall not remove empty bones. + * + * Empty bone are often used to define connections for other models. + */ +#define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ + "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + + +// --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall convert the unit from cm to m. + */ +#define AI_CONFIG_FBX_CONVERT_TO_M \ + "AI_CONFIG_FBX_CONVERT_TO_M" + // --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * @@ -966,8 +981,12 @@ enum aiComponent #define AI_CONFIG_EXPORT_XFILE_64BIT "EXPORT_XFILE_64BIT" -/** - * +/** @brief Specifies whether the assimp export shall be able to export point clouds + * + * When this flag is not defined the render data has to contain valid faces. + * Point clouds are only a collection of vertices which have nor spatial organization + * by a face and the validation process will remove them. Enabling this feature will + * switch off the flag and enable the functionality to export pure point clouds. */ #define AI_CONFIG_EXPORT_POINT_CLOUDS "EXPORT_POINT_CLOUDS" diff --git a/thirdparty/assimp/include/assimp/defs.h b/thirdparty/assimp/include/assimp/defs.h index 4a177e3c3e..05a5e3fd4b 100644 --- a/thirdparty/assimp/include/assimp/defs.h +++ b/thirdparty/assimp/include/assimp/defs.h @@ -122,7 +122,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * OPTIMIZEANIMS * OPTIMIZEGRAPH * GENENTITYMESHES - * FIXTEXTUREPATHS */ + * FIXTEXTUREPATHS + * GENBOUNDINGBOXES */ ////////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER @@ -214,10 +215,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #if (defined(__BORLANDC__) || defined (__BCPLUSPLUS__)) -#error Currently, Borland is unsupported. Feel free to port Assimp. - -// "W8059 Packgröße der Struktur geändert" - +# error Currently, Borland is unsupported. Feel free to port Assimp. #endif @@ -243,10 +241,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. typedef double ai_real; typedef signed long long int ai_int; typedef unsigned long long int ai_uint; +#ifndef ASSIMP_AI_REAL_TEXT_PRECISION +#define ASSIMP_AI_REAL_TEXT_PRECISION 16 +#endif // ASSIMP_AI_REAL_TEXT_PRECISION #else // ASSIMP_DOUBLE_PRECISION typedef float ai_real; typedef signed int ai_int; typedef unsigned int ai_uint; +#ifndef ASSIMP_AI_REAL_TEXT_PRECISION +#define ASSIMP_AI_REAL_TEXT_PRECISION 8 +#endif // ASSIMP_AI_REAL_TEXT_PRECISION #endif // ASSIMP_DOUBLE_PRECISION ////////////////////////////////////////////////////////////////////////// @@ -267,6 +271,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_DEG_TO_RAD(x) ((x)*(ai_real)0.0174532925) #define AI_RAD_TO_DEG(x) ((x)*(ai_real)57.2957795) +/* Numerical limits */ +static const ai_real ai_epsilon = (ai_real) 0.00001; + /* Support for big-endian builds */ #if defined(__BYTE_ORDER__) # if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) @@ -293,11 +300,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef _MSC_VER # define AI_NO_EXCEPT noexcept #else -# if (_MSC_VER == 1915 ) +# if (_MSC_VER >= 1915 ) # define AI_NO_EXCEPT noexcept # else # define AI_NO_EXCEPT # endif -#endif +#endif // _MSC_VER #endif // !! AI_DEFINES_H_INC diff --git a/thirdparty/assimp/include/assimp/mesh.h b/thirdparty/assimp/include/assimp/mesh.h index 36f3ed2afd..f1628f1f54 100644 --- a/thirdparty/assimp/include/assimp/mesh.h +++ b/thirdparty/assimp/include/assimp/mesh.h @@ -48,7 +48,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MESH_H_INC #define AI_MESH_H_INC -#include "types.h" +#include <assimp/types.h> +#include <assimp/aabb.h> #ifdef __cplusplus extern "C" { @@ -714,6 +715,11 @@ struct aiMesh * Method of morphing when animeshes are specified. */ unsigned int mMethod; + + /** + * + */ + C_STRUCT aiAABB mAABB; #ifdef __cplusplus @@ -735,7 +741,8 @@ struct aiMesh , mMaterialIndex( 0 ) , mNumAnimMeshes( 0 ) , mAnimMeshes(nullptr) - , mMethod( 0 ) { + , mMethod( 0 ) + , mAABB() { for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) { mNumUVComponents[a] = 0; mTextureCoords[a] = nullptr; diff --git a/thirdparty/assimp/include/assimp/postprocess.h b/thirdparty/assimp/include/assimp/postprocess.h index c23a5490a5..2a74414216 100644 --- a/thirdparty/assimp/include/assimp/postprocess.h +++ b/thirdparty/assimp/include/assimp/postprocess.h @@ -438,7 +438,7 @@ enum aiPostProcessSteps aiProcess_FindInstances = 0x100000, // ------------------------------------------------------------------------- - /** <hr>A postprocessing step to reduce the number of meshes. + /** <hr>A post-processing step to reduce the number of meshes. * * This will, in fact, reduce the number of draw calls. * @@ -450,7 +450,7 @@ enum aiPostProcessSteps // ------------------------------------------------------------------------- - /** <hr>A postprocessing step to optimize the scene hierarchy. + /** <hr>A post-processing step to optimize the scene hierarchy. * * Nodes without animations, bones, lights or cameras assigned are * collapsed and joined. @@ -514,7 +514,7 @@ enum aiPostProcessSteps // ------------------------------------------------------------------------- /** <hr>This step splits meshes with many bones into sub-meshes so that each - * su-bmesh has fewer or as many bones as a given limit. + * sub-mesh has fewer or as many bones as a given limit. */ aiProcess_SplitByBoneCount = 0x2000000, @@ -541,7 +541,7 @@ enum aiPostProcessSteps * global scaling from your importer settings like in FBX. Use the flag * AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY from the global property table to configure this. * - * Use <tt>#AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY</tt> to setup the global scaing factor. + * Use <tt>#AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY</tt> to setup the global scaling factor. */ aiProcess_GlobalScale = 0x8000000, @@ -574,6 +574,11 @@ enum aiPostProcessSteps * This process gives sense back to aiProcess_JoinIdenticalVertices */ aiProcess_DropNormals = 0x40000000, + + // ------------------------------------------------------------------------- + /** + */ + aiProcess_GenBoundingBoxes = 0x80000000 }; diff --git a/thirdparty/assimp/include/assimp/scene.h b/thirdparty/assimp/include/assimp/scene.h index de0239702d..e973f6c5b9 100644 --- a/thirdparty/assimp/include/assimp/scene.h +++ b/thirdparty/assimp/include/assimp/scene.h @@ -389,6 +389,14 @@ struct aiScene //! Returns an embedded texture const aiTexture* GetEmbeddedTexture(const char* filename) const { + // lookup using texture ID (if referenced like: "*1", "*2", etc.) + if ('*' == *filename) { + int index = std::atoi(filename + 1); + if (0 > index || mNumTextures <= static_cast<unsigned>(index)) + return nullptr; + return mTextures[index]; + } + // lookup using filename const char* shortFilename = GetShortFilename(filename); for (unsigned int i = 0; i < mNumTextures; i++) { const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str()); diff --git a/thirdparty/jpeg-compressor/jpgd.cpp b/thirdparty/jpeg-compressor/jpgd.cpp index fad9a37a9a..62fbd1b72d 100644 --- a/thirdparty/jpeg-compressor/jpgd.cpp +++ b/thirdparty/jpeg-compressor/jpgd.cpp @@ -29,6 +29,10 @@ #define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b)) #define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b)) +// TODO: Move to header and use these constants when declaring the arrays. +#define JPGD_HUFF_TREE_MAX_LENGTH 512 +#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256 + namespace jpgd { static inline void *jpgd_malloc(size_t nSize) { return malloc(nSize); } @@ -491,8 +495,9 @@ inline uint jpeg_decoder::get_bits_no_markers(int num_bits) // Decodes a Huffman encoded symbol. inline int jpeg_decoder::huff_decode(huff_tables *pH) { - int symbol; + JPGD_ASSERT(pH); + int symbol; // Check first 8-bits: do we have a complete symbol? if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) { @@ -500,14 +505,19 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH) int ofs = 23; do { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + symbol = pH->tree[idx]; ofs--; } while (symbol < 0); get_bits_no_markers(8 + (23 - ofs)); } else + { + JPGD_ASSERT(symbol < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); get_bits_no_markers(pH->code_size[symbol]); + } return symbol; } @@ -517,6 +527,8 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) { int symbol; + JPGD_ASSERT(pH); + // Check first 8-bits: do we have a complete symbol? if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) { @@ -524,7 +536,9 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) int ofs = 23; do { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + symbol = pH->tree[idx]; ofs--; } while (symbol < 0); @@ -1495,6 +1509,12 @@ void jpeg_decoder::fix_in_buffer() void jpeg_decoder::transform_mcu(int mcu_row) { jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; + if (m_freq_domain_chroma_upsample) { + JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_expanded_blocks_per_row); + } + else { + JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_max_blocks_per_row); + } uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) @@ -1650,6 +1670,7 @@ void jpeg_decoder::load_next_row() for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) { component_id = m_mcu_org[mcu_block]; + JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); q = m_quant[m_comp_quant[component_id]]; p = m_pMCU_coefficients + 64 * mcu_block; @@ -1770,6 +1791,7 @@ void jpeg_decoder::decode_next_row() for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) { int component_id = m_mcu_org[mcu_block]; + JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; int r, s; @@ -2229,7 +2251,10 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) for (l = 1; l <= 16; l++) { for (i = 1; i <= m_huff_num[index][l]; i++) + { + JPGD_ASSERT(p < 257); huffsize[p++] = static_cast<uint8>(l); + } } huffsize[p] = 0; @@ -2244,6 +2269,7 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) { while (huffsize[p] == si) { + JPGD_ASSERT(p < 257); huffcode[p++] = code; code++; } @@ -2275,7 +2301,8 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) for (l = 1 << (8 - code_size); l > 0; l--) { - JPGD_ASSERT(i < 256); + JPGD_ASSERT(i < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + JPGD_ASSERT(code < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); pH->look_up[code] = i; @@ -2325,16 +2352,19 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) if ((code & 0x8000) == 0) currententry--; - if (pH->tree[-currententry - 1] == 0) + unsigned int idx = -currententry - 1; + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + if (pH->tree[idx] == 0) { - pH->tree[-currententry - 1] = nextfreeentry; + pH->tree[idx] = nextfreeentry; currententry = nextfreeentry; nextfreeentry -= 2; } - else - currententry = pH->tree[-currententry - 1]; + else { + currententry = pH->tree[idx]; + } code <<= 1; } @@ -2636,7 +2666,9 @@ void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); + unsigned int idx = pD->m_comp_ac_tab[component_id]; + JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); r = s >> 4; s &= 15; @@ -2679,7 +2711,6 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in int p1 = 1 << pD->m_successive_low; int m1 = (-1) << pD->m_successive_low; jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - JPGD_ASSERT(pD->m_spectral_end <= 63); k = pD->m_spectral_start; @@ -2688,7 +2719,9 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in { for ( ; k <= pD->m_spectral_end; k++) { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); + unsigned int idx = pD->m_comp_ac_tab[component_id]; + JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); r = s >> 4; s &= 15; |